ドライバーによって作成されたファイル オブジェクトの作成と使用
UMDF には、ドライバーが独自に使用するためのファイル オブジェクトを作成できるようにする DDI、およびこのファイル オブジェクトに関連する I/O セッションを終了する手段が用意されています。
ファイル オブジェクトの作成
スタック内のドライバーは、IWDFDevice::CreateWdfFile メソッドを呼び出して、そのドライバーで使用するためのファイル オブジェクトを作成します。ドライバーが IWDFDevice::CreateWdfFile を呼び出すと、UMDF によってスタック内の次のデバイスにファイル作成要求が送信されます。スタック内の次のデバイスは、カーネル モードまたはユーザー モードです。
このファイル作成要求の処理は、Windows Driver Model (WDM) の場合は異なります。WDM では、ZwCreateFile 関数を呼び出すと、作成 IRP がカーネル モード スタックの最上位に配置されます。次の図は、UMDF と WDM のファイル作成要求の処理を示しています。
UMDF と WDM のファイル作成要求を示す図
IWDFDevice::CreateWdfFile を指定すると、ドライバーでファイル オブジェクトを作成し、デバイスの起動中にスタック全体が開始される前に I/O を発行することができます。
スタック内の次のドライバーは、ファイル作成要求を処理できるかどうか、またはその要求をスタックの下位に転送する必要があるかどうかを判断する必要があります。
注 現在、IWDFDevice::CreateWdfFile を呼び出したドライバーが作成操作を取り消す方法はありません。したがって、次のデバイスに送信されたファイル作成要求を取り消すことはできません。
ファイル オブジェクトの終了
ファイル オブジェクトを作成するために IWDFDevice::CreateWdfFile を呼び出したドライバーは、最終的に、IWDFDriverCreatedFile::Close メソッドを呼び出してファイル オブジェクトの I/O セッションを終了する必要があります。ドライバーが IWDFDriverCreatedFile::Close を呼び出すと、UMDF によってスタック内の次のデバイスに対するクリーンアップ通知が内部的に生成されます。
この通知を受け取ると、次の下位ドライバーは、ファイル オブジェクトのすべての未処理 I/O をすぐに取り消すか完了します。ドライバーがクリーンアップ通知から復帰した後にも未処理 I/O がある場合は、UMDF によってこのファイル オブジェクトのすべての未処理 I/O が取り消されます。
注 ファイル オブジェクトのすべての I/O が完了するまで、そのオブジェクトを終了することはできません。
注 現在、UMDF では、(IWDFDevice::CreateWdfFile を呼び出して) ファイル オブジェクトを作成したデバイスによってファイル オブジェクトにキュー登録された I/O のみが取り消されます。スタック内の下位層デバイスでも I/O がファイル オブジェクトにキュー登録されている場合、UMDF ではその I/O は取り消されません。ドライバーがその I/O を取り消す必要があります。このような未処理 I/O もファイル オブジェクトの未処理 I/O に加算され、ファイル オブジェクトはこの I/O が完了するまで終了できません。
次のデバイスへのファイル オブジェクトの終了に関する通知
ドライバーが IWDFDriverCreatedFile::Close を呼び出し、ファイル オブジェクトに関連付けられたすべての I/O が完了したら、UMDF によって次のデバイスに終了通知が送信されます。このようにして、UMDF では、次のドライバーが終了通知を受け取ったファイル オブジェクトの I/O を受け取らないことが保証されます。この保証は、アプリケーションによって生成されるファイル作成要求に対して I/O マネージャーが提供する保証と似ています。終了通知を送信した後、UMDF は、ファイル オブジェクトを表す IWDFFile インターフェイスを破棄します。