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:
这个并不是一个指针, 而是两个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指令一经删除无法恢复是以讹传讹
realsatan174:
勘误:HidRegisterMinidriver应在hidclass.lib而非hid.lib
蠓虫带着秤砣飞:
网传固态硬盘因为TRIM指令一经删除无法恢复是以讹传讹
sparklerl:
网传固态硬盘因为TRIM指令一经删除无法恢复是以讹传讹