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 會執行下列作業:
- 如果指定的記憶體範圍分頁到備份存儲區 (磁碟、網路等 ) ,MmProbeAndLockPages 就會讓它成為駐留狀態。
- 然後,例程會確認頁面允許 Operation 參數指定的作業。
- 如果記憶體範圍允許指定的作業,例程會鎖定記憶體中的分頁,使其無法分頁。使用 MmUnlockPages 例程來解除鎖定頁面。
- 最後,例程會更新 MDL 中 PFN) 陣列 (頁框架編號 ,以描述鎖定的實體頁面。
如果兩個或多個 MDL 描述相同的實體頁面,則頁面可以多次鎖定,每個 MDL 一次。 當最後一個 MDL 設定為解除鎖定狀態時,頁面就會解除鎖定。
MmBuildMdlForNonPagedPool 或 IoBuildPartialMdl 等例程會更新 MDL,以描述無法分頁或已鎖定的頁面。 不允許呼叫 MmProbeAndLockPages 或 MmUnlockPages 來鎖定或解除鎖定這類 MDL。
對 MmProbeAndLockPages 的呼叫必須包含在 try/except 區塊中。 如果頁面不支援指定的作業,則例程會引發STATUS_ACCESS_VIOLATION或其他例外狀況。 如需詳細資訊,請參閱 處理例外狀況。
MmProbeAndLockPages 的呼叫端必須在 IRQL <= APC_LEVEL針對可分頁位址執行,或在 IRQL <= DISPATCH_LEVEL為不可分頁地址執行。
此例程不提供描述這些頁面 (虛擬位址的任何保證,也就是虛擬位址可能未對應、重複使用等等) 。 不過,實體頁面保證會在成功傳回時鎖定。
若要避免頁面錯誤,請使用 VirtualLock 來鎖定虛擬位址,因此除非應用程式解除鎖定,或藉由呼叫 VirtualFree 或 UnmapViewOfFile 明確釋放它,否則不會加以修剪。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | 請參閱一節。 |
DDI 合規性規則 | HwStorPortProhibitedDIS (storport) |