警告
UMDF 2 は UMDF の最新バージョンであり、UMDF 1 よりも優先されます。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。
アーカイブされた UMDF 1 サンプルは、Windows 11 バージョン 22H2 - May 2022 Driver Samples Updateにあります。
詳細については、「UMDFの概要」を参照してください。
デバイスの進行中の I/O 操作 (ディスクから複数のブロックを読み取る要求など) は、アプリケーション、システム、またはドライバーによって取り消すことができます。 デバイスの I/O 操作が取り消されると、I/O マネージャーは、I/O 操作に関連付けられているすべての未処理の I/O 要求を取り消そうとします。 デバイスのドライバーは、I/O マネージャーが I/O 要求を取り消そうとしたときに通知を受け取るように登録できます。また、ドライバーは、HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED) の完了状態で 完了することで、 所有している要求を取り消すことができます。
フレームワークは、フレームワーク ベースのドライバーのキャンセル処理の一部を処理します。 デバイスの I/O 操作が取り消されると、フレームワークは完了します。完了状態は HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED)--キャンセルされた操作に関連付けられている次の I/O 要求です。
フレームワークがドライバーの既定の I/O キューに配置した未配信 I/O 要求。
ドライバーが IWDFIoQueue::ConfigureRequestDispatching を呼び出したため、フレームワークが別のキューに転送された未配信の I/O 要求。
フレームワークはこれらの要求を取り消すので、ドライバーに配信されません。
フレームワークがドライバーに I/O 要求を配信した後、ドライバーは要求を所有し、フレームワークはそれを取り消すことができません。 この時点で、ドライバーのみが I/O 要求を取り消すことができますが、フレームワークは要求を取り消す必要があることをドライバーに通知する必要があります。 ドライバーは 、IRequestCallbackCancel::OnCancel コールバック関数を提供することで、この通知を受け取ります。
場合によっては、ドライバーは I/O キューから I/O 要求を受信しますが、要求を処理する代わりに、後で処理するために同じまたは別の I/O キューに要求を再キューします。 たとえば、フレームワークがドライバーのいずれかの要求ハンドラーに I/O 要求を配信し、その後、ドライバーが IWDFIoRequest::ForwardToIoQueue を呼び出して要求を別のキューに配置するか、 IWDFIoRequest2::Requeue を呼び出して要求を同じキューに戻します。
このような場合、要求が I/O キューにあるため、フレームワークは I/O 要求を取り消すことができます。 ただし、ドライバーが要求が存在する I/O キューのコールバック関数を登録している場合、フレームワークは、関連付けられている I/O 操作が取り消されるときに、要求を取り消す代わりにコールバック関数を呼び出します。 フレームワークがドライバーのコールバック関数を呼び出す場合、ドライバーは要求をキャンセルする必要があります。
要約すると、I/O 操作が取り消されると、フレームワークは常に、ドライバーに配信されなかった関連付けられているすべての I/O 要求を取り消します。 ドライバーが要求を受け取り、その要求を再キューに入れた場合、ドライバーが I/O キューのコールバック関数を提供しない限り、フレームワークは要求を取り消します (要求がキューにある場合)。
MarkCancelable の呼び出し
ドライバーは IWDFIoRequest::MarkCancelable を呼び出して 、IRequestCallbackCancel::OnCancel コールバック関数を登録できます。 ドライバーが MarkCancelable を呼び出し、要求に関連付けられている I/O 操作が取り消された場合、フレームワークはドライバーの OnCancel コールバック関数を呼び出して、ドライバーが I/O 要求を取り消すことができるようにします。
比較的長い間要求を所有する場合、ドライバーは MarkCancelable を呼び出す必要があります。 たとえば、ドライバーがデバイスの応答を待機する必要がある場合や、ドライバーが 1 つの要求を受信したときに作成された一連の要求を下位ドライバーが完了するまで待機する必要がある場合があります。
ドライバーが MarkCancelable を呼び出さない場合、またはドライバーが MarkCancelable を呼び出した後に IWDFIoRequest::UnmarkCancelable を呼び出した場合、ドライバーはキャンセルを認識しないため、通常と同様に要求を処理します。
IsCanceled の呼び出し
ドライバーが OnCancel コールバック関数を登録するために MarkCancelable を呼び出していない場合は、IWDFIoRequest2::IsCanceled を呼び出して、I/O マネージャーが I/O 要求を取り消そうとしたかどうかを判断できます。 IsCanceled が TRUE を返す場合、ドライバーは要求を取り消す必要があります。
たとえば、大きな読み取りまたは書き込み要求を受け取り、それをいくつかの小さい要求に分割するドライバーが、受け取った要求に対して MarkCancelable を呼び出していない場合、ドライバーの I/O ターゲットが各小さい要求を完了するたびに IsCanceled を呼び出す可能性があります。
要求の取り消し
I/O 要求の取り消しには、次のいずれかが含まれる場合があります。
進行中の I/O 操作の停止。
要求を I/O ターゲットに転送しません。
IWDFIoRequest::CancelSentRequest を呼び出して、ドライバーが以前に I/O ターゲットに送信した要求を取り消そうとします。
ドライバーがフレームワークから受け取った要求オブジェクトの I/O 要求を取り消している場合、ドライバーは常に IWDFIoRequest::Complete または IWDFIoRequest::CompleteWithInformation を呼び出し、CompletionStatus パラメーターを HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED) で完了する必要があります。 (ドライバーが IWDFDevice::CreateRequest を呼び出して要求オブジェクトを作成した場合、ドライバーは要求を完了する代わりに IWDFObject::D eleteWdfObject を呼び出します)。