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 |
ヘッダー | wdfdevice.h (Wdf.h を含む) |
ライブラリ | Wdf01000.sys (フレームワーク ライブラリのバージョン管理を参照)。 |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 を する | DriverCreate(kmdf) |