阅读:1157回复:6
奇怪的问题,求助!
我的驱动,以前直接用IoGetDeviceObjectPointer()取得底层设备的pDeviceObject使用,没有问题。
现在根据需要,我在另一驱动中用IoGetDeviceObjectPointer()取得底层设备的pDeviceObject指针,然后创建IRP_MJ_DEVICE_CONTROL的IRP, 将其放在UserBuffer中,传给我的驱动处理。 在我的驱动中处理IRP_MJ_DEVICE_CONTROL的代码段中,我得到了正确的pDeviceObject,并且使用正常。于是,我将这个指针储存在DeviceExtension中。可是,在后面使用这个指针时,只要一调用就死机。问题可能出在哪里啊,请大侠指教。 下面是我驱动的简单流程: 驱动1: //取得底层设备的DeviceObject指针 status = IoGetDeviceObjectPointer( dicn->SymbolicLinkName, FILE_ALL_ACCESS, &pFile, &(pDeviceExtension->Key)); if(!NT_SUCCESS(status)) { return status; } ObDereferenceObject(pFile); //创建IRP KeInitializeEvent(&kevent, SynchronizationEvent, false); pIrp = IoBuildDeviceIoControlRequest( IOCTL_CARD_INSERT, pDeviceExtension->CardReader, NULL, 0, NULL, 0, false, &kevent, &IoStatus); if(pIrp == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } //将底层设备的DeviceObject指针放入UserBuffer,传给另一驱动 pIrp->UserBuffer = pDeviceExtension->Key; status = IoCallDriver( pDeviceExtension->CardReader, pIrp); if (status == STATUS_PENDING) { KeWaitForSingleObject( &kevent, Executive, KernelMode, FALSE, NULL ); status = IoStatus.Status; } 驱动2: NTSTATUS VdDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp) { case IOCTL_CARD_INSERT: { //将底层设备的DeviceObject指针保存 到DeviceExtension中 pDeviceExtension->NextStackDevice =(PDEVICE_OBJECT)(pIrp->UserBuffer); 此处我检查了用pDeviceExtension->NextStackDevice 创建IRP,发给底层设备,返回正常 } } //驱动另一函数,需要用IRP与底层通信 NTSTATUS WD_SendtoLower(IN PDEVICE_OBJECT DeviceObject, IN OUT BYTE *rwbuf, IN OUT BYTE *outbuf, IN OUT PULONG len, IN OUT PULONG lenr) { 此中只要一出现pDeviceExtension->NextStackDevice, 便会死机 } |
|
沙发#
发布于:2004-04-21 17:32
我在VdDeviceControl()中用ObReferenceObjectByPointer()增加了对pDeviceExtension->NextStackDevice的引用,仍然死机。
请大侠指教,急! |
|
板凳#
发布于:2004-04-22 15:47
自己顶一下,哪位大侠指点一下。
|
|
地板#
发布于:2004-04-22 17:49
太奇怪了,把这个指针存放到ReaderExtension中就可以用了!
|
|
地下室#
发布于:2004-05-09 10:46
sinking 好强 ,自言自语,自己解决问题。^_^
|
|
|
5楼#
发布于:2004-05-10 15:44
没办法,没人帮我啊! :cool:
|
|
6楼#
发布于:2004-05-10 17:51
IoGetDeviceObjectPointer得到的是设备栈顶端的设备,意思就是你用IoCallDriver发出的IRP是从设备栈顶进去的,你在另一个驱动用这个指针的时候,哪个驱动是不是也位于同一个设备栈中,如果是这样,那么就是相当于自己给自己发IRP,可能会死机.
答对了记得给分呀。 |
|