我希望这不会成为一个完全是脑死亡的问题。
我正在编辑模板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
+(我的数据)。
有没有人有任何见解?
答案 0 :(得分:2)
readData
的地址传递给DeviceIoControl
,{{1}}本身已经是指针。我不敢相信我浪费了这么多时间。
全部谢谢!
答案 1 :(得分:1)
数据的对齐是罪魁祸首。查看http://msdn.microsoft.com/en-us/library/2e70t5y1(v=vs.80).aspx将其设置为一个。