阅读:1420回复:3
请教各位大侠关于用跟踪线程ID解决 重入的问题!
我按照楚狂人的<Windows+文件系统过滤驱动开发教程(第二版)>书上的代码,关于解决驱动重入的问题, 用的方法是
NTSTATUS SfCreate(…) { … if(这个IRP 不由我的驱动自己发出) { ZwCreateFile(…); // <- 这里会导致发出Irp, 并再次被我们过滤到, 等于这里再次调用SfCreate(…) } … } 即跟踪线程ID 方法解决重入. 但是,我运行他的代码: typedef void ( *PWIT_DO)(void *context); typedef struct WIT_THTREAD_ { LIST_ENTRY list; // Request list in our thread. HANDLE tid; // Thread id. KEVENT event; // An event to inform the thread to process a request. KSPIN_LOCK lock; // A lock used by the list. } WIT_THREAD,*PWIT_THREAD; typedef struct WIT_NODE_ { LIST_ENTRY list; void *context; KEVENT event; PWIT_DO do_somthing; }WIT_NODE,*PWIT_NODE; PWIT_THREAD WITCreateThread(OUT NTSTATUS *status) { PWIT_THREAD my_thread; my_thread = ExAllocatePoolWithTag(NonPagedPool,sizeof(WIT_NODE),WIT_TAG); if(my_thread == NULL) { *status = STATUS_INSUFFICIENT_RESOURCES; return NULL; } InitializeListHead(&my_thread->list); KeInitializeSpinLock(&my_thread->lock); KeInitializeEvent(&my_thread->event,SynchronizationEvent,FALSE); *status = PsCreateSystemThread( &my_thread->tid, (ACCESS_MASK) 0L, NULL, NULL, NULL, WITThreadProc, (PVOID)my_thread); if(!NT_SUCCESS(*status)) { ExFreePool(my_thread); return NULL; } return my_thread; } void WITThreadProc(IN PVOID context) { PWIT_THREAD mythread = (PWIT_THREAD)context; PWIT_NODE node = NULL; for (;;) { // 等待有任务发生 KeWaitForSingleObject( &mythread->event, Executive, KernelMode, FALSE,NULL); // 有就完成 while ( node = (PWIT_NODE)ExInterlockedRemoveHeadList( &mythread->list, &mythread->lock)) { node->do_somthing(node->context); KeSetEvent(&node->event,IO_NO_INCREMENT,FALSE); } } } 我运行WITCreateThread函数时,就蓝屏(错误码是 STOP:0x0000007E),请问哪里除了问题,请指教! |
|
|
沙发#
发布于:2009-03-03 23:15
First: I don't think this line of code is correct:
my_thread = ExAllocatePoolWithTag(NonPagedPool,sizeof(WIT_NODE),WIT_TAG); Second: 0x7E is SYSTEM_THREAD_EXCEPTION_NOT_HANDLED. I'd suggest you start using WinDbg to figure out problems. Third: The most important is that using thread ID to avoid reentrancy deemed not working. There's no guarantee that a CREATE IRP from the same thread is the re-entrant one. I'd suggest you try IoCreateFileSpecifyDeviceObjectHint() |
|
板凳#
发布于:2009-03-04 10:49
引用楼主xxm1178888于2009-03-03 17:58发表的 请教各位大侠关于用跟踪线程ID解决 重入的问题! : 在create里面解决重入的问题 很简单的啊!为啥要这么复杂? 直接使用shadowdevice就可以 很好的解决问题!逻辑也简单,方式也很清晰! |
|
地板#
发布于:2009-03-06 16:15
大侠可以告诉我怎么利用shadowdevice解决重入吗?我看了很多地方用shadowdevice解决重入,但是不知道怎么解决,谢谢大侠了!
引用第2楼qianjunhua于2009-03-04 10:49发表的 : |
|