Condividi tramite


Funzione IoBuildPartialMdl (wdm.h)

La routine IoBuildPartialMdl compila un nuovo elenco di descrittori di memoria (MDL) che rappresenta parte di un buffer descritto da un MDL esistente.

Sintassi

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

Parametri

[in] SourceMdl

Puntatore a un MDL che descrive il buffer originale, di cui deve essere eseguito il mapping di un intervallo secondario.

[in, out] TargetMdl

Puntatore a un MDL allocato dal chiamante. Questo file MDL deve essere sufficientemente grande da descrivere le pagine nell'intervallo secondario specificato da VirtualAddress e Lunghezza.

[in] VirtualAddress

Puntatore all'indirizzo virtuale di base per l'intervallo secondario da descrivere dall'TargetMdl.

[in] Length

Specifica la lunghezza, in byte, di cui eseguire il mapping dal TargetMdl. Questo valore, in combinazione con VirtualAddress, deve specificare un buffer che sia un sottoinsieme appropriato del buffer descritto da SourceMdl. Se length è zero, il sottorange di cui eseguire il mapping inizia a VirtualAddress e include l'intervallo rimanente descritto dal SourceMdl.

Valore restituito

Nessuno

Osservazioni

Questa routine compila un MDL di destinazione che descrive un sottoinsieme del buffer descritto dall'MDL di origine. Questo intervallo secondario viene specificato dai parametri VirtualAddress e Length . I parametri SourceMdl e TargetMdl puntano a MDL di origine e MDL di destinazione.

Un driver può usare IoBuildPartialMdl per suddividere una richiesta di trasferimento di grandi dimensioni in richieste di trasferimento più piccole. Le pagine fisiche descritte dal file MDL di origine devono essere bloccate prima che il driver chiami IoBuildPartialMdl. In genere, MDL di origine descrive un buffer nello spazio degli indirizzi utente e il driver chiama il MmProbeAndLockPages routine per bloccare le pagine in questo buffer. Tuttavia, il driver può compilare il file MDL di origine da memoria non di pagina chiamando la MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlExo MmAllocatePagesForMdl routine.

Quando si crea un file MDL parziale:

  • Se il file MDL originale è già stato mappato nello spazio di sistema, il file MDL parziale condivide tale mapping e non è necessario eseguirne di nuovo il mapping.
  • Se il file MDL originale non è stato mappato nello spazio di sistema, il file MDL parziale non è neanche. Se è necessario un indirizzo in modalità di sistema, chiamare MmGetSystemAddressForMdlSafe sul file MDL parziale.
  • Se non si conosce quale dei precedenti si applica, è possibile chiamare MmGetSystemAddressForMdlSafe indipendentemente. Se un MDL parziale viene compilato da un MDL di origine già mappato nello spazio degli indirizzi di sistema, MmGetSystemAddressForMdlSafe usa il mapping di origine esistente. In caso contrario, MmGetSystemAddressForMdlSafe crea un nuovo mapping.

Per evitare la perdita di questo nuovo mapping, i driver devono chiamare MmPrepareMdlForReuse prima di riutilizzare un MDL parziale. Inoltre, il IoFreeMdl routine rilascia il mapping dello spazio degli indirizzi di sistema per un MDL parziale, se tale mapping esiste.

Per altre informazioni sugli mdls, vedere Using MDLs.

Fabbisogno

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 <=DISPATCH_LEVEL
regole di conformità DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

Vedere anche

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages