共用方式為


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 try/except 區塊中。 因此,我們建議驅動程式不使用此函式。 如需詳細資訊,請參閱 處理例外狀況

要求

要求 價值
目標平臺 普遍
標頭 ntddk.h (包括 Ntddk.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIs(storport)IrqlMmApcLte(wdm)

另請參閱

mmUnsecureVirtualMemory