20楼#
发布于:2004-04-09 15:06
以下为代码拷贝,我用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,文件句柄:%xn",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 Successn"); 在scsi设备端,我使用了如下处理代码 DbgPrint("Get IoCtl_test eventn"); PIRP Pirp=(PIRP)Srb->OriginalRequest; Pirp->IoStatus.Status=STATUS_SUCCESS; Pirp->IoStatus.Information=0; 请大虾救命阿,搞了好久了 |
|
21楼#
发布于:2004-04-12 11:32
检查下你得到的pTargetDeviceObject是SCSI设备的DeviceObject吗?
|
|
上一页
下一页