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

用來探查 KernelModeUserMode 自變數的存取模式。

[in] Operation

呼叫端想要探查訪問許可權並鎖定頁面的作業類型。 將此參數設定為 IoReadAccessIoWriteAccessIoModifyAccessIoReadAccess 指出驅動程式可以檢查緩衝區的內容,但無法變更內容。 IoWriteAccessIoModifyAccess 相等,表示驅動程式具有緩衝區的讀取和寫入存取權。

傳回值

備註

使用直接 I/O 之分層驅動程式鏈結中的最高層級驅動程式會呼叫此例程。 使用緩衝 I/O 的驅動程序永遠不會呼叫 MmProbeAndLockPages

MmProbeAndLockPages 會執行下列作業:

  1. 如果指定的記憶體範圍分頁到備份存儲區 (磁碟、網路等 ) ,MmProbeAndLockPages 就會讓它成為駐留狀態。
  2. 然後,例程會確認頁面允許 Operation 參數指定的作業。
  3. 如果記憶體範圍允許指定的作業,例程會鎖定記憶體中的分頁,使其無法分頁。使用 MmUnlockPages 例程來解除鎖定頁面。
  4. 最後,例程會更新 MDL 中 PFN) 陣列 (頁框架編號 ,以描述鎖定的實體頁面。
成功呼叫 MmProbeAndLockPages 會鎖定 MDL 中的頁面,並將 MDL 結構設定為鎖定狀態。 每個這類呼叫都必須與 對應呼叫 MmUnlockPages 進行比對,以解除鎖定頁面並將 MDL 設定為解除鎖定狀態。 在 MmProbeAndLockPages 呼叫將 MDL 設定為鎖定狀態之後,必須先呼叫 MmUnlockPages 來解除鎖定 MDL,否則不允許第二次呼叫 MmProbeAndLockPages 來鎖定相同的 MDL。

如果兩個或多個 MDL 描述相同的實體頁面,則頁面可以多次鎖定,每個 MDL 一次。 當最後一個 MDL 設定為解除鎖定狀態時,頁面就會解除鎖定。

MmBuildMdlForNonPagedPoolIoBuildPartialMdl 等例程會更新 MDL,以描述無法分頁或已鎖定的頁面。 不允許呼叫 MmProbeAndLockPagesMmUnlockPages 來鎖定或解除鎖定這類 MDL。

對 MmProbeAndLockPages 的呼叫必須包含在 try/except 區塊中。 如果頁面不支援指定的作業,則例程會引發STATUS_ACCESS_VIOLATION或其他例外狀況。 如需詳細資訊,請參閱 處理例外狀況

MmProbeAndLockPages 的呼叫端必須在 IRQL <= APC_LEVEL針對可分頁位址執行,或在 IRQL <= DISPATCH_LEVEL為不可分頁地址執行。

此例程不提供描述這些頁面 (虛擬位址的任何保證,也就是虛擬位址可能未對應、重複使用等等) 。 不過,實體頁面保證會在成功傳回時鎖定。

若要避免頁面錯誤,請使用 VirtualLock 來鎖定虛擬位址,因此除非應用程式解除鎖定,或藉由呼叫 VirtualFreeUnmapViewOfFile 明確釋放它,否則不會加以修剪。

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL 請參閱一節。
DDI 合規性規則 HwStorPortProhibitedDIS (storport)

另請參閱

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages