阅读:1216回复:3
打开一个设备,为什么有些操作成功,有些操作显示成功,但事实上并未成功
我将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); |
|
|
沙发#
发布于:2005-01-06 09:40
斑竹,难道你也无法提出一点建议吗,按理说这不是一个复杂的问题,这个设备的控制,我已经在USER MODE下用标准的CreateFile、DeviceIoControl实现了,按理说再ring0下没有不成功的道理,我觉得还是ring0下的函数用得不对。
|
|
|
板凳#
发布于:2005-01-12 10:04
问题已经解决
|
|
|
地板#
发布于:2005-01-12 10:51
怎么解决的?
|
|