mmProtectDriverSection 函式 (wdm.h)

MmProtectDriverSection 唯讀會使用虛擬安全模式所提供的服務, (VSM) 來保護已載入驅動程式的區段。

語法

NTSTATUS MmProtectDriverSection(
  [in] PVOID  AddressWithinSection,
  [in] SIZE_T Size,
  [in] ULONG  Flags
);

參數

[in] AddressWithinSection

屬於驅動程式映像之有效數據區段的指標。 數據區段不應該已經可執行,否則 API 將會因為STATUS_INVALID_PAGE_PROTECTION而失敗。

[in] Size

此參數目前保留供日後使用,且應設定為 0。

[in] Flags

指定控制作業的旗標:MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD – 用來指定驅動程式在受到保護區段之後仍可卸除。

傳回值

MmProtectDriverSection 會傳回 NTSTATUS 值,指出作業的結果:

傳回值 描述
STATUS_SUCCESS
作業已順利完成,且驅動程式區段已成功受到保護
STATUS_INVALID_DEVICE_STATE
虛擬安全模式 (VSM) 目前已停用,因此函式無法保護驅動程式區段。
STATUS_INVALID_PARAMETER
指定了無效的旗標位掩碼 (或非零大小) 。
STATUS_INVALID_PAGE_PROTECTION
不支援透過無效的保護 (可執行檔區段來對應其中包含的位址所指定的驅動程式區段)
STATUS_NOT_SUPPORTED
The specified section belongs to a driver that is not supported by this API (see Remarks).
STATUS_ACCESS_VIOLATION
指定的區段是可捨棄的,或包含不由任何物理記憶體支援的間距。 當區段對齊大於頁面大小時,通常會發生這種情況。
STATUS_ALREADY_COMMITTED
指定的區段已經受到保護。

備註

例程會使用 SLAT 數據表來保護驅動程式區段的實體記憶體, (第二層地址轉譯) 由 VSM 管理。 受保護的記憶體將會針對整個操作系統設為唯讀。 

請注意,在區段受到保護之後,就無法移除保護。 這是設計方式:唯一的例外是呼叫端指定MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD旗標時。 在此情況下,卸除目標驅動程式時,會釋放並釋放受保護的區段。

MmProtectDriverSection API 不支援與大型頁面和會話驅動程式對應的驅動程式。 此外,此 API 的呼叫端無法要求保護可捨棄的區段,或包含 IAT (匯入位址表的區段) 。

請注意,如果呼叫端指定不屬於任何已載入驅動程式映像的位址,系統會因為MEMORY_MANAGEMENT錯誤檢查 (類型0x1100) 而损毁。

MmProtectDriverSection API 的呼叫端應該在 IRQL <= APC_LEVEL執行。

規格需求

需求
最低支援的用戶端 從 Windows 測試人員 19548 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= APC_LEVEL