Share via


MmProbeAndLockPages 関数 (wdm.h)

MmProbeAndLockPages ルーチンは、指定された仮想メモリ ページをプローブし、それらを常駐させ、メモリ内でロックします (DMA 転送の場合など)。 これにより、デバイス ドライバー (またはハードウェア) でページを引き続き使用している間は、ページを解放して再割り当てできなくなります。

構文

void MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

パラメーター

[in, out] MemoryDescriptorList

仮想メモリ バッファーを指定する MDL へのポインター。 ルーチンがメモリ内のページを正常にロックすると、基になる物理ページを記述するように MDL が更新されます。

[in] AccessMode

引数をプローブするアクセス モード ( KernelMode または UserMode)。

[in] Operation

呼び出し元がアクセス権をプローブし、ページをロックする操作の種類。 このパラメーターを IoReadAccess、IoWriteAccess、または IoModifyAccess に設定します。 IoReadAccess は、ドライバーがバッファーの内容を調べることができるが、内容を変更できないことを示します。 IoWriteAccessIoModifyAccess は同等であり、ドライバーがバッファーへの読み取りと書き込みの両方のアクセス権を持っていることを示します。

戻り値

なし

解説

ダイレクト I/O を使用する階層化されたドライバーのチェーン内の最上位レベルのドライバーは、このルーチンを呼び出します。 バッファー I/O を使用するドライバーは 、MmProbeAndLockPages を呼び出しません。

MmProbeAndLockPages は 、次の操作を実行します。

  1. 指定したメモリ範囲がバッキング ストア (ディスク、ネットワークなど) にページングされる場合、 MmProbeAndLockPages によってそれが常駐します。
  2. その後、ルーチンは、 ページが Operation パラメーターで指定された操作を許可することを確認します。
  3. メモリ範囲で指定された操作が許可されている場合、ルーチンはページアウトできないようにメモリ内のページをロックします。ページのロックを解除するには 、MmUnlockPages ルーチンを使用します。
  4. 最後に、ルーチンは MDL 内の ページ フレーム番号 (PFN) 配列を更新して、ロックされた物理ページを記述します。
MmProbeAndLockPages を正常に呼び出すと、MDL 内のページがロックされ、MDL 構造体がロック状態に設定されます。 このような呼び出しはすべて、ページのロックを解除し、MDL をロック解除状態に設定する MmUnlockPages への対応する呼び出しと一致する必要があります。 MmProbeAndLockPages 呼び出しによって MDL がロック状態に設定された後、MmProbeAndLockPages を 2 回目に呼び出して同じ MDL をロックすることは、MDL のロックを解除するために MmUnlockPages が最初に呼び出されるまで許可されません。

2 つ以上の MDL で同じ物理ページが記述されている場合、ページは MDL ごとに 1 回ずつ複数回ロックできます。 最後の MDL がロック解除状態に設定されると、ページはロック解除されます。

MmBuildMdlForNonPagedPoolIoBuildPartialMdl などのルーチンは、MDL を更新して、非ページまたは既にロックされているページを記述します。 このような MDL をロックまたはロック解除するための MmProbeAndLockPages または MmUnlockPages の呼び出しは許可されません。

MmProbeAndLockPages の呼び出しは、try/except ブロックで囲む必要があります。 ページで指定された操作がサポートされていない場合、ルーチンはSTATUS_ACCESS_VIOLATIONまたはその他の例外を発生させます。 詳細については、「 例外の処理」を参照してください。

MmProbeAndLockPages の呼び出し元は、ページング可能なアドレスの場合は IRQL <= APC_LEVEL、ページ不可能なアドレスの場合は IRQL <= DISPATCH_LEVELで実行されている必要があります。

このルーチンは、これらのページを記述する仮想アドレスに関する保証を提供しません (つまり、仮想アドレスがマップ解除され、再利用される可能性があります)。 ただし、正常に戻った場合、物理ページはロックされます。

ページ フォールトを回避するには、 VirtualLock を使用して仮想アドレスをロックし、アプリがロックを解除するか、 VirtualFree または UnmapViewOfFile を呼び出して明示的に解放しない限り、トリミングされないようにします。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL 「解説」を参照してください。
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport)

こちらもご覧ください

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages