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