Funzione MmProbeAndLockPages (wdm.h)
La routine MmProbeAndLockPages esegue il probe delle pagine di memoria virtuale specificate, le rende residenti e le 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 desidera che i diritti di accesso e le pagine bloccate. Impostare questo parametro su IoReadAccess, IoWriteAccess o 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 impaginato 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 PFN (Page Frame Number ) 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 MDL per descrivere le pagine che non sono disponibili 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 la STATUS_ACCESS_VIOLATION o altre eccezioni. Per altre informazioni, vedere Gestione delle eccezioni.
I chiamanti di MmProbeAndLockPages devono essere in esecuzione in IRQL <= APC_LEVEL per gli indirizzi impaginabili o in IRQL <= DISPATCH_LEVEL per indirizzi non impaginabili.
Questa routine non fornisce alcuna garanzia sull'indirizzo virtuale che descrive queste pagine, ovvero l'indirizzo virtuale potrebbe essere non mappato, riutilizzato e così via. Tuttavia, le pagine fisiche devono essere bloccate in caso di restituzione riuscita.
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 sblocca o lo libera esplicitamente chiamando VirtualFree o UnmapViewOfFile.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile a partire da Windows 2000. |
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Vedere la sezione Osservazioni. |
Regole di conformità DDI | HwStorPortProhibitedDDIs(storport) |