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) |