次の方法で共有


ドライバー作成ファイル オブジェクトの作成と使用

警告

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 ターゲット) に送信する必要がある場合、ドライバーは独自のファイル オブジェクトを作成して閉じる必要があります。

ファイルオブジェクトの作成

ドライバーは、ドライバーで使用するファイル オブジェクトを作成するために、IWDFDevice::CreateWdfFile メソッドを呼び出す必要があります。 ドライバーが IWDFDevice::CreateWdfFile を呼び出すと、フレームワークはスタック内の次のドライバーに作成要求を送信します。 スタック内の次のドライバーは、カーネル モードまたはユーザー モードである可能性があります。

このファイル作成要求処理は、Windows ドライバー モデル (WDM) では異なります。 WDM では、ZwCreateFile 関数を呼び出すと、作成 IRP がカーネルモード スタックの先頭に移動します。 次の図は、UMDF と WDM でのファイル作成要求処理を示しています。

create-file request handling in umdf versus wdm.

IWDFDevice::CreateWdfFile を呼び出すことによって、ドライバーはファイル オブジェクトを作成し、スタック全体が開始される前に、デバイスの起動時に I/O 要求を送信できます。

スタック内の次のドライバーは、ファイル作成要求を処理できるか、または要求をスタックのさらに下に転送する必要があるかどうかを判断する必要があります。

IWDFDevice::CreateWdfFile を呼び出した後、ドライバーは作成操作をキャンセルできません。

ファイル オブジェクトの使用

非同期読み取り要求をその下にスタックされた次のドライバーに送信するには、ドライバーは次のパターンを使用できます。

  1. IWDFDevice::CreateWdfFile を呼び出して、ファイル オブジェクトを作成します。
  2. IWDFDevice::GetDefaultIoTarget を呼び出して、下位レベルのドライバーを表すインターフェイスを取得します。
  3. IWDFDevice::CreateRequest を呼び出して、書式設定されていない IWDFIoRequest オブジェクトを作成します。
  4. IWDFIoRequest::SetCompletionCallback を呼び出して、I/O 要求が完了したときにフレームワークが呼び出す OnCompletion メソッドの IRequestCallbackRequestCompletion インターフェイスを登録します。
  5. PFile パラメーターで IWDFDriverCreatedFile インターフェイスへのポインターを指定して、IWDFIoTarget::FormatRequestForRead を呼び出します。
  6. IWDFIoRequest::Send を呼び出して要求を送信します。

ファイル オブジェクトを閉じる

IWDFDevice::CreateWdfFile を呼び出したドライバーは、後で IWDFDriverCreatedFile::Close を呼び出す必要があります。

通常、ドライバーは IWDFDriverCreatedFile::CloseIPnpCallbackHardware::OnReleaseHardware または IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup コールバック メソッドから呼び出します。

ドライバーが IWDFDriverCreatedFile::Close を呼び出すと、フレームワークは次のドライバーの IFileCallbackCleanup::OnCleanupFile メソッドを呼び出します。 このメソッドでは、次のドライバーはファイル オブジェクトに関連付けられているすべての保留中の I/O 要求を、取り消すか完了する必要があります。 その後、フレームワークは、IWDFDevice::CreateWdfFile を呼び出したドライバーによって作成されたすべての I/O 要求を取り消します。 フレームワークは、スタック内の下位のドライバーがファイル オブジェクトに関連付けた可能性がある I/O 要求を取り消しません。 そのような要求を取り消すのはドライバーの責任です。 ファイル オブジェクトは、関連付けられているすべての I/O 要求が完了した後にのみ閉じます。

次に、フレームワークは次のドライバーの IFileCallbackClose::OnCloseFile メソッドを呼び出します。 この時点で、フレームワークは、次のドライバーがこのファイル オブジェクトの追加の I/O 要求を受信しないことを保証します。

フレームワークは OnCloseFile を呼び出した後、ファイル オブジェクトを表す IWDFFile インターフェイスを破棄します。

ドライバーによって作成されたファイル オブジェクトがドライバーのデバイス削除メソッド (IPnpCallbackHardware::OnReleaseHardwareIPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup など) が返された後に残っている場合、フレームワークによってドライバーの停止が生成されます。 この問題のトラブルシューティングについては、「UMDF がデバイスの削除時に未処理のファイルを示す理由の特定」を参照してください。