我希望这不是一个完全脑残的问题。
我正在编辑模板 WDF Windows USB 设备驱动程序,以将格式化数据发送到设备的批量输出管道之一;必须以某种方式设置数据以告诉设备读取内部寄存器。
问题是我无法让数据以所需的确切格式通过总线。我编写了一个小型测试应用程序来枚举设备并DeviceIoControl
在输入缓冲区设置为我根据规范设置的结构的情况下进行调用。
我有一个工作案例的 USB 总线跟踪副本(由我无权访问其源的驱动程序执行),并且我捕获了一个总线跟踪,以了解当我在驱动程序中调用自定义 IOCTL 时会发生什么。我通过总线看到的是我设置的以 12 个字节数据为前缀的数据结构;数据结构是正确的,但我想知道最初的十二字节数据是什么,并阻止驱动程序发送它们。
我相信驱动程序已经正确编写;我在驱动程序中放置了一些调试跟踪,看起来由检索到的缓冲区WdfRequestRetrieveInputMemory
已经预先添加了 12 个字节,所以这似乎是在驱动程序前发生的。
如果它是有用的信息,则 IOCTL 设置METHOD_BUFFERED
为FILE_ANY_ACCESS
.
设置它的测试代码的相关部分非常简单:
const ULONG ulBufferSize = sizeof( CONTROL_READ_DATA );
unsigned char pBuffer[sizeof(CONTROL_READ_DATA)];
DWORD dwBytesReturned;
CONTROL_READ_DATA* readData = (CONTROL_READ_DATA*)pBuffer;
readData->field1 = data;
readData->field2 = moreData;
// ... all fields filled in...
// Send IOCTLs into camera
if( !::DeviceIoControl( hDevice,
IOCTL_CUSTOM_000,
&readData,
ulBufferSize,
&readData,
ulBufferSize,
&dwBytesReturned,
NULL ) )
{
dwError = ::GetLastError();
// Clean up here
return dwError;
}
我通过总线看到的数据是:80FD1200 CCCCCCCC CCCCCCCC
+(我的数据)。
有没有人有任何见解?