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:

  1. Se l'intervallo di memoria specificato viene impaginato in un archivio di backup (disco, rete e così via), MmProbeAndLockPages lo rende residente.
  2. La routine conferma quindi che le pagine consentono l'operazione specificata dal parametro Operation .
  3. 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.
  4. Infine, la routine aggiorna la matrice PFN (Page Frame Number ) nel file MDL per descrivere le pagine fisiche bloccate.
Una chiamata riuscita a MmProbeAndLockPages blocca le pagine in un MDL e imposta la struttura MDL sullo stato bloccato. Ogni chiamata di questo tipo deve essere abbinata da una chiamata corrispondente a MmUnlockPages che sblocca le pagine e imposta il codice MDL sullo stato sbloccato. Dopo che una chiamata MmProbeAndLockPages imposta un MDL sullo stato bloccato, una seconda chiamata a MmProbeAndLockPages per bloccare lo stesso MDL non è consentita finché MmUnlockPages non viene chiamato per la prima volta per sbloccare il file MDL.

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)

Vedi anche

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages