Función MmAdvanceMdl (wdm.h)

La rutina MmAdvanceMdl avanza el principio del intervalo de memoria virtual de un MDL por el número especificado de bytes.

Sintaxis

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Parámetros

[in, out] Mdl

Especifica el MDL que se va a avanzar.

[in] NumberOfBytes

Especifica el número de bytes que se van a avanzar al principio del MDL.

Valor devuelto

MmAdvanceMdl devuelve un código NTSTATUS. Entre los posibles valores devueltos se incluyen:

Código devuelto Descripción
STATUS_SUCCESS
La rutina ha avanzado correctamente el principio de la MDL.
STATUS_INVALID_PARAMETER_2
El autor de la llamada intentó avanzar el principio del MDL más allá del final.

Comentarios

MmAdvanceMdl avanza solo al principio del intervalo de direcciones de memoria virtual. La dirección final sigue siendo la misma y la longitud del intervalo se reduce en consecuencia.

Un controlador de nivel superior puede usar MmAdvanceMdl en condiciones de poca memoria cuando un controlador de nivel inferior solo puede completar parcialmente una solicitud de lectura y escritura. El controlador de nivel superior puede usar MmAdvanceMdl para avanzar más allá de la parte del búfer que ya se ha leído o escrito y, a continuación, volver a emitir el IRP para completar la solicitud. (Por supuesto, el controlador puede repetir este proceso tantas veces como sea necesario).

Si MmAdvanceMdl avanza más allá de la página inicial, las páginas que mmAdvanceMdl pasan se desbloquean inmediatamente y la dirección virtual del sistema que asigna mdL y la dirección del usuario también se ajustan.

El uso de MmAdvanceMdl puede ralentizar el rendimiento del sistema. Solo se debe usar cuando todas las condiciones siguientes contengan:

  • El controlador de nivel superior, en su propio control de E/S, solo puede completar determinadas solicitudes de E/S después de transferir una cantidad fija de datos, pero el controlador de nivel inferior solo transfiere datos en cantidades más pequeñas. (Un ejemplo es un controlador de transporte de red para los protocolos SPX o NBT. Cada protocolo admite el paso de mensajes confiables para los mensajes que son más grandes que un marco Ethernet. El controlador de transporte solo puede completar una solicitud de lectura para este tipo de mensaje una vez que se ha vuelto a ensamblar el mensaje de varios marcos Ethernet).
  • El controlador de nivel superior ya intentó y no pudo asignar un nuevo MDL para transferir un fragmento de datos de una solicitud de E/S incompleta. (Si el controlador se realiza correctamente al asignar un nuevo MDL, debe usar ese MDL e IoBuildPartialMdl para realizar la solicitud de E/S en lugar de MmAdvanceMdl).
  • El controlador de nivel superior debe seguir progresando, incluso en condiciones de memoria baja.
En su lugar, los controladores que no cumplan estas condiciones deben usar la rutina IoBuildPartialMdl para completar las operaciones de E/S parcialmente correctas.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en Windows XP y versiones posteriores de Windows.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Consulte también

IoBuildPartialMdl