Freigeben über


MmSecureVirtualMemory-Funktion (ntddk.h)

Die MmSecureVirtualMemory-Routine sichert einen Speicheradressbereich für den Benutzerspeicher, 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 zu sichernden virtuellen Adressbereichs des Benutzers.

[in] Size

Die Größe des zu sichernden virtuellen Adressbereichs in Bytes.

[in] ProbeMode

Gibt den restriktivsten Seitenschutz an, der zulässig ist. Verwenden Sie PAGE_READWRITE, um anzugeben, dass der Adressbereich sowohl lesbar als auch beschreibbar 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 übergibt, um den Speicheradressbereich zu unsicher zu machen. Wenn die Routine den Speicheradressbereich nicht schützen kann, gibt sie NULL zurück.

Hinweise

MmSecureVirtualMemory kann verwendet werden, um bestimmte Racebedingungen in Benutzermoduspuffern zu vermeiden. Wenn ein Treiber beispielsweise überprüft, ob der Puffer beschreibbar 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 Racebedingung entstehen. Der Treiber kann MmSecureVirtualMemory mit PAGE_READWRITE Testmodus verwenden, um sicherzustellen, dass der Puffer beschreibbar bleibt, bis der Treiber MmUnsecureVirtualMemory aufruft. Die Routine schützt auch vor dem Ursprünglichen Benutzermodusprozess, der den Puffer freigibt. Hier sind einige Richtlinien zum Aufrufen dieser Routinen:

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

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

  • Wenn der Treiber MmUnsecureVirtualMemory aufruft, muss er es 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 Arbeitsspeichers auf den Prozess verweisen und später KeStackAttachProcess aufrufen, um zum Kontext dieses Prozesses zu wechseln, bevor MmUnsecureVirtualMemory aufgerufen wird.

  • Um Prozessabbruchtreiber zu erkennen, können Sie PsSetCreateProcessNotifyRoutine verwenden. Alternativ kann der Prozess eine IRP mit einer Abbruchroutine übermitteln, die vom E/A-Manager aufgerufen wird, wenn der Prozess beendet wird. In der Abbruchroutine kann der Treiber an den Prozess anfügen und MmUnsecureVirtualMemory aufrufen.

MmSecureVirtualMemory kann zwar verwendet werden, um sicherzustellen, dass beim Lesen oder Schreiben des Benutzerspeichers aufgrund unzureichender Seitenberechtigungen keine Ausnahme ausgelöst wird, es schützt jedoch 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 Auslagerungsdatei findet. Daher müssen Treiber weiterhin alle Benutzerspeicherzugriffe in einen Try/Except-Block einschließen. Daher wird empfohlen, dass Treiber diese Funktion nicht verwenden. Weitere Informationen finden Sie unter Behandeln von Ausnahmen.

Anforderungen

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

Weitere Informationen

MmUnsecureVirtualMemory