longbrow
驱动牛犊
驱动牛犊
  • 注册日期2004-04-06
  • 最后登录2011-03-22
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望72点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1240回复:0

同一驱动里A设备操作B设备扩展里的成员,出问题.请教原因.

楼主#
更多 发布于:2010-11-14 15:12
我是新手,问的问题可能极菜,见笑了.遇到热心人能帮忙解答一下,不胜感激,可以让我少走弯路.

我在一个驱动里创建了A.B两个设备,设备扩展定义如下,
typedef struct _TEST_DEV_EXTENSION_
{
//链表,记录IRP队列
LIST_ENTRY ReqList;

//队列的锁
KSPIN_LOCK ReqLock;

//同步事件
KEVENT ReqEvent;

//记录对方设备的扩展地址
PVOID DevExt_Addr;

......... 其他省略
} TEST_DEV_EXTENSION, *PTEST_DEV_EXTENSION;

并且为每个设备创建了一个线程
VOID
ReadWriteThread (
IN PVOID Context
)

{
NTSTATUS ntStatus = STATUS_SUCCESS;
//用来指向过滤设备的设备扩展的指针
PTEST_DEV_EXTENSION DevExt = (PTEST_DEV_EXTENSION)Context;
//请求队列的入口
PLIST_ENTRY ReqEntry = NULL;
//irp指针
PIRP Irp = NULL;




KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
//
for (;;)
{
//先等待请求队列同步事件
KeWaitForSingleObject(
&DevExt->ReqEvent,
Executive,
KernelMode,
FALSE,
NULL
);

//从请求队列的首部拿出一个请求来处理
while (ReqEntry = ExInterlockedRemoveHeadList(
&DevExt->ReqList,
&DevExt->ReqLock
))
{
//从队列的入口里找到实际的irp的地址
Irp = CONTAINING_RECORD(ReqEntry, IRP, Tail.Overlay.ListEntry);

............
}
}
}

在设备的DispatchReateWrite分发例程里,如果我把IRP插入到A.B两个设备线程的各自队列里,分别激活自己的事件,很正常; 但是因为某种需要,我想把B设备的IRP也插入到A设备的线程链表里去,,并激活A设备里的事件,就错误了. 下面是分发例程
NTSTATUS
DispatchReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{


//用来指向过滤设备的设备扩展的指针
PTEST_DEV_EXTENSION DevExt = DeviceObject->DeviceExtension;

IoMarkIrpPending(Irp);

if (DevExt->IsDeviceB) //如果是B设备,那么也转向投递到A设备的链表里去
{
PLIST_ENTRY pl;
ULONG i;
//将这个irp放进A设备的请求队列里
pl = ExInterlockedInsertTailList(
&((PTEST_DEV_EXTENSION)(DevExt->DevExt_Addr))->ReqList,
&Irp->Tail.Overlay.ListEntry,
&((PTEST_DEV_EXTENSION)(DevExt->DevExt_Addr))->ReqLock
);
if (pl == NULL) //这里确实是Null
{
KdPrint(("ExInterlockedInsertTailList err\n"));
}
//设置队列的等待事件,通知队列对这个irp进行处理
i = KeSetEvent(
&((PTEST_DEV_EXTENSION)(DevExt_Addr))->ReqEvent,
(KPRIORITY)0,
FALSE);
if (i==0) //这里返回了0
{
KdPrint(("KeSetEvent err\n"));
}
}
else // A设备一切正常
{

ExInterlockedInsertTailList(
&DevExt->ReqList,
&Irp->Tail.Overlay.ListEntry,
&DevExt->ReqLock
);

KeSetEvent(
&DevExt->ReqEvent,
(KPRIORITY)0,
FALSE);

}

//返回pending状态
return STATUS_PENDING;

}


在vmware双机调试的时候,windbg下可以看到设备B里保存的DevExtAddr正确,可以看到A设备扩展里的成员值都是正确的. 但是为什么就操作不了呢????????

如果这种访问对方设备扩展的思路是错误的,那么我要把B设备的IRP请求如何也串行到A设备的线程里去处理呢? 自己构建IRP,然后投递???


游客

返回顶部