次の方法で共有


UMDF での一般 I/O ターゲットへの I/O 要求の送信

UMDF ドライバーは、I/O 要求を一般 I/O ターゲットに同期的または非同期的に送信できます。

ドライバーが I/O 要求を同期的に送信する場合、ドライバーのスレッドは要求を一度に 1 つずつ送信します。スレッドは、各要求が完了するまで待機してから、次の要求を送信します。この処理は、I/O 要求を非同期で送信するよりも単純です。ドライバーが多数の要求を送信することがなく、ドライバーが各 I/O 要求を待機することによるシステムまたはデバイスのパフォーマンス低下がない場合、そのドライバーは I/O 要求を同期的に送信できます。

ドライバーが I/O 要求を非同期で送信する場合、ドライバーのスレッドは、要求の準備が整いしだい、前に送信した要求の完了まで待機せずに、各要求を送信します。ドライバーが短時間に多数の I/O 要求を処理する必要がある場合は、通常、ドライバーが次の要求を送信する前に、各要求の完了を待機することはできません。各要求の完了を待機していると、データの損失や、ドライバーの管理下にあるデバイス (および多くの場合システム全体) のパフォーマンス低下につながる可能性があります。

UMDF ドライバーで I/O 要求を I/O ターゲットに送信するには、あらかじめ要求をフォーマットしておく必要があります。ドライバーで I/O 要求をフォーマットするためのメソッドを、次の表に示します。これらのメソッドにより、ドライバーがいずれかの I/O キューで受信した要求や、ドライバーが作成した要求をフォーマットできます。

メソッド 目的

IWDFIoRequest::FormatUsingCurrentType

フレームワークから受信した要求を変更せずにターゲットに送信できるようにフォーマットします。

IWDFIoTarget::FormatRequestForIoctl

デバイス制御要求をフォーマットします。

IWDFIoTarget::FormatRequestForRead

読み取り要求をフォーマットします。

IWDFIoTarget::FormatRequestForWrite

書き込み要求をフォーマットします。

IWDFIoTarget2::FormatRequestForFlush

バッファーをフラッシュするための要求をフォーマットします。

IWDFIoTarget2::FormatRequestForQueryInformation

ファイルの情報を取得するための要求をフォーマットします。

IWDFIoTarget2::FormatRequestForSetInformation

ファイルの情報を設定するための要求をフォーマットします。

 

ドライバーで I/O 要求を I/O ターゲットに送信するには、IWDFIoRequest::Send メソッドを呼び出します。I/O 要求を同期的に送信する場合は、Flags パラメーターに WDF_REQUEST_SEND_OPTION_SYNCHRONOUS フラグを渡します。このフラグを渡さない場合、I/O 要求は非同期で送信されます。ドライバーで I/O 要求を非同期で送信する場合は、通常、他のドライバーが要求を完了したときに通知を受ける必要があります。このため、ドライバーで IRequestCallbackRequestCompletion::OnCompletion コールバック関数を定義し、IWDFIoRequest::SetCompletionCallback メソッドを呼び出して登録する必要があります。詳細については、「I/O 要求の完了」を参照してください。

ドライバーで IWDFIoRequest::Send を呼び出して I/O 要求を送信した後に、その要求を取り消すには、IWDFIoRequest::CancelSentRequest メソッドを呼び出します。ドライバーは、フレームワークから受信した I/O 要求を取り消す場合、常に IWDFIoRequest::Complete メソッドまたは IWDFIoRequest::CompleteWithInformation メソッドを、CompletionStatus パラメーターを STATUS_CANCELLED に設定して呼び出すことによって、要求を完了させる必要があります。ドライバーが要求オブジェクトを作成した場合、ドライバーは要求を完了させる代わりに IWDFObject::DeleteWdfObject を呼び出します。