Freigeben über


MmSecureVirtualMemory-Funktion (ntddk.h)

Die MmSecureVirtualMemory Routine sichert einen Adressbereich des Benutzerspeicherspeichers, sodass er nicht freigegeben werden kann und der Seitenschutz nicht restriktiver gestaltet werden kann.

Syntax

HANDLE MmSecureVirtualMemory(
  [in] PVOID  Address,
  [in] SIZE_T Size,
  [in] ULONG  ProbeMode
);

Parameter

[in] Address

Der Anfang des virtuellen Adressbereichs des Benutzers, der gesichert werden soll.

[in] Size

Die Größe des virtuellen Adressbereichs in Byte, der gesichert werden soll.

[in] ProbeMode

Gibt den restriktivsten Seitenschutz an, der zulässig ist. Verwenden Sie PAGE_READWRITE, um anzugeben, dass der Adressbereich sowohl lesbar als auch schreibbar bleiben muss, oder verwenden Sie PAGE_READONLY, um anzugeben, dass der Adressbereich nur lesbar bleiben darf.

ProbeMode Bedeutung
PAGE_READWRITE Der Schutz kann nicht in PAGE_NOACCESS oder PAGE_READONLY geändert werden. Alle anderen Schutzänderungen sind zulässig.
PAGE_READONLY Der Schutz kann nicht in PAGE_NOACCESS geändert werden. Alle anderen Schutzänderungen sind zulässig.

Rückgabewert

Bei Erfolg gibt MmSecureVirtualMemory einen undurchsichtigen Zeigerwert zurück, den der Treiber an die MmUnsecureVirtualMemory Routine zurückgibt, um den Speicheradressbereich zu entsichern. Wenn die Routine den Speicheradressbereich nicht sichern kann, wird NULL-zurückgegeben.

Bemerkungen

MmSecureVirtualMemory kann verwendet werden, um bestimmte Racebedingungen für Benutzermoduspuffer zu vermeiden. Wenn z. B. ein Treiber überprüft, ob der Puffer schreibbar ist, der ursprüngliche Benutzermodusprozess den Puffer jedoch so ändert, dass er schreibgeschützt ist, bevor der Treiber in den Puffer schreiben kann, kann eine Rennbedingung dazu führen. Der Treiber kann MmSecureVirtualMemory mit PAGE_READWRITE Probemodus verwenden, um sicherzustellen, dass der Puffer schreibbar bleibt, bis der Treiber MmUnsecureVirtualMemoryaufruft. Die Routine schützt auch vor dem ursprünglichen Benutzermodusprozess, der den Puffer freigibt. Hier sind einige Richtlinien zum Aufrufen dieser Routinen:

  • Das Aufrufen MmSecureVirtualMemory mit PAGE_READONLY garantiert nicht, dass der Puffer schreibgeschützt bleibt. Der schreibgeschützte Probemodus verhindert, dass der Benutzer den Schutz des Puffers in PAGE_NOACCESS ändert. Es nicht verhindern, dass der Schutz in PAGE_READWRITE (oder PAGE_WRITECOPY) für zugeordnete Ansichten geändert wird.

  • Wenn ein Treiber MmSecureVirtualMemory aufruft und nicht MmUnsecureVirtualMemoryaufruft, wird der Speicher automatisch ungesichert, wenn der Prozess beendet wird.

  • Wenn der Treiber MmUnsecureVirtualMemoryaufruft, muss er ihn im Kontext des Prozesses aufrufen, in dem der Speicher ursprünglich gesichert wurde, und bevor dieser Prozess beendet wird.

  • In der Regel müssen Treiber beim Sichern des Speichers auf den Prozess verweisen. Rufen Sie später KeStackAttachProcess- auf, um zum Kontext dieses Prozesses zu wechseln, bevor Sie MmUnsecureVirtualMemoryaufrufen.

  • Um Prozessbeendigungstreiber zu erkennen, können PsSetCreateProcessNotifyRoutineverwendet werden. Alternativ kann der Prozess ein IRP mit einer Abbruchroutine übermitteln, die vom E/A-Manager aufgerufen wird, wenn der Prozess beendet wird. In der Cancel-Routine kann der Treiber an den Prozess anfügen und MmUnsecureVirtualMemoryaufrufen.

Während MmSecureVirtualMemory verwendet werden kann, um sicherzustellen, dass das Lesen oder Schreiben des Benutzerspeichers aufgrund unzureichender Seitenberechtigungen keine Ausnahme auslöst, schützt es nicht vor anderen Arten von Ausnahmen. Sie schützt beispielsweise nicht vor Ausnahmen, die ausgelöst werden, wenn das System einen fehlerhaften Datenträgerblock in der Seitendatei findet. Daher müssen Treiber weiterhin alle Benutzerspeicherzugriffe in einem try/except Block umschließen. Aus diesem Gründen wird empfohlen, dass Treiber diese Funktion nicht verwenden. Weitere Informationen finden Sie unter Behandeln von Ausnahmen.

Anforderungen

Anforderung Wert
Zielplattform- Universal
Header- ntddk.h (include Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <=APC_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm)

Siehe auch

MmUnsecureVirtualMemory