MmSecureVirtualMemory 関数 (ntddk.h)
MmSecureVirtualMemory ルーチンは、解放できず、ページ保護をより制限できないように、ユーザー空間メモリアドレス範囲をセキュリティで保護します。
構文
HANDLE MmSecureVirtualMemory(
[in] PVOID Address,
[in] SIZE_T Size,
[in] ULONG ProbeMode
);
パラメーター
[in] Address
セキュリティで保護するユーザー仮想アドレス範囲の先頭。
[in] Size
セキュリティで保護する仮想アドレス範囲のサイズ (バイト単位)。
[in] ProbeMode
許可される最も制限の厳しいページ保護を指定します。 PAGE_READWRITEを使用して、アドレス範囲を読み取り可能と書き込み可能の両方に維持する必要があることを指定するか、PAGE_READONLYを使用してアドレス範囲を読み取り可能な状態に保つ必要があることを指定します。
ProbeMode | 意味 |
---|---|
PAGE_READWRITE | 保護をPAGE_NOACCESSまたはPAGE_READONLYに変更することはできません。 その他の保護の変更はすべて許可されます。 |
PAGE_READONLY | 保護をPAGE_NOACCESSに変更することはできません。 その他の保護の変更はすべて許可されます。 |
戻り値
成功すると、 MmSecureVirtualMemory は、ドライバーが MmUnsecureVirtualMemory ルーチンに渡してメモリ アドレス範囲を保護解除する不透明なポインター値を返します。 ルーチンがメモリ アドレス範囲をセキュリティで保護できない場合は、 NULL を返します。
注釈
MmSecureVirtualMemory を使用すると、ユーザー モード バッファーで特定の競合状態を回避できます。 たとえば、ドライバーがバッファーが書き込み可能かどうかを確認するが、元のユーザー モード プロセスでは、ドライバーがバッファーに書き込む前に読み取り専用にバッファーを変更する場合、競合状態が発生する可能性があります。 ドライバーは、 mmSecureVirtualMemory とPAGE_READWRITEプローブ モードを使用して、ドライバーが MmUnsecureVirtualMemory を呼び出すまでバッファーが書き込み可能なままであることを保証できます。 また、このルーチンは、バッファーを解放する元のユーザー モード プロセスから保護します。 これらのルーチンの呼び出しに関するいくつかのガイドラインを次に示します。
PAGE_READONLYで MmSecureVirtualMemory を 呼び出しても、バッファーが読み取り専用のままになる保証はありません。 読み取り専用プローブ モードでは、ユーザーがバッファーの保護をPAGE_NOACCESSに変更できなくなります。 保護をPAGE_READWRITE (またはマップされたビューの場合はPAGE_WRITECOPY) に変更することを防ぐ ことはありません 。
ドライバーが MmSecureVirtualMemory を 呼び出し、 MmUnsecureVirtualMemory を呼び出さない場合、プロセスの終了時にメモリは自動的にセキュリティで保護されません。
ドライバーが MmUnsecureVirtualMemory を呼び出す場合は、メモリが最初にセキュリティで保護されたプロセスのコンテキストで呼び出し、そのプロセスが終了する前に呼び出す必要があります。
通常、ドライバーはメモリをセキュリティで保護するときにプロセスを参照し、後で KeStackAttachProcess を呼び出して、 MmUnsecureVirtualMemory を呼び出す前にそのプロセスのコンテキストに切り替える必要があります。
プロセス終了ドライバーを検出するには、 PsSetCreateProcessNotifyRoutine を使用できます。 または、プロセスが終了するときに I/O マネージャーによって呼び出されるキャンセル ルーチンを使用して IRP を送信することもできます。 キャンセル ルーチンでは、ドライバーはプロセスにアタッチし、 MmUnsecureVirtualMemory を呼び出すことができます。
MmSecureVirtualMemory を使用すると、ページのアクセス許可が不十分なため、ユーザー メモリの読み取りまたは書き込みで例外が発生しないことを保証できますが、他の種類の例外から保護されません。 たとえば、システムがページ ファイルで不適切なディスク ブロックを検出したときに発生する例外から保護されません。 したがって、ドライバーは、 try/except ブロック内のすべてのユーザー メモリ アクセスをラップする必要があります。 このため、ドライバーではこの関数を使用しないことをお勧めします。 詳細については、「 例外の処理」を参照してください。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
Header | ntddk.h (Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |