为什么DeviceIoControl会将12个字节的信息添加到用户提供的输入缓冲区中?

时间:2012-07-16 20:39:20

标签: winapi usb driver wdf

我希望这不会成为一个完全是脑死亡的问题。

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

问题在于我无法以必要的确切格式将数据传输到总线上。我写了一个小测试应用来枚举设备并调用DeviceIoControl,输入缓冲区设置为我根据规范设置的结构。

我有一份工作案例的USB总线跟踪副本(由我无法访问的驱动程序执行),我捕获了一条总线跟踪,告诉我在驱动程序中调用自定义IOCTL时会发生什么。我看到的总线是我设置的数据结构,前缀为12个字节的数据;数据结构是正确的,但我想知道数据的最初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 +(我的数据)。

有没有人有任何见解?

2 个答案:

答案 0 :(得分:2)

哇,真是荒谬的错误。请注意,我正在将readData地址传递给DeviceIoControl,{{1}}本身已经是指针。我不敢相信我浪费了这么多时间。

全部谢谢!

答案 1 :(得分:1)

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