阅读:1060回复:3
大虾看看驱动间传递IRP的问题
以下为代码拷贝,我用IoGetDeviceObjectPointer得到了一个scsi设备,此时想通过该设备句柄向scsi设备发送irp,但在IoCallDriver时老出错:
NTSTATUS status = 0; UNICODE_STRING uniNtNameString; PDEVICE_OBJECT pTargetDeviceObject = NULL; PFILE_OBJECT pTargetFileObject = NULL; RtlInitUnicodeString( &uniNtNameString, DeviceName);//SCSI_DEVICE_NAME ); status = IoGetDeviceObjectPointer( IN &uniNtNameString, IN FILE_ALL_ACCESS, OUT &pTargetFileObject, OUT &pTargetDeviceObject ); if( !NT_SUCCESS(status) ) { pTargetFileObject = NULL; pTargetDeviceObject = NULL; return( status ); } DbgPrint("Scsi设备句柄:%x,文件句柄:%x\n",pTargetDeviceObject,pTargetFileObject); if(!pTargetDeviceObject) return status ; PIRP pIrp=NULL; KEVENT keIoctlComplete; IO_STATUS_BLOCK ioSb; SRB_SET_DEVOBJ iobuf; UINT ubuffer; PIO_STACK_LOCATION pIrpStack; KeInitializeEvent(&keIoctlComplete,NotificationEvent,FALSE); iobuf.SrbCtrl.HeaderLength = sizeof(SRB_IO_CONTROL); FILLSIGNATURE(iobuf.SrbCtrl.Signature); iobuf.SrbCtrl.Timeout = DEFAULT_TIMEOUT; iobuf.SrbCtrl.ControlCode = 1; iobuf.SrbCtrl.ReturnCode = 0xFFFFFFFF; iobuf.SrbCtrl.Length = sizeof(gDeviceObject); iobuf.pDeviceObj=gDeviceObject; pIrp=IoBuildDeviceIoControlRequest( IOCTL_SCSI_MINIPORT, pTargetDevObj, &iobuf, sizeof(iobuf), &ubuffer, sizeof(ubuffer), FALSE, &keIoctlComplete, &ioSb); IoCallDriver(pTargetDevObj,pIrp); (出错处,缺页错误) KeWaitForSingleObject(&keIoctlComplete,Executive,KernelMode,FALSE,NULL); DbgPrint("Send Success\n"); 在scsi设备端,我使用了如下处理代码 DbgPrint("Get IoCtl_test event\n"); PIRP Pirp=(PIRP)Srb->OriginalRequest; Pirp->IoStatus.Status=STATUS_SUCCESS; Pirp->IoStatus.Information=0; 请大虾救命阿,搞了好久了 |
|
沙发#
发布于:2004-04-09 17:00
每人看?自己顶一下
|
|
板凳#
发布于:2004-04-14 17:01
问题解决了没有啊?
我来帮你顶 会不会与pTargetFileObject有关系啊? |
|
|
地板#
发布于:2004-04-14 17:28
估计是没招了,我找了另外一个方法,在NDIS的设备对象中找了个字段来共享两个驱动的数据,哈哈,鬼吧
|
|