阅读:1240回复:0
同一驱动里A设备操作B设备扩展里的成员,出问题.请教原因.
我是新手,问的问题可能极菜,见笑了.遇到热心人能帮忙解答一下,不胜感激,可以让我少走弯路.
我在一个驱动里创建了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,然后投递??? |
|