MmSecureVirtualMemory 函式 (ntddk.h)

MmSecureVirtualMemory 例程會保護用戶空間記憶體位址範圍,使其無法釋放,而且無法限制其頁面保護。

語法

HANDLE MmSecureVirtualMemory(
  [in] PVOID  Address,
  [in] SIZE_T Size,
  [in] ULONG  ProbeMode
);

參數

[in] Address

要保護的使用者虛擬位址範圍的開頭。

[in] Size

要保護之虛擬位址範圍的大小,以位元組為單位。

[in] ProbeMode

指定允許的最嚴格頁面保護。 使用PAGE_READWRITE指定位址範圍必須同時保持可讀取和可寫入,或使用PAGE_READONLY指定位址範圍只能保持可讀取狀態。

ProbeMode 意義
PAGE_READWRITE 保護無法變更為PAGE_NOACCESS或PAGE_READONLY。 允許所有其他保護變更。
PAGE_READONLY 保護無法變更為PAGE_NOACCESS。 允許所有其他保護變更。

傳回值

成功時, MmSecureVirtualMemory 會傳回不透明的指標值,驅動程式會傳遞至 MmUnsecureVirtualMemory 例程,以不安全記憶體位址範圍。 如果例程無法保護記憶體位址範圍,則會傳回 NULL

備註

MmSecureVirtualMemory 可用來避免使用者模式緩衝區上的特定競爭狀況。 例如,如果驅動程式檢查緩衝區是否可寫入,但原始使用者模式進程會將緩衝區變更為只讀,驅動程式才能寫入緩衝區,則競爭條件可能會產生。 驅動程式可以使用 MmSecureVirtualMemory 搭配PAGE_READWRITE探查模式,以確保在驅動程式呼叫 MmUnsecureVirtualMemory 之前,緩衝區仍可寫入。 例程也會防止原始使用者模式進程釋放緩衝區。 以下是呼叫這些例程的一些指導方針:

  • 呼叫具有 PAGE_READONLY 的 MmSecureVirtualMemory 不保證緩衝區會保持只讀狀態。 只讀探查模式可防止使用者將緩衝區的保護變更為PAGE_NOACCESS。 它 不會 防止將保護變更為對應檢視PAGE_READWRITE (或PAGE_WRITECOPY) 。

  • 如果驅動程式呼叫 MmSecureVirtualMemory 且未呼叫 MmUnsecureVirtualMemory,當進程終止時,記憶體會自動不安全。

  • 如果驅動程式呼叫 MmUnsecureVirtualMemory,它必須在原本保護記憶體的進程內容中呼叫它,並在該進程終止之前呼叫它。

  • 驅動程式通常需要在保護記憶體時參考進程,然後稍後呼叫 KeStackAttachProcess 以在呼叫 MmUnsecureVirtualMemory 之前切換至該程式的內容。

  • 若要偵測進程終止驅動程式,可以使用 PsSetCreateProcessNotifyRoutine。 或者,進程可以提交 IRP,其中包含在進程結束時由 I/O 管理員叫用的取消例程。 在取消例程中,驅動程式可以附加至進程,並呼叫 MmUnsecureVirtualMemory

雖然 MmSecureVirtualMemory 可用來保證讀取或寫入使用者記憶體不會因為頁面許可權不足而引發例外狀況,但不會防止其他類型的例外狀況。 例如,當系統在頁面檔案中發現不正確的磁碟區塊時,它不會防範引發的例外狀況。 因此,驅動程式仍必須將所有用戶記憶體存取包裝在 try/except 區塊中。 因此,我們建議驅動程式不使用此函式。 如需詳細資訊,請參閱 處理例外狀況

規格需求

需求
目標平台 Universal
標頭 ntddk.h (包含 Ntddk.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <=APC_LEVEL
DDI 合規性規則 HwStorPortProhibitedDDIs (storport) IrqlMmApcLte (wdm)

另請參閱

MmUnsecureVirtualMemory