zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1528回复:3

DRIVER_驱动退出会蓝屏,UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS

楼主#
更多 发布于:2007-08-20 16:51
驱动退出时,driverunload函数里,先是把链表的数据写入文件,然后再释放链表,没看出来程序错在哪儿.

void
DriverUnload(
              IN PDRIVER_OBJECT DriverObject
            )
{  
    UNICODE_STRING DeviceLinkName;

    KdPrint(("HookSSDT.sys entry DriverUnload\n"));
    
    UnHookService();
    
    WriteProtectFile(&g_ProtectListHead);    
    FreeProtectFileList(&g_ProtectListHead);

    RtlInitUnicodeString(&DeviceLinkName, HOOKSSDT_DEVICE_LINK_NAME);
    IoDeleteSymbolicLink(&DeviceLinkName);
    IoDeleteDevice(DriverObject->DeviceObject);
}
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-08-20 16:52
void
WriteProtectFile( PSINGLE_LIST_ENTRY pProtectList )
{
    NTSTATUS status;
    IO_STATUS_BLOCK ioStatus;

    HANDLE hFile = NULL;
    UNICODE_STRING usSafeFile;
    OBJECT_ATTRIBUTES objectAttributes;

    RtlInitUnicodeString(&usSafeFile, SAFE_FILE);
    InitializeObjectAttributes(
                               &objectAttributes,
                               &usSafeFile,                  
                               OBJ_CASE_INSENSITIVE,
                               NULL,
                               NULL
                               );        
    
    status = ZwCreateFile(
                           &hFile,
                           GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
                           &objectAttributes,
                           &ioStatus,
                           NULL,
                           FILE_ATTRIBUTE_NORMAL,
                           0,
                           FILE_OVERWRITE_IF,
                           FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
                           NULL,
                           0
                         );
    if ( NT_SUCCESS(status) )
    {
        if (pProtectList->Next != NULL)
        {
            PSINGLE_LIST_ENTRY pLink;
            PProtectFileEntry_t pElement;

            while (TRUE)
            {
//                pLink = PopEntryList(pProtectList);
                pLink = ExInterlockedPopEntryList(pProtectList, &g_SpinLock);
                if (pLink != NULL)
                {
                    pElement = CONTAINING_RECORD(pLink, ProtectFileEntry_t, nextNode);

                    status = RtlStringCbCatW(pElement->FileName, MAX_PATH*sizeof(WCHAR), L"*");        
                    if ( NT_SUCCESS(status) )
                    {
                        status = ZwWriteFile(
                                              hFile,
                                              NULL,
                                              NULL,
                                              NULL,
                                              &ioStatus,
                                              pElement->FileName,
                                              wcslen(pElement->FileName)*sizeof(WCHAR),
                                              NULL,
                                              NULL
                                            );
                        if ( NT_SUCCESS(status) )
                        {
                            continue;
                        }
                    }
                }

                break;
            }
        }
        ZwClose(hFile);
    }
}
zhangleierli
驱动小牛
驱动小牛
  • 注册日期2007-01-31
  • 最后登录2017-05-24
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望158点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-08-20 16:53
void
FreeProtectFileList(PSINGLE_LIST_ENTRY pSingleListHead)
{
    if (pSingleListHead->Next != NULL)
    {
        PProtectFileEntry_t pElement;    
//        PSINGLE_LIST_ENTRY pLink = PopEntryList(pSingleListHead);
        PSINGLE_LIST_ENTRY pLink = ExInterlockedPopEntryList(pSingleListHead, &g_SpinLock);

        while (pLink != NULL)
        {
            pElement = CONTAINING_RECORD(pLink, ProtectFileEntry_t, nextNode);
            
            ExFreePool(pElement);            
//            pLink = PopEntryList(pSingleListHead);
            pLink = ExInterlockedPopEntryList(pSingleListHead, &g_SpinLock);
        }
    }    
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-08-21 08:41
在你的HOOK例程里有未完成返回的操作,如果你卸载了,那么当他完成返回后,返回的是无效地址,就会引发异常,所以处理方法同我以前说的键盘过滤卸载的方法一样,设定计数器,只有计数器到0以后再退出。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部