Funzione MmAdvanceMdl (wdm.h)

La routine MmAdvanceMdl avanza l'inizio dell'intervallo di memoria virtuale di un MDL in base al numero specificato di byte.

Sintassi

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Parametri

[in, out] Mdl

Specifica l'MDL da avanzare.

[in] NumberOfBytes

Specifica il numero di byte per avanzare all'inizio dell'MDL.

Valore restituito

MmAdvanceMdl restituisce un codice NTSTATUS. I valori restituiti possibili includono:

Codice restituito Descrizione
STATUS_SUCCESS
La routine ha avanzato correttamente l'inizio del MDL.
STATUS_INVALID_PARAMETER_2
Il chiamante ha tentato di avanzare l'inizio del MDL oltre la fine.

Commenti

MmAdvanceMdl avanza solo l'inizio dell'intervallo di indirizzi di memoria virtuale. L'indirizzo finale rimane invariato e la lunghezza dell'intervallo viene ridotto di conseguenza.

Un driver di livello superiore può usare MmAdvanceMdl in condizioni di bassa memoria quando un driver di livello inferiore può solo completare parzialmente una richiesta di lettura/scrittura. Il driver di livello superiore può usare MmAdvanceMdl per passare la parte del buffer già letto o scritto e quindi riemettere l'IRP per completare la richiesta. (Il driver può, naturalmente, ripetere questo processo il più volte necessario.

Se MmAdvanceMdl supera la pagina iniziale, tutte le pagine passate da MmAdvanceMdl vengono sbloccate immediatamente e l'indirizzo virtuale di sistema che esegue il mapping dell'MDL e l'indirizzo utente vengono modificati anche.

L'uso di MmAdvanceMdl può rallentare le prestazioni del sistema. Deve essere usato solo quando tutte le condizioni seguenti contengono:

  • Il driver di livello superiore, nella gestione di I/O, può completare solo alcune richieste di I/O dopo il trasferimento di una quantità fissa di dati, ma il driver di livello inferiore trasferisce solo i dati in piccole quantità. Un esempio è un driver di trasporto di rete per i protocolli SPX o NBT. Ogni protocollo supporta il passaggio di messaggi affidabili per i messaggi più grandi di un frame Ethernet. Il driver di trasporto può completare solo una richiesta di lettura per tale messaggio una volta riassemblato il messaggio da più frame Ethernet.
  • Il driver di livello superiore ha già provato e non è riuscito a allocare un nuovo MDL per trasferire un frammento di dati da una richiesta di I/O incompleta. Se il driver ha esito positivo nell'allocazione di un nuovo MDL, deve usare MDL e IoBuildPartialMdl per eseguire la richiesta di I/O anziché MmAdvanceMdl.
  • Il driver di livello superiore deve continuare a fare progressi, anche in condizioni di memoria ridotta.
I driver che non soddisfano queste condizioni devono invece usare la routine IoBuildPartialMdl per completare eventuali operazioni di I/O parzialmente riuscite.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows XP e versioni successive di Windows.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Vedi anche

IoBuildPartialMdl