Funzione MmAdvanceMdl (wdm.h)
La routine MmAdvanceMdl fa avanzare 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 il file MDL da avanzare.
[in] NumberOfBytes
Specifica il numero di byte da avanzare all'inizio del file MDL.
Valore restituito
MmAdvanceMdl restituisce un codice NTSTATUS. I possibili valori restituiti includono:
Codice restituito | Descrizione |
---|---|
|
La routine ha avanzato correttamente l'inizio del file MDL. |
|
Il chiamante ha tentato di avanzare l'inizio del file MDL oltre la fine. |
Osservazioni
MmAdvanceMdl avanza solo l'inizio dell'intervallo di indirizzi di memoria virtuale. L'indirizzo finale rimane invariato e la lunghezza dell'intervallo viene compattata di conseguenza.
Un driver di livello superiore può usare MmAdvanceMdl in condizioni di memoria insufficiente quando un driver di livello inferiore può completare solo parzialmente una richiesta di lettura/scrittura. Il driver di livello superiore può usare MmAdvanceMdl per passare oltre la parte del buffer che è già stato letto o scritto e quindi eseguire nuovamente l'IRP per completare la richiesta. Il driver può, naturalmente, ripetere questo processo quante volte necessario.
Se MmAdvanceMdl avanza oltre la pagina iniziale, tutte le pagine che mmAdvanceMdl passate vengono immediatamente sbloccate e viene modificato anche l'indirizzo virtuale di sistema che esegue il mapping del file MDL e dell'indirizzo utente.
L'uso di MmAdvanceMdl può rallentare le prestazioni del sistema. Deve essere usato solo quando tutte le condizioni seguenti sono in attesa:
- Il driver di livello superiore, nella gestione di I/O, può completare solo determinate richieste di I/O dopo il trasferimento di una quantità fissa di dati, ma il driver di livello inferiore trasferisce solo i dati in quantità minori. Un esempio è un driver di trasporto di rete per i protocolli SPX o NBT. Ogni protocollo supporta il passaggio affidabile di messaggi per i messaggi più grandi di un frame Ethernet. Il driver di trasporto può completare una richiesta di lettura per tale messaggio solo dopo aver riassemblato il messaggio da più frame Ethernet.
- Il driver di livello superiore ha già tentato di allocare un nuovo file 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 tale MDL e IoBuildPartialMdl per eseguire la richiesta di I/O anziché MmAdvanceMdl.
- Il driver di livello superiore deve continuare a progredire, anche in condizioni di memoria insufficiente.
Fabbisogno
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 |