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) 目前已停用,因此函式無法保護驅動程式區段。 |
|
指定了無效的旗標位掩碼(或非零大小)。 |
|
找不到位址所指定的驅動程式區段會透過無效的保護來對應(不支援可執行的區段) |
|
指定的區段屬於此 API 不支援的驅動程式(請參閱。 |
|
指定的區段是可捨棄的,或包含不由任何物理記憶體支援的間距。 這通常會在區段對齊大於頁面大小時發生。 |
|
指定的區段已經受到保護。 |
言論
例程會使用 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 |