共用方式為


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 設定為鎖定狀態之後,必須先呼叫 mmProbeAndLockPages 來鎖定相同的 MDL,直到第一次呼叫 mmUnlockPages,才能解除鎖定 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 開始提供。
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 請參閱一節。
DDI 合規性規則 HwStorPortProhibitedDIs(storport)

另請參閱

IoBuildPartialMdl

mmBuildMdlForNonPagedPool

mmUnlockPages