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 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 請參閱一節。 |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport) |