WdfDeviceInitSetRemoveLockOptions 関数 (wdfdevice.h)
[KMDF にのみ適用]
WdfDeviceInitSetRemoveLockOptions メソッドを使用すると、任意の種類の IRP をドライバーに配信する前に、フレームワークが削除ロックを取得します。
構文
void WdfDeviceInitSetRemoveLockOptions(
[in] PWDFDEVICE_INIT DeviceInit,
[in] PWDF_REMOVE_LOCK_OPTIONS Options
);
パラメーター
[in] DeviceInit
WDFDEVICE_INIT構造体への呼び出し元が指定したポインター。
[in] Options
WDF_REMOVE_LOCK_OPTIONS構造体へのポインター。
戻り値
なし
解説
既定では、フレームワークは、次の主要な種類の IRP をドライバーに配信する前に、削除ロックを取得します。
- IRP_MJ_PNP
- IRP_MJ_POWER
- IRP_MJ_SYSTEM_CONTROL
IRP が完了すると、フレームワークは削除ロックを解放します。
KMDF 1.11 以降では、ドライバーは必要に応じて WdfDeviceInitSetRemoveLockOptions を呼び出して、上記の IRP の種類だけでなく、すべての IRP の種類を配信する前に、フレームワークが削除ロックを取得できます。
ドライバーに、デバイスの PnP 状態と同期されていない I/O を送信するカーネル モード クライアントがある場合は、フレームワーク デバイス オブジェクトが削除された後に I/O IRP が到着したためにクラッシュが発生する可能性があります。 この場合は、 WdfDeviceInitSetRemoveLockOptions を呼び出すことができます。 次に、クライアントがデバイスに I/O 要求を送信すると、次のようになります。
- デバイスがまだ削除されていない場合は、削除ロックが正常に取得され、要求が配信されます。 削除が後で行われると、フレームワークは IoReleaseRemoveLockAndWait を呼び出し、ロックの取得が成功するまでブロックします (I/O 要求が完了します)。
- デバイスが既にIRP_MN_REMOVE_DEVICE処理されているが、デバイスが解放されないように WDM デバイス オブジェクトへの未処理の参照がある場合、削除ロックは取得されず、フレームワークは要求を直ちに完了します。
ドライバーが WdfDeviceInitSetRemoveLockOptions を呼び出した後、フレームワーク デバイス オブジェクトの有効期間中、設定は有効なままです。
ロックの削除の詳細については、「ロックの 削除の使用」を参照してください。
例
このコード例では、 WDF_REMOVE_LOCK_OPTIONS 構造体を初期化し、 WdfDeviceInitSetRemoveLockOptions を呼び出します。
WDF_REMOVE_LOCK_OPTIONS RemoveLockOptions;
WDF_REMOVE_LOCK_OPTIONS_INIT(
&RemoveLockOptions,
WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
);
WdfDeviceInitSetRemoveLockOptions(
DeviceInit,
&RemoveLockOptions
);
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
最小 KMDF バージョン | 1.11 |
Header | wdfdevice.h (Wdf.h を含む) |
Library | Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。 |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | DriverCreate(kmdf) |