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 キューで受信した要求や、ドライバーが作成した要求をフォーマットできます。
メソッド | 目的 |
---|---|
フレームワークから受信した要求を変更せずにターゲットに送信できるようにフォーマットします。 |
|
デバイス制御要求をフォーマットします。 |
|
読み取り要求をフォーマットします。 |
|
書き込み要求をフォーマットします。 |
|
バッファーをフラッシュするための要求をフォーマットします。 |
|
ファイルの情報を取得するための要求をフォーマットします。 |
|
ファイルの情報を設定するための要求をフォーマットします。 |
ドライバーで 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 を呼び出します。