Función IoBuildPartialMdl (wdm.h)

La rutina IoBuildPartialMdl crea una nueva lista de descriptores de memoria (MDL) que representa parte de un búfer descrito por una MDL existente.

Sintaxis

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

Parámetros

[in] SourceMdl

Puntero a un MDL que describe el búfer original, del que se va a asignar un subrango.

[in, out] TargetMdl

Puntero a un MDL asignado por el autor de la llamada. Esta MDL debe ser lo suficientemente grande como para describir las páginas en el subrango especificado por VirtualAddress y Length.

[in] VirtualAddress

Puntero a la dirección virtual base del subrango que va a describir TargetMdl.

[in] Length

Especifica la longitud, en bytes, que va a asignar TargetMdl. Este valor, en combinación con VirtualAddress, debe especificar un búfer que sea un subrango adecuado del búfer descrito por SourceMdl. Si Length es cero, el subrango que se va a asignar comienza en VirtualAddress e incluye el intervalo restante descrito por SourceMdl.

Valor devuelto

None

Observaciones

Esta rutina crea una MDL de destino que describe un subrango del búfer descrito por el MDL de origen. Los parámetros VirtualAddress y Length especifican este subrango. Los parámetros SourceMdl y TargetMdl apuntan a MDL de origen y MDL de destino.

Un controlador puede usar IoBuildPartialMdl para dividir una solicitud de transferencia grande en solicitudes de transferencia más pequeñas. Las páginas físicas que describe mdL de origen deben bloquearse antes de que el controlador llame a IoBuildPartialMdl. Normalmente, el MDL de origen describe un búfer en el espacio de direcciones del usuario y el controlador llama a la rutina MmProbeAndLockPages para bloquear las páginas de este búfer. Sin embargo, el controlador puede compilar el MDL de origen a partir de memoria no paginada llamando a la rutina MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlEx o MmAllocatePagesForMdl .

Al crear una MDL parcial:

  • Si el MDL original ya estaba asignado en el espacio del sistema, el MDL parcial comparte esa asignación y no es necesario asignarlo de nuevo.
  • Si el MDL original no se asignó en el espacio del sistema, el MDL parcial tampoco lo es. Si necesita una dirección de modo del sistema, llame a MmGetSystemAddressForMdlSafe en la MDL parcial.
  • Si no sabe cuál de los anteriores se aplica, es seguro llamar a MmGetSystemAddressForMdlSafe independientemente. Si se crea una MDL parcial a partir de un MDL de origen que ya está asignado al espacio de direcciones del sistema, MmGetSystemAddressForMdlSafe usa la asignación de origen existente. De lo contrario, MmGetSystemAddressForMdlSafe crea una nueva asignación.

Para evitar que se filtre esta nueva asignación, los controladores deben llamar a MmPrepareMdlForReuse antes de reutilizar una MDL parcial. Además, la rutina IoFreeMdl libera la asignación de espacio de direcciones del sistema para una MDL parcial, si existe dicha asignación.

Para obtener más información sobre las MDL, consulte Uso de MDL.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

Consulte también

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages