chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1216回复:3

打开一个设备,为什么有些操作成功,有些操作显示成功,但事实上并未成功

楼主#
更多 发布于:2005-01-04 17:21
我将ring3下一段打开设备对设备进行操作的代码,翻译到ring0下使用,结果打开设备成功,一些操作成功,例如读设备名称(IOCTL_ADAPT_GET_DEVICE_NAME),读设备友好名称(IOCTL_ADAPT_GET_FRIENDLY_NAME),但一些操作返回的状态值正确,可事实上并未成功(例如设置传输大小IOCTL_ADAPT_SET_TRANSFER_SIZE),一些操作返回的状态值正确,可返回的数值却不对,例如得到传输大小(IOCTL_ADAPT_GET_TRANSFER_SIZE),返回的数值(GetTransferInfo.TransferSize)不是一个有意义的数值.

下面是ring0下的代码,欢迎高手指教

//打开设备
PDEVICE_OBJECT ipDeviceObject=NULL;
PFILE_OBJECT ipFileObject=NULL;

WCHAR DeviceBuffer[] = L"\\??\\usb#vid_04b4&pid_1003#5&11c063ce&0&3#{ae18aa60-7f6a-11d4-97dd-00010229b959}";

UNICODE_STRING DeviceName;

RtlInitUnicodeString (&DeviceName, DeviceBuffer);

Status = IoGetDeviceObjectPointer(&DeviceName, FILE_ALL_ACCESS, &ipFileObject, &ipDeviceObject);

DebugPrint("Open device[%d]ipFileObject[%d]ipDeviceObject[%d]",Status,ipFileObject,ipDeviceObject);

//得到USB设备名称
PIRP irp;
IO_STATUS_BLOCK ioStatus;
    UCHAR buf[256];

irp = IoBuildDeviceIoControlRequest(IOCTL_ADAPT_GET_DEVICE_NAME,
ipDeviceObject,
(PVOID)buf,
256,
(PVOID)buf,
256,
FALSE,
NULL,
&ioStatus);

Status = IoCallDriver(ipDeviceObject, irp);

DebugPrint("Get device name[%d][%s]io[%d][%d]",Status, buf, ioStatus.Status, ioStatus.Information );

//得到USB设备友好名称

irp = IoBuildDeviceIoControlRequest(IOCTL_ADAPT_GET_FRIENDLY_NAME,
ipDeviceObject,
(PVOID)buf,
256,
(PVOID)buf,
256,
FALSE,
NULL,
&ioStatus);

Status = IoCallDriver(ipDeviceObject, irp);
DebugPrint("Get friendly name[%d][%s]io[%d][%d]",Status, buf, ioStatus.Status, ioStatus.Information );

//设置传输大小

DWORD BytesXfered;
SET_TRANSFER_SIZE_INFO  SetTransferInfo;
SetTransferInfo.EndpointAddress  = 0x88;
SetTransferInfo.TransferSize = 0x2000;     //

irp = IoBuildDeviceIoControlRequest(IOCTL_ADAPT_SET_TRANSFER_SIZE,
ipDeviceObject,
(PVOID)&SetTransferInfo,
sizeof (SET_TRANSFER_SIZE_INFO),
(PVOID)&SetTransferInfo,
sizeof (SET_TRANSFER_SIZE_INFO),
false,
NULL,
&ioStatus);

Status = IoCallDriver(ipDeviceObject, irp);
DebugPrint("Set transfer size[%d]io[%d][%d]",Status, ioStatus.Status, ioStatus.Information );

//得到传输大小
SET_TRANSFER_SIZE_INFO GetTransferInfo;
GetTransferInfo.EndpointAddress = 0x88;

irp = IoBuildDeviceIoControlRequest(IOCTL_ADAPT_GET_TRANSFER_SIZE,
ipDeviceObject,
(PVOID)&GetTransferInfo,
sizeof (SET_TRANSFER_SIZE_INFO),
(PVOID)&GetTransferInfo,
sizeof (SET_TRANSFER_SIZE_INFO),
false,
NULL,
&ioStatus);
DebugPrint("Get transfer size[%d][%d]io[%d][%d]",Status, GetTransferInfo.TransferSize, ioStatus.Status, ioStatus.Information);
陈涛
chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-06 09:40
斑竹,难道你也无法提出一点建议吗,按理说这不是一个复杂的问题,这个设备的控制,我已经在USER MODE下用标准的CreateFile、DeviceIoControl实现了,按理说再ring0下没有不成功的道理,我觉得还是ring0下的函数用得不对。
陈涛
chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-12 10:04
问题已经解决
陈涛
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-12 10:51
怎么解决的?
游客

返回顶部