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) |