これが完全に頭のおかしい質問にならないことを願っています。
テンプレート WDF Windows USB デバイス ドライバーを編集して、フォーマットされたデータをデバイスのバルク アウト パイプの 1 つに送信しています。デバイスに内部レジスタを読み取るように指示するには、データを特定の方法で設定する必要があります。
問題は、データを必要な正確なフォーマットでバスに送ることができないことです。デバイスを列挙し、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
+ (私のデータ)。
誰にも洞察がありますか?