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

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

[in] ProbeMode

Specifica la protezione della pagina più restrittiva consentita. Usare PAGE_READWRITE per specificare che l'intervallo di indirizzi deve rimanere leggibile e scrivibile oppure usare 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 Non è possibile modificare la protezione 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 alla routine MmUnsecureVirtualMemory per annullare la protezione dell'intervallo di indirizzi di memoria. Se la routine non è in grado di proteggere l'intervallo di indirizzi di memoria, restituisce NULL.

Commenti

MmSecureVirtualMemory può essere usato per evitare determinate 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 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 chiama MmUnsecureVirtualMemory. La routine protegge anche dal processo in modalità utente di origine liberando il buffer. Ecco alcune linee guida su come chiamare 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 impedisce di modificare la 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 la memoria è stata originariamente protetta e prima che il processo venga terminato.

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

  • Per rilevare i driver di terminazione del processo, è 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.

Anche se 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 blocco try/except . Per questo motivo, è consigliabile che i driver non usino questa funzione. Per altre informazioni, vedere Gestione delle eccezioni.

Requisiti

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)

Vedi anche

MmUnsecureVirtualMemory