デバイス削除への影響
PnP デバイスが取り外された場合、オペレーティング システムは、アプリケーションによって作成されたすべてのファイル オブジェクトが終了されるまで、ドライバーにデバイスの取り外しを通知しません (したがって、ファイル オブジェクトのすべての I/O が完了しないと通知されません)。
UMDF では、デバイスの取り外しに関するこの原則が、上位層のドライバーがファイル オブジェクトを開いた下位層のドライバーに適用されます。つまり、上位層のドライバーが作成したすべてのファイル オブジェクトが終了するまで、下位層のドライバーにはデバイスの取り外しが通知されません。
そのため、ドライバーによって作成された未処理のファイル オブジェクトによって、デバイス取り外し処理が停止される可能性があります。ドライバーによって作成されたファイル オブジェクトによってデバイス取り外し処理が停止されないようにするために、UMDF では、上位層のドライバーに対し、デバイス取り外し処理が完了するまでに、IWDFDevice::CreateWdfFile を使用して開いたすべてのファイル オブジェクトを終了するように強制しています。それらのファイル オブジェクトがすべて確実に終了されるようにするには、上位層のドライバーで、IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup コールバック関数の間に次の操作を実行する必要があります (それらのファイル オブジェクトが既に終了されている場合はこの操作を実行する必要はありません)。
IWDFDriverCreatedFile::Close メソッドを呼び出して、ドライバーで作成したすべてのファイル オブジェクトを終了します。
それらのファイル オブジェクトの未処理の I/O がすべて完了するまで待ちます。この I/O が完了しない限り、ファイル オブジェクトは終了されません。
上位層のドライバーで上記の操作が実行されなかった場合、UMDF では、ドライバーのデバイス取り外しのコールバック関数 (IPnpCallbackHardware::OnReleaseHardware や IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup など) が返された後に、ドライバーを停止します。関連するファイル オブジェクトが既に終了されている場合は、ドライバーは停止されません。