MmLockPagableSectionByHandle 関数 (ntddk.h)
MmLockPagableSectionByHandle ルーチンは、ハンドルの参照カウントをセクションにインクリメントすることで、ページング可能なコードまたはデータ セクションをシステム メモリにロックします。
構文
void MmLockPagableSectionByHandle(
[in] PVOID ImageSectionHandle
);
パラメーター
[in] ImageSectionHandle
ページング可能なコードまたはデータ セクションへのハンドル。 呼び出し元は、 MmLockPagableCodeSection ルーチンまたは MmLockPagableDataSection ルーチンの以前の呼び出しからこのハンドル を 取得しました。
戻り値
なし
解説
ドライバーは、最初に MmLockPagableCodeSection または MmLockPagableDataSection を呼び出して、ページング可能なコードまたはデータ セクションへのハンドルを取得します。 その後、ドライバーは MmLockPagableSectionByHandle と MmUnlockPagableImageSection を呼び出して、ハンドルの参照カウントをインクリメントおよびデクリメントできます。
MmLockPagableCodeSection または MmLockPagableDataSection 呼び出しは、ページング可能なセクションをシステム メモリにロックし、セクションへのハンドルを返し、ハンドルの参照カウントを 1 に初期化します。 MmLockPagableSectionByHandle は参照カウントを 1 ずつインクリメントし、 MmUnlockPagableImageSection は参照カウントを 1 ずつ減らします。
ハンドルの参照カウントが 0 以外の場合、ページング可能セクションはロックされます。 参照カウントが 0 の場合、セクションはロック解除されます。
ページング可能セクションへのハンドルは、ドライバーがメモリに読み込まれたままである限り有効なままです。 ドライバーは、同じハンドルを使用してセクションを繰り返しロックおよびロック解除できます。 つまり、ドライバーは、参照カウントが 0 であるハンドルを再利用できます。 MmLockPagableSectionByHandle は、参照されるセクションが呼び出し元のアドレス空間に存在するかどうかを確認し、存在する場合はセクションの参照カウントをインクリメントします。 セクションが常駐でない場合は、セクション内の MmLockPagableSectionByHandle ページをシステム空間でロックし、参照カウントを 1 に設定します。
システム メモリのリークを回避するには、ドライバーがメモリからアンロードされるときにハンドルの参照カウントを 0 にする必要があります。 それ以外の場合、ページング可能なセクションは、ドライバーのアンロード後もシステム メモリにロックされたままになります。
ドライバーがアンロードの準備をしていて、ハンドルの参照カウントが 0 以外の場合、ドライバーは MmUnlockPagableImageSection を呼び出して、アンロードが発生する前にカウントを 0 に減らします。
ドライバーは MmLockPagableSectionByHandle を呼び出して、IRP で渡されたユーザー バッファーをロックダウンできません。 代わりに MmProbeAndLockPages を使用してください。
ページング コードとデータの詳細については、「 ドライバーをページング可能にする」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h (Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |