首页
社区
课程
招聘
[原创]向非ATTACH的DEVICE转发IRP(VIRTUALDISK)
发表于: 2009-1-14 21:11 9010

[原创]向非ATTACH的DEVICE转发IRP(VIRTUALDISK)

2009-1-14 21:11
9010

我的NO.2个贴子,发现很多人都关心驱动了,HOOK这个内核什么的其实没什么意思,用DBG调试可以找到很多HOOK点,还有那些照抄WINDOWS的源码帖子,没意思。创新点都没有,我是很少发帖子,但要发就发精华,全球没第二家。
NTSTATUS
IoCompletion(
                         IN PDEVICE_OBJECT  DeviceObject,
                         IN PIRP  Irp,
                         IN PVOID  Context
                         )
{
        PKEVENT hEvent = (PKEVENT)Context;
        if( Irp->Flags & SL_PENDING_RETURNED)
        {
                IoMarkIrpPending( Irp );
        };
   
        KeSetEvent( hEvent, IO_NO_INCREMENT, FALSE  );
                /*自己释放IRP*/
        return STATUS_MORE_PROCESSING_REQUIRED;

}

VirtualDiskCommonControl(
                                                 IN PDEVICE_OBJECT DeviceObject,
                                                 IN PIRP Irp
                                                 )
{
        PIO_STACK_LOCATION iostack,newiostack;
        IO_STATUS_BLOCK iostatus;
        PIRP newirp;
        NTSTATUS ok;
        IRP backIrp;
        KEVENT CompleteEvent;
        DEVICE_OBJECT lodev;
    DbgPrint( "Irp------------\n");
    EnumPrintIrpStack( Irp );
        memcpy( &lodev, LowerDevice, sizeof( DEVICE_OBJECT ) );

        iostack = IoGetCurrentIrpStackLocation( Irp );

    newirp = IoAllocateIrp( LowerDevice->StackSize, TRUE );
        DbgPrint( "NewIrp------------\n");
    EnumPrintIrpStack( newirp );

        memcpy( &backIrp, newirp, sizeof(IRP) );
                主要复制USER相关事件与回调
        memcpy( newirp, Irp, sizeof(IRP) );
       
        newirp->StackCount = backIrp.StackCount;
                newirp->CurrentLocation = backIrp.CurrentLocation; 很关键点
        /*NO THIS will to Write Device(IoCallDriver) struct to 0x0*/
        //SIZE=IRP+TAIL+STACK
                newirp->Size = backIrp.Size; 很关键点
           /*开始这里没加,发现IRP释放后会冲掉LowerDevice的对象几个子节*/
        newirp->Tail = backIrp.Tail; 很关键点
               

       
        newiostack = IoGetNextIrpStackLocation( newirp );
       
       
        /**/
    memcpy( newiostack, iostack, sizeof(IO_STACK_LOCATION) );
       
        newiostack->DeviceObject = LowerDevice/*文件驱动*/;
    newiostack->FileObject = iostack->FileObject;

        KeInitializeEvent( &CompleteEvent, NotificationEvent, FALSE );
       
        IoSetCompletionRoutine( newirp, IoCompletion, &CompleteEvent, TRUE, TRUE, TRUE );
        ok = IoCallDriver( LowerDevice, newirp );

        KeWaitForSingleObject( &CompleteEvent, Executive, KernelMode, TRUE, NULL );
        {
               

               
                Irp->IoStatus.Status = newirp->IoStatus.Status;
                Irp->IoStatus.Information = newirp->IoStatus.Information;
                Irp->IoStatus.Pointer = newirp->IoStatus.Pointer;
               

                DbgPrint( "Irp:%08x M:%08x n:%08x\n", newirp->IoStatus.Status,iostack->MajorFunction, iostack->MinorFunction);
                DbgPrint( "Commpltetw New Irp------------\n");
                                EnumPrintIrpStack( newirp );
                //因为IOFREEIRP有线程操作,这样才能释放
                newirp->ThreadListEntry = backIrp.ThreadListEntry; 很关键点
                IoFreeIrp( newirp );
                IoCompleteRequest( Irp, IO_NO_INCREMENT );//完成原来IRP

        };

    // memcpy(  LowerDevice, &lodev, sizeof( DEVICE_OBJECT ) );
       
       
       
        return ok;
       
       
};
NTSTATUS DriverEntry(
                                         IN        PDRIVER_OBJECT                DriverObject,
                                         IN        PUNICODE_STRING                Registry
                                         )
{

        UNICODE_STRING DiskDeviceName;
    UNICODE_STRING DiskName;
    NTSTATUS opRet;
        HANDLE hFile;
        OBJECT_ATTRIBUTES ob;
        IO_STATUS_BLOCK IoStatus;
    OBJECT_HANDLE_INFORMATION ohi;
        PDEVICE_OBJECT FileSystemDevice;
        PDEVICE_OBJECT DiskDevice;
    UNICODE_STRING cname;
        PFILE_OBJECT fobj;

        DriverObject->MajorFunction[IRP_MJ_CREATE]          = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_READ]            = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_WRITE]           = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL]  = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_CLEANUP]         =  VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]           =  VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS]   = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_PNP]             = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_POWER]           = VirtualDiskDispatchPower;
        DriverObject->MajorFunction[IRP_MJ_CREATE_NAMED_PIPE] = VirtualDiskCommonControl;
    DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] = VirtualDiskCommonControl;
    DriverObject->DriverExtension->AddDevice            = VirtualDiskAddDevice;
    DriverObject->DriverUnload                          = VirtualDiskUnload;
       
        RtlInitUnicodeString( &DiskDeviceName, L"\\Device\\VirtualDisk");
    RtlInitUnicodeString( &DiskName, L"\\DosDevices\\w:");//用CMD去测试吧很爽
    RtlInitUnicodeString( &cname, L"\\DosDevices\\c:\\");
       

        IoCreateSymbolicLink( &DiskName, &DiskDeviceName );
       
        InitializeObjectAttributes(
                &ob,
                &cname,
                OBJ_KERNEL_HANDLE,
                NULL,
                NULL
                );

        opRet = ZwCreateFile(
                                &hFile,
                                SYNCHRONIZE|FILE_ANY_ACCESS,
                                &ob,
                                &IoStatus,
                                0,
                                0,
                                FILE_SHARE_READ,
                                FILE_OPEN,
                                FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
                                NULL,
                                0
                                );

    ERR_EXIT( opRet );

        opRet =        ObReferenceObjectByHandle(
                                        hFile,
                                        FILE_READ_DATA,
                                        NULL,
                                        KernelMode,
                                        &fobj,
                                        &ohi
                                        );

        ERR_EXIT( opRet );

    FileSystemDevice = IoGetRelatedDeviceObject( fobj );
        opRet = IoGetDiskDeviceObject( FileSystemDevice, &DiskDevice );
       
//        ERR_EXIT( opRet );
       
        opRet = IoCreateDevice(
                DriverObject,
                0,
                &DiskDeviceName,
                FileSystemDevice->DeviceType,
                0,
                0,
                &VirtualDiskDevice
                );
       
       
        //ERR_EXIT( opRet );
   
        LowerDevice = FileSystemDevice;

       
       
        return STATUS_SUCCESS;
};
核心点:
保留原IRP的THREAD环境。
一些道理要调试你才知道,用DBG多看_IRP结构.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
这还叫全球没有第二家?HOOK是没什么技术含量,你这个也是没啥技术含量的

看看mbrprot的转发技术吧~
2009-1-14 21:22
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
好,一定学习.
2009-1-14 21:28
0
雪    币: 666
活跃值: (201)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
4
传说中的抄不留名?

http://www.debugman.com/read.php?tid=842
2009-1-14 21:38
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
http://www.debugman.com/read.php?tid=842
打不开呀.
,我不管别人怎么看,我先声明,我创作该代码只是突发奇想,然后调试了一天才出来(水平受现),
别人如果和我想法相同不奇怪,那么代码类似不奇怪.但不要说我是抄袭,我有病找骂呀.调试经过我可以再多加注释.
你这样就怀疑卫冕太草率了.你有点先入为主(对于你自己的视野)的感觉,
我你要先看到我的贴子,你就不怀疑了,呵呵
如有雷同,纯属巧合.
2009-1-14 22:00
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
奶奶的,http://www.debugman.com/read.php?tid=842
连接只是HOOK,DiskFilter操作和我的一点关系都没有,忽忧我.

作debugman的广告也没也没这么干的.呵呵,请管理员删除KUSKY的回贴.
2009-1-14 22:38
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
帮楼主鄙视#4
2009-1-14 23:03
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
感觉楼主很狂啊,虽然水平是有的,不过不要老说什么什么没意思。对于菜鸟来说这也算一种学习吧。
2009-1-15 01:30
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
我说没意思,不代表我很在行,呵呵,只是兴趣不在,没有很狂,其实也菜的可以。
2009-1-15 08:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
能共享源码的就要支持,我们需要多鼓励。

感谢楼主。
2009-1-15 09:29
0
雪    币: 405
活跃值: (2365)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不错,实现了设备转换,IRP转发,不过代码里面问题很多,打开文件没关闭,很多对象没解除引用,驱动本身不应该提供ADDDEVICE ,否则被误认为WDM 驱动无法卸载。同时只要FSD上存在任何过滤驱动,比如杀毒软件之类,驱动就无法正常动作==。
2009-1-15 11:15
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
感谢wowocock牛人指点,哈哈,虚心学习。
2009-1-15 11:34
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
13
了解WINDOWS设备栈的原理就不会被MS弄出的这些概念忽悠了而写出如楼主这样浅薄的代码~
2009-1-15 14:26
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
14
2009-1-17 00:49
0
游客
登录 | 注册 方可回帖
返回
//