阅读:1529回复:3
DRIVER_驱动退出会蓝屏,UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
驱动退出时,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); } |
|
沙发#
发布于: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); } } |
|
板凳#
发布于: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); } } } |
|
地板#
发布于:2007-08-21 08:41
在你的HOOK例程里有未完成返回的操作,如果你卸载了,那么当他完成返回后,返回的是无效地址,就会引发异常,所以处理方法同我以前说的键盘过滤卸载的方法一样,设定计数器,只有计数器到0以后再退出。
|
|
|