kangzh
驱动小牛
驱动小牛
  • 注册日期2004-03-09
  • 最后登录2012-08-06
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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;


请大虾救命阿,搞了好久了
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2004-04-12 11:32
检查下你得到的pTargetDeviceObject是SCSI设备的DeviceObject吗?
上一页 下一页
游客

返回顶部