デバイスの障害の報告
デバイスの障害を報告するには、次の 3 つの方法があります:
デバイス オブジェクトコールバック関数から戻るときに、ドライバーは、NT_SUCCESS(status)がFALSE と等しい戻り値を提供できます。
ドライバーは WdfDeviceSetFailedを呼び出すことができます。
EvtDriverDeviceAddコールバック ルーチンから戻るときに、関数ドライバーは、NT_SUCCESS(status) がFALSE と等しい戻り値を指定できます。 フィルター としてインストールされたドライバーが EvtDriverDeviceAddに障害が発生した場合、オペレーティング システムはフィルター デバイス オブジェクトをスキップし、PnP エラーを示しません。
上記の各メソッドのいずれでも、フレームワークがデバイスを効果的に取り外します。 デバイスのドライバーがシステム上の他のデバイスをサポートしていない場合、I/O マネージャーはドライバーをアンロードします。
ドライバーのデバイス オブジェクトコールバック関数が、 NT_SUCCESS(status) がFALSEと等しい値を返す場合、フレームワークは 、バス ドライバーにデバイスの再列挙を要求してデバイスの再起動を試みるPnP マネージャーに通知します。 ドライバーがアンロードされた場合、再ロードされます。
ドライバーはWdfDeviceSetFailedを呼び出す場合、デバイスを再起動するかどうかを決定する入力引数を指定します。 引数の値はWdfDeviceFailedAttemptRestartと WdfDeviceFailedNoRestartです。
UMDF 2.15 より前の UMDF ドライバーは、この値を WdfDeviceFailedNoRestartに設定する必要があります。 UMDF バージョン 2.15 以降では、UMDF ドライバーは、 WdfDeviceFailedAttemptRestartに設定されたFailedAction で WdfDeviceSetFailedを呼び出すことによって、基になるバスドライバーにその再列挙を要求できます。 詳細については、WdfDeviceSetFailedをご参照ください。
これらの引数値の詳細については、WDF_DEVICE_FAILED_ACTIONをご参照ください。 ドライバーのデバイス オブジェクトコールバック関数がNT_SUCCESS(status) が FALSEと等しい値を返す前に、コールバック関数は WdfDeviceFailedNoRestart の入力引数で WdfDeviceSetFailedを呼び出すことによって再起動を防ぐことができます。 それ以外の場合、これらのコールバック関数は WdfDeviceSetFailedを呼び出す必要はありません。
短時間のうちにいくつかの連続した再起動試行が失敗した場合 (再起動されたドライバーが再びエラーを報告するため)、フレームワークはデバイスの再起動の試行を停止します。
バス ドライバーの EvtDeviceD0Entry 関数が、NT_SUCCESS(status) がFALSEと等しい値を返す場合、フレームワークは引き続きバス ドライバーの子デバイスに関連付けられたドライバーのEvtDeviceD0Entry 関数を呼び出す可能性があります。