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

呼び出し元がアクセス権をプローブし、ページをロックする操作の種類。 このパラメーターを IoReadAccessIoWriteAccess、または 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 がロック状態に設定された後、MmUnlockPages が最初に呼び出されて MDL のロックが解除されるまで、同じ MDL をロックするための MmProbeAndLockPages への 2 回目の呼び出しは許可されません。

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