阅读:3638回复:12
HID设备与DeviceIoControl
我有一个HID的MINIDRIVER(不是USB),我在应用程序中使用SetupDixxxx和Createfile()能得到DRIVER的HANDLE(一个非NULL的值,应该是它的句柄吧?),但随后用DeviceIoControl与它通讯,却没有反映,怎么会事?是不是MiniDriver不能用DeviceIoControl?
请各位指教。 在DRIVER中是这样的: //init.c的DriverEntry中有 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=BHDIoctl; //在BHDIoctl中 { NTSTATUS ntStatus=STATUS_SUCCESS; PDEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpStack; IrpStack=IoGetCurrentIrpStackLocation(Irp); DeviceExtension=GET_MINIDRIVER_DEVICE_EXTENSION(DeviceObject); #if DBG DebugPrintMsg(\"DEVICE_IO_CONTROL is send\"); #endif 。。。。。。 } 这个DEBUG的输出不出现,说明没执行这个函数啊!!!! |
|
沙发#
发布于:2002-12-10 09:14
我迷惑:
#if DBG DebugPrintMsg(\"DEVICE_IO_CONTROL is send\"); #endif 好象只要你用CHECKED环境编译,上面就能显示出来呀。 |
|
|
板凳#
发布于:2002-12-10 10:07
观望
|
|
|
地板#
发布于:2002-12-10 10:15
用 soft-ice 追踪能进入这个例程吗?
|
|
|
地下室#
发布于:2002-12-10 11:01
#if DBG
DebugPrintMsg(\"DEVICE_IO_CONTROL is send\"); #endif 是输出一个调试信息,别的例程都没问题,都有信息,惟独它不行, 唉。 |
|
5楼#
发布于:2002-12-10 15:08
你的判断是正确的。在HID MINIDRIVER中,不能用IOCTOL,这些IOCTOL都会被HIDCLASS.SYS过滤掉。如果你想和你的minidriver通讯,可以采取用HID Feature Report与driver通讯。
即: 1、在HID Report中增加Feature report 2、在APP中用hidp_setreport or hidp_getreport向driver发送数据 3、在HID MINIDRIVER中,对set_report & get_report做相应的处理 回答好了,别忘了把80分都给我。呵呵:)))))) |
|
6楼#
发布于:2002-12-11 00:13
sam_h兄:
READFILE()和WRITEFILE()还能用吗? Feature report不知如何用?是不是也有个DESCRIPTOR?是不是可以随便定义一些数据,就象DEVICEEXTENSION? |
|
7楼#
发布于:2002-12-11 12:14
这个你都不知道?你需要仔细看HID的规范了。下面就是一个在HID report desciptor中的一段用Feature report的例子。
0x09,0x01, // USAGE (Vendor Usage 1) 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8) bits 0x95,0x08, // REPORT_COUNT (7) byte 0xb1,0x02, // FEATURE (Data,Var,Abs) 如果你想用writefile,那么可以用out report,例如: 0x09,0x01, // USAGE (Vendor Usage 1) 0x15,0x00, // LOGICAL_MINIMUM (0) 0x26,0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75,0x08, // REPORT_SIZE (8) bits 0x95,0x08, // REPORT_COUNT (7) byte 0x91,0x02, // Output (Data, Variable, Absolute) 这两个例子都定义了7个bytes的字节。这样你可以在App中发送7个字节到你的minidriver中。(注意,包括report id一共8个字节)。 在driver中,当APP发送writefile时,截获如下: case IOCTL_HID_WRITE_REPORT: ntStatus = HGM_WriteReport(DeviceObject, Irp); break; 当当APP发送hidp_setfeature时,截获如下: case IOCTL_HID_SET_FEATURE: ntStatus = HGM_SetFeature(DeviceObject, Irp); break; 明白了吗?如果还不明白,我建议你练练内功,再开发你的驱动。 赶快给分!!!!!!!!!!!!!!!!!!!!!! |
|
8楼#
发布于:2002-12-11 14:44
sam_h兄:
你也太心急了,分还能少了你的!!!!!!!!!!!! 帮助很大,非常感谢。 我只做过简单的WDM,MINIDRIVER确实有点不同,writefile得到的是IOCTL_HID_WRITE_REPORT,而不是IRP_MJ_WRITE,怪不得我的程序老没反映。 还有下面问题: (1)Feature report是不是必须定义,是不是必须有Feature report,才能实现writefile和READFILE? (2)在HID report desciptor中如何加入Feature report 下面是我的HID report desciptor,是JOYSTICK,加在那里 const unsigned char BHDJoyReportDesc[50] = { 0x05, 0x01, /* USAGE_PAGE (Generic Desktop)*/ 0x15, 0x00, /* LOGICAL_MINIMUM (0)*/ 0x09, 0x04, /* USAGE (Joystick)*/ 0xa1, 0x01, /* COLLECTION (Application)*/ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop)*/ 0x09, 0x01, /* USAGE (Pointer)*/ 0xa1, 0x00, /* COLLECTION (Physical)*/ 0x15, 0x81, /* LOGICAL_MINIMUM (0)*/ 0x25, 0x7f, /* LOGICAL_MAXIMUM (255)*/ 0x09, 0x30, /* USAGE (X)*/ 0x09, 0x31, /* USAGE (Y)*/ 0x75, 0x08, /* REPORT_SIZE (8)*/ 0x95, 0x02, /* REPORT_COUNT (2)*/ 0x81, 0x02, /* INPUT (Data,Var,Abs)*/ 0xc0, /* END_COLLECTION*/ 0x05, 0x09, /* USAGE_PAGE (Button)*/ 0x19, 0x01, /* USAGE_MINIMUM (Button 1)*/ 0x29, 0x10, /* USAGE_MAXIMUM (Button 16)*/ 0x15, 0x00, /* LOGICAL_MINIMUM (0)*/ 0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/ 0x75, 0x01, /* REPORT_SIZE (1)*/ 0x95, 0x10, /* REPORT_COUNT (16)*/ 0x55, 0x00, /* UNIT_EXPONENT (0)*/ 0x65, 0x00, /* UNIT (None)*/ 0x81, 0x02, /* INPUT (Data,Var,Abs)*/ 0xc0 /* END_COLLECTION*/ }; (3)有了Feature report,那么HID Device Descriptor的bNumDescriptors是否要报告为2(原来因为只有report desciptor,所以是1)? 还请在费点心吗。 |
|
9楼#
发布于:2002-12-11 16:06
const unsigned char BHDJoyReportDesc[50] = {
0x05, 0x01, /* USAGE_PAGE (Generic Desktop)*/ 0x15, 0x00, /* LOGICAL_MINIMUM (0)*/ 0x09, 0x04, /* USAGE (Joystick)*/ 0xa1, 0x01, /* COLLECTION (Application)*/ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop)*/ 0x09, 0x01, /* USAGE (Pointer)*/ 0xa1, 0x00, /* COLLECTION (Physical)*/ 0x15, 0x81, /* LOGICAL_MINIMUM (0)*/ 0x25, 0x7f, /* LOGICAL_MAXIMUM (255)*/ 0x09, 0x30, /* USAGE (X)*/ 0x09, 0x31, /* USAGE (Y)*/ 0x75, 0x08, /* REPORT_SIZE (8)*/ 0x95, 0x02, /* REPORT_COUNT (2)*/ 0x81, 0x02, /* INPUT (Data,Var,Abs)*/ 加在这里吧。 0xc0, /* END_COLLECTION*/ 0x05, 0x09, /* USAGE_PAGE (Button)*/ 0x19, 0x01, /* USAGE_MINIMUM (Button 1)*/ 0x29, 0x10, /* USAGE_MAXIMUM (Button 16)*/ 0x15, 0x00, /* LOGICAL_MINIMUM (0)*/ 0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/ 0x75, 0x01, /* REPORT_SIZE (1)*/ 0x95, 0x10, /* REPORT_COUNT (16)*/ 0x55, 0x00, /* UNIT_EXPONENT (0)*/ 0x65, 0x00, /* UNIT (None)*/ 0x81, 0x02, /* INPUT (Data,Var,Abs)*/ 0xc0 /* END_COLLECTION*/ }; bNumDescriptors不需要改。 如果是自己的driver,从理论上讲可以不用加feature report or output report。不过,我没有试过。 你自己多试一试多好?不要什么都问别人,ok?这样才有进步吗。 |
|
10楼#
发布于:2002-12-11 17:35
能不能再讲讲,我还有点不明白。
(1)IOCTL_HID_READ_REPORT在我的驱动中是SYSTEM要求报告JOYSTICK的数据,现在它又代表我的APP的READFILE(),那么我怎么知道到底是系统的请求还是APP的请求?我必须自己设法分辨吗?我的理解是每次都要报告整个的REPORT(JOYSTICK的REPORT+8BYTE),那么系统怎样理解我的多出的8BYTE?JOYSTICK的请求应该来自游戏吧,它又如何理解我的8BYTES? (2)是不是在REPORT DESCRIPTOR中要加REPORT ID? “你自己多试一试多好?不要什么都问别人,ok?这样才有进步吗。” 你每回答一次,我都有所进步,这样不是少走点弯路吗。 求求你,好人做到底吧。 |
|
11楼#
发布于:2002-12-11 17:54
没有办法分清楚。本来无论是系统还是你的APP都是通过readfile来请求的。当然就无法分了。所以,我让你用hidp_getfeature来读数据。这样就可以分清楚了。(系统不会发送这个请求的,专门给你自己用的)在这里面来读你要的数据。
另外:不需要加ID,这样的话,APP发送命令时,ID为0就可以了。你可以自己debug一下。记不清楚了。 |
|
12楼#
发布于:2002-12-11 18:25
谢谢了,我现在多少明白一点了。
先给分。 然后再提个问题,请看: http://www.driverdevelop.com/forum/viewthread.php?tid=29417 另外烦请看看这个问题: http://www.driverdevelop.com/forum/viewthread.php?tid=29368 |
|