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 は、ユーザー モード バッファーの特定の競合状態を回避するために使用できます。 たとえば、ドライバーがバッファーが書き込み可能かどうかを確認するが、元のユーザー モード プロセスは、ドライバーがバッファーに書き込む前に読み取り専用にバッファーを変更する場合、競合状態が発生する可能性があります。 ドライバーは、PAGE_READWRITE プローブ モード mmSecureVirtualMemory を使用して、ドライバーが mmUnsecureVirtualMemory呼び出すまでバッファーが書き込み可能なままであることを保証できます。 また、このルーチンは、バッファーを解放する元のユーザー モード プロセスから保護します。 これらのルーチンの呼び出しに関するいくつかのガイドラインを次に示します。
PAGE_READONLY mmSecureVirtualMemory を呼び出しても、バッファーが読み取り専用のままであるとは限りません。 読み取り専用プローブ モードを使用すると、ユーザーはバッファーの保護をPAGE_NOACCESSに変更できなくなります。 保護 PAGE_READWRITE (マップされたビューの場合はPAGE_WRITECOPY) に変更できない。
ドライバーが mmSecureVirtualMemory 呼び出し、mmUnsecureVirtualMemory 呼び出さない場合、プロセスの終了時にメモリは自動的にセキュリティで保護されません。
ドライバーが mmUnsecureVirtualMemory 呼び出す場合は、メモリが最初にセキュリティで保護されたプロセスのコンテキストで呼び出す必要があります。そのプロセスが終了する前に呼び出す必要があります。
通常、ドライバーはメモリをセキュリティで保護するときにプロセスを参照する必要があります。その後、後で KeStackAttachProcess を呼び出して、そのプロセスのコンテキストに切り替えてから、MmUnsecureVirtualMemoryを呼び出す必要があります。
プロセス終了ドライバーを検出するには、psSetCreateProcessNotifyRoutine を使用できます。 または、プロセスの終了時に I/O マネージャーによって呼び出されるキャンセル ルーチンを含む IRP を送信することもできます。 取り消しルーチンでは、ドライバーはプロセスにアタッチし、mmUnsecureVirtualMemory 呼び出すことができます。
mmSecureVirtualMemory 使用して、ページのアクセス許可が不十分なため、ユーザー メモリの読み取りまたは書き込みで例外が発生しないことを保証できますが、他の種類の例外から保護されません。 たとえば、システムがページ ファイルで無効なディスク ブロックを見つけたときに発生する例外から保護されません。 そのため、ドライバーは引き続き、try/except ブロック内のすべてのユーザー メモリ アクセスをラップする必要があります。 このため、ドライバーはこの関数を使用しないことをお勧めします。 詳細については、「例外の処理」を参照してください。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 万国 |
ヘッダー | ntddk.h (Ntddk.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
DDI コンプライアンス規則 を する | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |