我正在调试一些使用第 3 方 64 位 DLL 访问自定义 USB 设备的代码。我的环境是 Windows 8.1 x64 上的 Microsoft Visual Studio 2012。
根据不完整且不可靠的文档,DLL 应该发出 USBDEVFS_CONTROL ioctl 以从连接的 USB 设备读取 1 个字节。该定义涉及
ctrl.bRequestType = bmRequestType;
ctrl.bRequest = bRequest;
ctrl.wValue = wValue;
ctrl.wIndex = wIndex;
ctrl.data = ByteArray;
ctrl.wLength = 64;
ctrl.timeout = 1000;
这里bmRequestType
, bRequest
, wValue
, 和wIndex
是设备制造商提供的常量,是包含特定命令ByteArray
的缓冲区。uint8_t[64]
DLL 接受特定于应用程序的参数,将它们打包到ByteArray
, 并调用ksproxy.ax
-> Kernelbase.dll
-> ntdll.dll
。我在用户模式下看到的最后一个反汇编是
mov r10,rcx
mov eax,47h
syscall
ret
根据文档,使用分步调试器,我可以很容易地看到它的ByteArray
构造完全符合预期。但我找不到该usbdevfs_ctrltransfer
结构或其 Windows 等效项。
具体来说,我们怀疑wIndex
文档中指定的 的值适用于旧版本的硬件,并且 Windows DLL 实际上使用0x0400
而不是0x0402
.
任何提示(包括硬件或软件 USB 嗅探器、仿真器等)我们如何尝试验证此无符号短路将不胜感激。
更新
阅读https://reverseengineering.stackexchange.com/questions/2416/how-to-reverse-engineer-simple-usb-device-windows-linux和https://reverseengineering.stackexchange.com/questions/1786/usb-dongle - 交通监控。看起来这些工具与 Windows 8.1 x64 不兼容。