テクニカル ドキュメント #55



Doc ID: 55
製品: WinDriver
Version:  6.00 およびそれ以降

Buffer Overrun Error: WDU_Transfer() が、0xC000000C エラー コードを返す時があります。このエラー コードの意味は何ですか? どのように解決しますか?

0xC000000C エラー コードは、windrvr.h ファイルに WD_USBD_STATUS_BUFFER_OVERRUN として定義されています。

WinDriver が返す WD_USBD_XXX ステータス コードは (windrvr.h を参照)、低レベルの USB スタック ドライバが返す URB ステータス コードに基いています (たとえば、URB code 0XC000000CL - WD_USBD_STATUS_BUFFER_OVERRUN)。
Debug Monitor ログ (テクニカル ドキュメント #12) を参照してください。Debug Monitor ログに、スタック ドライバが返す URB と IRP の値が表示されます。
Windows の場合、inc ディレクトリ以下の Windows DDK に URB と IRP のコードがあります。 usbdi.h ファイルまたは usb.h ファイル (WinXP の場合)に URB ステータス コードがあります。ntstatus.h ファイルに IRP ステータス コードがあります。 同様に、Windows CE のエラー用には、マイクロソフト社のドキュメントがあります。
Linux の場合、WinDriver は、スタック ドライバから返るエラー コードを相当する USBD エラーと関連付けます。

特定のエラーが発生した場合には、そのエラーに関する詳細情報に関しては、OS のドキュメントを参照してください。

ホストが要求した以上のデータをデバイスが転送した場合、USB スタックが、USBD_STATUS_BUFFER_OVERRUN (0xC000000C) エラー コードを設定します。

このバッファ オーバーラン問題の解決策としては、二通り考えられます:

1. コード中の WDU_Transfer への呼び出しのバッファ サイズを最大パケット サイズの倍数に設定してください。たとえば、最大パケット サイズが 64 バイトの場合、バッファ サイズに 64 の倍数 (64 バイトや 128 バイトなど) を使用してください。

2. デバイスが要求した以上のデータを転送しないように、デバイスとデバイス ドライバ間のプロトコルを定義してください。デバイスのファームウェア コードにアクセスする場合には、この解決策を推奨いたします。

メモ:
1. ファームウェアとハードウェアの仕様を再確認し、デバイスと正しい通信を実装してることを確認してください。
2. USB バス アナライザを使用して、バスのトランザクションを検証することを推奨いたします。