共用方式為


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
指定的區段屬於此 API 不支援的驅動程式(請參閱。
STATUS_ACCESS_VIOLATION
指定的區段是可捨棄的,或包含不由任何物理記憶體支援的間距。 這通常會在區段對齊大於頁面大小時發生。
STATUS_ALREADY_COMMITTED
指定的區段已經受到保護。

言論

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

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

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

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

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

要求

要求 價值
最低支援的用戶端 從 Windows 測試人員 19548 開始提供。
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL