次の方法で共有


UMDFでの I/O 要求の取り消し

警告

UMDF 2 は UMDF の最新バージョンであり、UMDF 1 に取って代わるものです。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。

アーカイブされた UMDF 1 サンプルは、Windows 11, バージョン 22H2 - 2022 年 5 月 ドライバー サンプル アップデートでご確認いただけます。

詳しくは、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 要求を取り消そうとしたかどうかを判断できます。 IsCanceledTRUE を返す場合、ドライバーは要求を取り消す必要があります。

たとえば、ドライバーが受信した要求に対して MarkCancelable を呼び出していない場合、ドライバーが大きな読み取りまたは書き込み要求を受け取り、それを複数の小さい要求に分割すると、ドライバーは I/O ターゲットが小さい各要求を完了した後に IsCanceled を呼び出す場合があります。

要求の取り消し

I/O 要求の取り消しには、次のいずれかが関係する場合があります。

  • 進行中の I/O 操作の停止。

  • 要求を I/O ターゲットに転送しない場合。

  • IWDFIoRequest::CancelSentRequest を呼び出して、ドライバーが以前に I/O ターゲットに送信した要求を取り消そうとします。

ドライバーがフレームワークから受け取った要求オブジェクトの I/O 要求を取り消している場合、ドライバーは必ず、CompletionStatus パラメーター HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED)で IWDFIoRequest::Complete または IWDFIoRequest::CompleteWithInformation を呼び出して要求を完了する必要があります。 (ドライバーが IWDFDevice::CreateRequest を呼び出して要求オブジェクトを作成する場合、ドライバーは、要求を完了する代わりに IWDFObject::D eleteWdfObject を呼び出します)。