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