次の方法で共有


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 は、ドライバーがバッファーの内容を調べることができるが、内容を変更できないことを示します。 IoWriteAccess と IoModifyAccess します。これは、ドライバーがバッファーへの読み取りアクセスと書き込みアクセスの両方を持っていることを示します。

戻り値

何一つ

備考

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

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

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

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

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

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

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

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

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

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 「解説」セクションを参照してください。
DDI コンプライアンス規則 する hwStorPortProhibitedDDDIs(storport) する

関連項目

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages