Condividi tramite


Funzione MmSecureVirtualMemory (ntddk.h)

La routine MmSecureVirtualMemory protegge un intervallo di indirizzi di memoria dello spazio utente in modo che non possa essere liberato e la relativa protezione della pagina non possa essere resa più restrittiva.

Sintassi

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

Parametri

[in] Address

Inizio dell'intervallo di indirizzi virtuali dell'utente da proteggere.

[in] Size

Dimensioni, in byte, dell'intervallo di indirizzi virtuali da proteggere.

[in] ProbeMode

Specifica la protezione della pagina più restrittiva consentita. Utilizzare PAGE_READWRITE per specificare che l'intervallo di indirizzi deve rimanere leggibile e scrivibile oppure utilizzare PAGE_READONLY per specificare che l'intervallo di indirizzi deve rimanere leggibile solo.

ProbeMode Significato
PAGE_READWRITE La protezione non può essere modificata in PAGE_NOACCESS o PAGE_READONLY. Sono consentite tutte le altre modifiche alla protezione.
PAGE_READONLY La protezione non può essere modificata in PAGE_NOACCESS. Sono consentite tutte le altre modifiche alla protezione.

Valore restituito

In caso di esito positivo, MmSecureVirtualMemory restituisce un valore puntatore opaco che il driver passa al MmUnsecureVirtualMemory routine per rimuovere la protezione dell'intervallo di indirizzi di memoria. Se la routine non è in grado di proteggere l'intervallo di indirizzi di memoria, restituisce NULL.

Osservazioni

MmSecureVirtualMemory può essere usato per evitare determinate condizioni di race condition nei buffer in modalità utente. Ad esempio, se un driver verifica se il buffer è scrivibile, ma il processo in modalità utente di origine modifica il buffer in modo che sia di sola lettura prima che il driver possa scrivere nel buffer, può verificarsi una race condition. Il driver può usare mmSecureVirtualMemory con PAGE_READWRITE modalità probe per garantire che il buffer rimanga scrivibile finché il driver non chiama MmUnsecureVirtualMemory. La routine protegge anche dal processo in modalità utente di origine liberando il buffer. Ecco alcune linee guida sulla chiamata di queste routine:

  • La chiamata a MmSecureVirtualMemory con PAGE_READONLY non garantisce che il buffer rimanga di sola lettura. La modalità probe di sola lettura impedisce all'utente di modificare la protezione del buffer in PAGE_NOACCESS. Non impedire la modifica della protezione in PAGE_READWRITE (o PAGE_WRITECOPY, per le visualizzazioni mappate).

  • Se un driver chiama MmSecureVirtualMemory e non chiama MmUnsecureVirtualMemory, la memoria viene automaticamente non protetta al termine del processo.

  • Se il driver chiama MmUnsecureVirtualMemory, deve chiamarlo nel contesto del processo in cui è stata originariamente protetta la memoria e prima che il processo venga terminato.

  • In genere i driver devono fare riferimento al processo quando proteggono la memoria, quindi chiamare successivamente KeStackAttachProcess per passare al contesto di tale processo prima di chiamare MmUnsecureVirtualMemory.

  • Per rilevare i driver di terminazione dei processi, è possibile usare PsSetCreateProcessNotifyRoutine. In alternativa, il processo può inviare un IRP con una routine di annullamento richiamata dal gestore di I/O quando il processo viene chiuso. Nella routine di annullamento il driver può connettersi al processo e chiamare MmUnsecureVirtualMemory.

Sebbene mmSecureVirtualMemory può essere usato per garantire che la lettura o la scrittura della memoria utente non generi un'eccezione a causa di autorizzazioni di pagina insufficienti, non protegge da altri tipi di eccezioni. Ad esempio, non protegge dalle eccezioni generate quando il sistema trova un blocco di disco non valido nel file di pagina. Pertanto, i driver devono comunque eseguire il wrapping di tutti gli accessi alla memoria utente in un try/except block. Per questo motivo, è consigliabile che i driver non usino questa funzione. Per altre informazioni, vedere gestione delle eccezioni.

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
intestazione ntddk.h (include Ntddk.h)
libreria NtosKrnl.lib
dll NtosKrnl.exe
IRQL <=APC_LEVEL
regole di conformità DDI HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm)

Vedere anche

MmUnsecureVirtualMemory