Funzione MmProbeAndLockPages (wdm.h)
Il MmProbeAndLockPages esegue il probe delle pagine di memoria virtuale specificate, li rende residenti e li blocca in memoria(ad esempio per un trasferimento DMA). Ciò garantisce che le pagine non possano essere liberate e riallocate mentre un driver di dispositivo (o hardware) li sta ancora usando.
Sintassi
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
Parametri
[in, out] MemoryDescriptorList
Puntatore a un MDL che specifica un buffer di memoria virtuale. Se la routine blocca correttamente le pagine in memoria, il file MDL viene aggiornato per descrivere le pagine fisiche sottostanti.
[in] AccessMode
Modalità di accesso in cui eseguire il probe degli argomenti, KernelMode o UserMode.
[in] Operation
Tipo di operazione per cui il chiamante vuole che i diritti di accesso venga eseguito il probe e le pagine bloccate. Impostare questo parametro su IoReadAccess, IoWriteAccesso IoModifyAccess. IoReadAccess indica che il driver può esaminare il contenuto del buffer, ma non può modificare il contenuto. IoWriteAccess e IoModifyAccess, equivalenti, indicano che il driver ha accesso in lettura e scrittura al buffer.
Valore restituito
Nessuno
Osservazioni
Il driver di livello più alto in una catena di driver a più livelli che usano operazioni di I/O dirette chiama questa routine. I driver che usano i/O memorizzati nel buffer non chiamano mai MmProbeAndLockPages.
MmProbeAndLockPages esegue le operazioni seguenti:
- Se l'intervallo di memoria specificato viene eseguito il paging in un archivio di backup (disco, rete e così via), MmProbeAndLockPages lo rende residente.
- La routine conferma quindi che le pagine consentono l'operazione specificata dal parametro Operation.
- Se l'intervallo di memoria consente l'operazione specificata, la routine blocca le pagine in memoria in modo che non possano essere distribuiti. Utilizzare la routine MmUnlockPages per sbloccare le pagine.
- Infine, la routine aggiorna la matrice numero di fotogrammi di pagina (PFN) nel file MDL per descrivere le pagine fisiche bloccate.
Se due o più MDL descrivono la stessa pagina fisica, la pagina può essere bloccata più volte, una volta per ogni MDL. La pagina viene sbloccata quando l'ultimo MDL è impostato sullo stato sbloccato.
Una routine, ad esempio MmBuildMdlForNonPagedPool o IoBuildPartialMdl aggiorna un file MDL per descrivere le pagine non bloccabili o già bloccate. Una chiamata a MmProbeAndLockPages o MmUnlockPages per bloccare o sbloccare tale MDL non è consentita.
Le chiamate a MmProbeAndLockPages devono essere racchiuse in un blocco try/except. Se le pagine non supportano l'operazione specificata, la routine genera il STATUS_ACCESS_VIOLATION o altre eccezioni. Per altre informazioni, vedere gestione delle eccezioni.
I chiamanti di MmProbeAndLockPages devono essere eseguiti in IRQL <= APC_LEVEL per gli indirizzi impaginabili o in IRQL <= DISPATCH_LEVEL per gli indirizzi non impaginabili.
Questa routine non fornisce alcuna garanzia sull'indirizzo virtuale che descrive queste pagine, ovvero l'indirizzo virtuale potrebbe essere decompresso, riutilizzato e così via. Tuttavia, è garantito che le pagine fisiche vengano bloccate in caso di esito positivo.
Per evitare errori di pagina, usare VirtualLock per bloccare l'indirizzo virtuale in modo che non venga tagliato a meno che l'app non lo sblocchi o lo libera esplicitamente chiamando VirtualFree o UnmapViewOfFile.