Compartir a través de


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 una MDL asignada por el autor de la llamada. Este MDL debe ser lo suficientemente grande como para describir las páginas del subrango especificado por VirtualAddress y Longitud.

[in] VirtualAddress

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

[in] Length

Especifica la longitud, en bytes, que va a asignar la 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 longitud es cero, el subrango que se asignará comienza en virtualAddress e incluye el intervalo restante descrito por el SourceMdl.

Valor devuelto

Ninguno

Observaciones

Esta rutina crea una MDL de destino que describe un subrango del búfer descrito por el MDL de origen. Este subrango se especifica mediante los parámetros VirtualAddress y Length. Los parámetros SourceMdl y TargetMdl apuntan al MDL de origen y al 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 de 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, MmAllocatePagesForMdlExo 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 volver a asignarlo.
  • 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 las 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, el IoFreeMdl rutina 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, vea Using MDLs.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de 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