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