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
無効なフラグ ビットマスク (または 0 以外のサイズ) が指定されています。
STATUS_INVALID_PAGE_PROTECTION
に含まれるアドレスで指定されたドライバーのセクションは、無効な保護によってマップされます (実行可能セクションはサポートされていません)
STATUS_NOT_SUPPORTED
指定したセクションは、この API でサポートされていないドライバーに属しています (「解説」を参照)。
STATUS_ACCESS_VIOLATION
指定されたセクションは破棄可能であるか、物理メモリによってサポートされていないギャップを含みます。 これは通常、セクションの配置がページ サイズよりも大きい場合に発生します。
STATUS_ALREADY_COMMITTED
指定したセクションは既に保護されています。

注釈

このルーチンは、VSM によって管理される SLAT テーブル (第 2 レベルのアドレス変換) を使用して、ドライバーのセクションをバックアップする物理メモリを保護します。 保護されたメモリは、オペレーティング システム全体に対して読み取り専用になります。 

セクションが保護された後は、保護を削除する方法がないことに注意してください。 これは仕様です。この規則の唯一の例外は、呼び出し元がMM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD フラグを指定する場合です。 その場合、ターゲット ドライバーがアンロードされると、保護されたセクションが解放され、解放されます。

大きなページとセッション ドライバーにマップされたドライバーは、 MmProtectDriverSection API ではサポートされていません。 さらに、この API の呼び出し元は、破棄可能なセクションまたは IAT (インポート アドレス テーブル) を含むセクションを保護するように要求することはできません。

呼び出し元が読み込まれたドライバー イメージに属していないアドレスを指定した場合、システムはMEMORY_MANAGEMENTバグチェック (型 0x1100) でクラッシュします。

MmProtectDriverSection API の呼び出し元は、IRQL <= APC_LEVELで実行する必要があります。

要件

要件
サポートされている最小のクライアント Windows Insider 19548 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= APC_LEVEL