HidD_GetSerialNumberString

会生成对应IRP给内核模式的hidclass.sys,其CTL_CODE分别为

IOCTL_HID_GET_MANUFACTURER_STRING

IOCTL_HID_GET_PRODUCT_STRING

IOCTL_HID_GET_SERIALNUMBER_STRING

而后hidclass.sys会调用mini驱动,CTL_CODE均为

IOCTL_HID_GET_STRING

这是老衲跟踪调试发现的. 不过有个问题,很多文献,材料,书籍,stuff,what ever,都用类似的方法:

PIO_STACK_LOCATION IrpStack;
USHORT wStrId = ((PUSHORT)IrpStack->Parameters.DeviceIoControl.Type3InputBuffer)[0];
LANGID wLngId = ((PUSHORT)IrpStack->Parameters.DeviceIoControl.Type3InputBuffer)[1];    // also USHORT
当我执行是,我得到了这个,很完美,性感,让人热血澎湃的画面:

蓝屏代码 0x0000008E微软的MSDN说明是: KERNEL_MODE_EXCEPTION_NOT_HANDLED 内核模式异常未处理

代码 0xC0000005则是STATUS_ACCESS_VIOLATION, 这个在用户模式下一般是弹出一个 xxxx指令引用 xxxx内存 该内存不能为xxxx

几经挣扎, 回头仔细查看MSDN发现了答案, 思想里又回想多年前战地二小队长的无线电: 不能这么做!

Parameters.DeviceIoControl.Type3InputBuffer in the I/O stack location of the IRP contains a composite value. The two most significant bytes contain the language ID of the string to be retrieved. The two least significant bytes contain one of the following three constant values:

  • HID_STRING_ID_IMANUFACTURER

  • HID_STRING_ID_IPRODUCT

  • HID_STRING_ID_ISERIALNUMBER

这个并不是一个指针, 而是两个WORD合成的DWORD, 比如HidD_GetProductString的Type3InputBuffer:
// 0x0409000F   0F 00 09 04 : HID_STRING_ID_IPRODUCT(0x000F) English American ENU(0x0409,MSDN)

于是有了前面的兴奋, 下面就不敢乱来了,至少要确认老婆不在家, 于是我使用内存指针之前都Probe

结果还是异常, 不过可以通过dbgView查看,而不用导致虚拟机崩溃, 使用代码

ProbeForWrite(Irp->UserBuffer, xxx, x);

仍然是0xC0000005 STATUS_ACCESS_VIOLATION, 狠心不Probe居然没有错,中文资料都像金元宝一样噎着藏着等下崽

我只好跑去微软了,结果

Do not use this routine on kernel-mode addresses; it will raise an exception.

If Irp->RequestorMode = KernelMode , the Irp->AssociatedIrp.SystemBuffer and Irp->UserBuffer fields do not contain user-mode addresses, and a call to ProbeForWrite to probe a buffer pointed to by either field will raise an exception.

If Length = 0, ProbeForWrite does no checking of the address. In this case, the routine does not raise an exception for an address that is misaligned or is outside the range of valid user addresses.

还是那句话, 不能这么做!

具体我就不翻译了, 只能传一个用户模式的地址 0x80000000以前的,而不能传递一个内核模式的地址

虽然hidclass的CTL_CODE都是METHOD_NEITHER即直接内存访问,但是传递的地址是内核模式的地址,调试显示0xf7bc5830

看来,这种事情,老婆不在家也不能做啊.

2014-12-01 01:53:09.

大家不要紧张,这只是一个笔记!

本文转载于:https://blog.csdn.net/u010875635/article/details/73321066 Windows使用 HID 通信相对比较简单, HID 都是通过PID、VID信息来查找连接的,相比于串口,几乎无变化,连接无需人工选择,十分方便,也不需要驱动。 下面上实例,PID为0x003f,VID为0x04D8,支持发送接收数据显示到UI,使用C#来编...
​​​​​​本文章主要介绍一下如何在XP下做一个基于usb hid 设备的上位机程序,实现简单的上位机与硬件设备的通信。由于本人自身的能力限制,有不足和出错的地方,希望读者见谅.我假设这篇文章的读者已经对USB, HID ,报告描述符等相关概念都至少有所了解,如果不是的话,自行学习. 开发环境, vs2005, DDK的支持.如果没有安装DDK,去网上找相关的库文件和头文件也行. 有以下几个文件是所需的: basetsd.h hid class.h hid pddi.h hid pi.h hid sdi..
在学习板上可以正常收发数据,但转到开发板上发送的数据可以正常发送,但是开发板接收不到,开发板和调试助手可以正常调试的,不知道有没有大神遇到这种问题? buffer=newbyte[outputReportLength]; buffer[0]=r.reportID; intmaxBuf...
IOCTL _GET_STATE是一个常量,通常在编程中与 ioctl 系统调用一起使用。 ioctl 是一个用于设备控制的系统调用,它允许用户通过设备文件和命令参数与设备驱动程序进行通信。 IOCTL _GET_STATE是一个用于获取设备状态的命令参数,它指示 ioctl 系统调用返回设备的当前状态。 具体的 ioctl 命令和参数取决于设备驱动程序和设备的类型。在使用 IOCTL _GET_STATE之前,你需要查看设备的文档或相关的驱动程序代码,以确定它的正确使用方式和参数。 在PHP中,你可以使用` ioctl ()`函数来调用 ioctl 系统调用。下面是一个示例代码,演示如何使用 ioctl 获取设备状态: ```php $device = '/dev/device'; // 设备文件路径 $command = IOCTL _GET_STATE; // 获取设备状态的命令参数 $handle = fopen($device, 'r'); // 打开设备文件 $result = ioctl ($handle, $command); // 调用 ioctl 系统调用 fclose($handle); // 关闭设备文件 // 处理返回结果 if ($result === false) { echo " IOCTL _GET_STATE failed\n"; } else { echo "Device state: $result\n"; 在上述代码中,`/dev/device`是设备文件的路径,你需要将其替换为实际的设备文件路径。` IOCTL _GET_STATE`是获取设备状态的命令参数,你也需要确保其被正确定义。 请注意, ioctl 系统调用的使用和具体的命令参数取决于设备和设备驱动程序的实现。确保仔细阅读相关的文档和代码,并根据实际情况进行适当的调整。
YukinoRikka: 你能恢复是因为文件删除后,系统还没有进行TRIM,下一次TRIM后就无法恢复了。 机械硬盘删除后能恢复是因为逻辑地址空间和物理地址空间一一对应,除非坏道修复或者手动屏蔽/更改,对应关系不会改变,所有只要没有覆盖,就能恢复文件。 而固态硬盘由于FTL表的存在,报告给系统的逻辑地址空间都是虚拟的(每次可能对应不同的物理地址空间),而物理地址空间是通过FTL表翻译的;一经TRIM,FTL表中标记为删除的空间立即清空,无论是系统还是硬盘都无法获取到已删除文件的地址,也就无法恢复了。 网传固态硬盘因为TRIM指令一经删除无法恢复是以讹传讹 realsatan174: 啥恢复软件,还能预览,麻烦推荐下。 勘误:HidRegisterMinidriver应在hidclass.lib而非hid.lib 蠓虫带着秤砣飞: 我也是因为奇怪不能#pragma卡了好几天 网传固态硬盘因为TRIM指令一经删除无法恢复是以讹传讹 sparklerl: win10是默认开启trim的吧? 网传固态硬盘因为TRIM指令一经删除无法恢复是以讹传讹 图确实不厚道,截图前不小心选择了正常的文件; 版本不同,这个版本是绿色图标; 主要是很多文章说固态硬盘删除就不能恢复,实际应该是擦除才不能恢复,在TRIM执行之前都是可以恢复的