1

我希望这不是一个完全脑残的问题。

我正在编辑模板 WDF Windows USB 设备驱动程序,以将格式化数据发送到设备的批量输出管道之一;必须以某种方式设置数据以告诉设备读取内部寄存器。

问题是我无法让数据以所需的确切格式通过总线。我编写了一个小型测试应用程序来枚举设备并DeviceIoControl在输入缓冲区设置为我根据规范设置的结构的情况下进行调用。

我有一个工作案例的 USB 总线跟踪副本(由我无权访问其源的驱动程序执行),并且我捕获了一个总线跟踪,以了解当我在驱动程序中调用自定义 IOCTL 时会发生什么。我通过总线看到的是我设置的以 12 个字节数据为前缀的数据结构;数据结构是正确的,但我想知道最初的十二字节数据是什么,并阻止驱动程序发送它们。

我相信驱动程序已经正确编写;我在驱动程序中放置了一些调试跟踪,看起来由检索到的缓冲区WdfRequestRetrieveInputMemory已经预先添加了 12 个字节,所以这似乎是在驱动程序前发生的。

如果它是有用的信息,则 IOCTL 设置METHOD_BUFFEREDFILE_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+(我的数据)。

有没有人有任何见解?

4

2 回答 2

2

哇,真是可笑的错误。请注意,我正在传递to的地址,它本身已经是一个指针。我不敢相信我在这上面浪费了这么多时间。readDataDeviceIoControl

谢谢大家!

于 2012-07-16T22:51:54.547 回答
1

数据对齐是罪魁祸首。查看http://msdn.microsoft.com/en-us/library/2e70t5y1(v=vs.80).aspx将其设置为 1。

于 2012-07-16T20:48:26.400 回答