tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3640回复:12

HID设备与DeviceIoControl

楼主#
更多 发布于:2002-12-10 02:07
我有一个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的输出不出现,说明没执行这个函数啊!!!!
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-11 18:25
谢谢了,我现在多少明白一点了。
先给分。
然后再提个问题,请看:
http://www.driverdevelop.com/forum/viewthread.php?tid=29417
另外烦请看看这个问题:
http://www.driverdevelop.com/forum/viewthread.php?tid=29368
sam_h
驱动牛犊
驱动牛犊
  • 注册日期2001-04-19
  • 最后登录2012-01-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-11 17:54
没有办法分清楚。本来无论是系统还是你的APP都是通过readfile来请求的。当然就无法分了。所以,我让你用hidp_getfeature来读数据。这样就可以分清楚了。(系统不会发送这个请求的,专门给你自己用的)在这里面来读你要的数据。

另外:不需要加ID,这样的话,APP发送命令时,ID为0就可以了。你可以自己debug一下。记不清楚了。
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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?这样才有进步吗。”

你每回答一次,我都有所进步,这样不是少走点弯路吗。
求求你,好人做到底吧。
sam_h
驱动牛犊
驱动牛犊
  • 注册日期2001-04-19
  • 最后登录2012-01-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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?这样才有进步吗。


tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于: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)?

还请在费点心吗。
sam_h
驱动牛犊
驱动牛犊
  • 注册日期2001-04-19
  • 最后登录2012-01-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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;

明白了吗?如果还不明白,我建议你练练内功,再开发你的驱动。
赶快给分!!!!!!!!!!!!!!!!!!!!!!



tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-11 00:13
sam_h兄:
READFILE()和WRITEFILE()还能用吗?

Feature report不知如何用?是不是也有个DESCRIPTOR?是不是可以随便定义一些数据,就象DEVICEEXTENSION?
sam_h
驱动牛犊
驱动牛犊
  • 注册日期2001-04-19
  • 最后登录2012-01-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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分都给我。呵呵:))))))
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-10 11:01
#if DBG
DebugPrintMsg(\"DEVICE_IO_CONTROL is send\");
#endif
是输出一个调试信息,别的例程都没问题,都有信息,惟独它不行,
唉。
lvwj
驱动老牛
驱动老牛
  • 注册日期2001-08-21
  • 最后登录2021-01-31
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望181点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-12-10 10:15
用 soft-ice 追踪能进入这个例程吗?
www.bjjcz.com
danielxu22
驱动中牛
驱动中牛
  • 注册日期2002-11-22
  • 最后登录2014-03-24
  • 粉丝0
  • 关注1
  • 积分2分
  • 威望18点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-10 10:07
观望
今天我发现我家的金鱼淹死了,:(
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-10 09:14
我迷惑:
#if DBG
DebugPrintMsg(\"DEVICE_IO_CONTROL is send\");
#endif
好象只要你用CHECKED环境编译,上面就能显示出来呀。
生命驱动,活力无限!
游客

返回顶部