1

これが完全に頭のおかしい質問にならないことを願っています。

テンプレート 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+ (私のデータ)。

誰にも洞察がありますか?

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 に答える