デバイス エラーの報告

デバイス エラーを報告するには、次の 2 つの方法があります。

  • デバイス オブジェクトのコールバック関数から制御が戻ったときに、NT_SUCCESS(status) が FALSE であった戻り値を、ドライバーから報告します。

  • ドライバーで WdfDeviceSetFailed を呼び出します。

どちらの方法でも、フレームワークによってデバイスは事実上削除されます。デバイスのドライバーがシステム上の他のデバイスをサポートしていない場合、I/O マネージャーはそのドライバーをアンロードします。

ドライバーのデバイス オブジェクトのコールバック関数が、NT_SUCCESS(status) が FALSE である値を返した場合、フレームワークはこれを PnP マネージャーに通知します。PnP マネージャーは、バス ドライバーにデバイスを再度列挙するよう要求して、デバイスの再起動を試行します。ドライバーがアンロードされている場合は、再度読み込まれます。

ドライバーで WdfDeviceSetFailed を呼び出す場合、ドライバーは、デバイスを再起動するかどうかを示す入力引数を指定します。この引数の値は、WdfDeviceFailedAttemptRestartWdfDeviceFailedNoRestart です。これらの引数の値の詳細については、「WDF_DEVICE_FAILED_ACTION」(英語の可能性あり) を参照してください。

ドライバーのデバイス オブジェクトのコールバック関数では、NT_SUCCESS(status) が FALSE である値を返す前に、WdfDeviceSetFailed に入力引数 WdfDeviceFailedNoRestart を渡して呼び出すことにより、デバイスの再起動を回避できます。これを行わない場合、これらのコールバック関数で WdfDeviceSetFailed を呼び出す必要はありません。

短期間に再起動が連続してエラーになる (再起動対象のドライバーから再度エラーが報告される) 場合、フレームワークはデバイスの再起動の試行を停止します。