xiaoqiangvs007
驱动牛犊
驱动牛犊
  • 注册日期2005-09-16
  • 最后登录2009-03-18
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:2099回复:5

HOOK IoCreateDevice的问题。。

楼主#
更多 发布于:2007-04-04 12:35
  U盘插入,加载驱动,然后停驱动(停驱动会恢复HOOK的),当U盘拔出再插入就会蓝屏了UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS



NTSTATUS
HookIoCreateDevice(
                  IN PDRIVER_OBJECT  DriverObject,
                  IN ULONG  DeviceExtensionSize,
                  IN PUNICODE_STRING  DeviceName  OPTIONAL,
                  IN DEVICE_TYPE  DeviceType,
                  IN ULONG  DeviceCharacteristics,
                  IN BOOLEAN  Exclusive,
                  OUT PDEVICE_OBJECT  *DeviceObject
                  )
{
    NTSTATUS NtStatus;
    ULONG Temp_Addr = 0;
    char buff[1024];
    HANDLE handle = 0;
    PUNICODE_STRING unistr = (PUNICODE_STRING)&buff[0];
    ULONG ReturnLength = 0;
    PDEVICE_OBJECT  DeviceObjectTemp;
    DbgPrint("==>Hook IoCreateDevice()");

    NtStatus = m_IoCreateDevice(
        DriverObject,
        DeviceExtensionSize,
        DeviceName  OPTIONAL,
        DeviceType,
        DeviceCharacteristics,
        Exclusive,
        DeviceObject
        );
    if(!NT_SUCCESS(NtStatus))
    {
        DbgPrint("m_IoCreateDevice() fail");
        return NtStatus;
    }

    //ObOpenObjectByPointer来打开进程(创建并返回进程句柄)    
    if(ObOpenObjectByPointer(DriverObject, 0, NULL, 0, 0, KernelMode, &handle))
    {
        DbgPrint("ObOpenObjectByPointer() Success and return");
        return STATUS_SUCCESS;
    }
    /*
    NTSTATUS ZwQueryObject(
    IN HANDLE ObjectHandle,
    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    OUT PVOID ObjectInformation,
    IN ULONG ObjectInformationLength,
    OUT PULONG ReturnLength OPTIONAL
    );
    
    ObjectHandle是我们想要获取有关信息的句柄,ObjectInformationClass是信息类型,
    保存在以字节计算长度为ObjectInformationLength的缓冲区ObjectInformation中。
    我们对OBJECT_INFORMATION_CLASS使用的类是ObjectNameInformation和ObjectAllTypesInformation。
    ObjectNameInfromation类在缓冲区中返回OBJECT_NAME_INFORMATION结构,
    而ObjectAllTypesInformation类返回OBJECT_ALL_TYPES_INFORMATION结构。
    */
    
    ZwQueryObject(handle, 1, buff, 256, &ReturnLength);
    if(!unistr->Buffer)
    {
        ZwClose(handle);
        return STATUS_SUCCESS;
    }
    if(_wcsicmp(unistr->Buffer, L"\\Driver\\USBSTOR"))
    {
        ZwClose(handle);
        return STATUS_SUCCESS;
    }

    DeviceObjectTemp = *DeviceObject;
    DbgPrint("DriverObject:%X, *DeviceObject->DriverObject:%x\nDriverObject->MajorFunction[IRP_MJ_CREATE]:%x,HookCreateDispatch:%x\n",
        DriverObject,
        DeviceObjectTemp->DriverObject,
        (ULONG)DriverObject->MajorFunction[IRP_MJ_CREATE],
        HookCreateDispatch);    

    //hook IRP_MJ_CREATE
    Temp_Addr = (ULONG)DriverObject->MajorFunction[IRP_MJ_CREATE];
    if(Temp_Addr == (ULONG)HookCreateDispatch)
        return STATUS_SUCCESS;
    
    RealCreateDispatch = (ProxyDispatch)Temp_Addr;
    DriverObject->MajorFunction[IRP_MJ_CREATE] = HookCreateDispatch;
//    (*DeviceObject)->DriverObject->MajorFunction[IRP_MJ_CREATE] = HookCreateDispatch;
    UsbDriverObject = DriverObject;
    DbgPrint("UsbDriverObject: %x", UsbDriverObject);
    DbgPrint("<==Hook IoCreateDevice() success");
    return NtStatus;
}

//=================================================
下面是恢复HOOK的代码

    if((RealCreateDispatch != NULL) && (UsbDriverObject != NULL))
    {
        DbgPrint("UsbDriverObject->MajorFunction[IRP_MJ_CREATE]: %x\nRealCreateDispatch: %x\nUsbDriverObject: %x\n",
                 UsbDriverObject->MajorFunction[IRP_MJ_CREATE],
                 RealCreateDispatch,
                 UsbDriverObject);
        UsbDriverObject->MajorFunction[IRP_MJ_CREATE] = RealCreateDispatch;
        RealCreateDispatch = NULL;
        dprintf(("UnHook MajorFunction[IRP_MJ_CREATE] Success\n"));
    }
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-04-15 17:52
一个好的忠告:
永远不要unload
没有战争就没有进步 X3工作组 为您提供最好的军火
gongxp123456
驱动牛犊
驱动牛犊
  • 注册日期2004-12-15
  • 最后登录2013-10-10
  • 粉丝0
  • 关注0
  • 积分617分
  • 威望383点
  • 贡献值1点
  • 好评度59点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-14 22:51
这个问题非常复杂,要使用汇编,调用一些非文档调用
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2007-04-13 10:02
引用计数吧..

可能你unhook时,有一部分代码正在用,你的驱动却没了,肯定挂掉...
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-04-12 21:56
问不如调试
琢磨悟真知
xiaoqiangvs007
驱动牛犊
驱动牛犊
  • 注册日期2005-09-16
  • 最后登录2009-03-18
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-04 12:35
有知道原因的吗??
游客

返回顶部