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 |
---|---|
|
La routine ha avanzato correttamente l'inizio del MDL. |
|
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.
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 |