xxm1178888
驱动牛犊
驱动牛犊
  • 注册日期2008-12-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1420回复:3

请教各位大侠关于用跟踪线程ID解决 重入的问题!

楼主#
更多 发布于:2009-03-03 17:58
我按照楚狂人的<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),请问哪里除了问题,请指教!
max
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于: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()
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-03-04 10:49
引用楼主xxm1178888于2009-03-03 17:58发表的 请教各位大侠关于用跟踪线程ID解决 重入的问题! :
我按照楚狂人的<Windows+文件系统过滤驱动开发教程(第二版)>书上的代码,关于解决驱动重入的问题, 用的方法是
NTSTATUS SfCreate(…)
{

if(这个IRP 不由我的驱动自己发出)
.......



在create里面解决重入的问题 很简单的啊!为啥要这么复杂? 直接使用shadowdevice就可以 很好的解决问题!逻辑也简单,方式也很清晰!
solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-03-06 16:15
大侠可以告诉我怎么利用shadowdevice解决重入吗?我看了很多地方用shadowdevice解决重入,但是不知道怎么解决,谢谢大侠了!

引用第2楼qianjunhua于2009-03-04 10:49发表的  :



在create里面解决重入的问题 很简单的啊!为啥要这么复杂? 直接使用shadowdevice就可以 很好的解决问题!逻辑也简单,方式也很清晰!
游客

返回顶部