Compartir a través de


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 la 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 valores devueltos posibles 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.

Observaciones

MmAdvanceMdl avanza solo el 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 memoria baja 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 también se ajusta la dirección virtual del sistema que asigna la MDL y la dirección de usuario.

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

  • 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 mensaje una vez que haya vuelto a ensamblar el mensaje de varios marcos Ethernet).
  • El controlador de nivel superior ya intentó y no pudo asignar una nueva MDL para transferir un fragmento de datos de una solicitud de E/S incompleta. (Si el controlador se realiza correctamente al asignar una nueva MDL, debe usar esa MDL y 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.
Los controladores que no cumplen estas condiciones deben usar la rutina IoBuildPartialMdl para completar las operaciones de E/S correctas parcialmente.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible en Windows XP y versiones posteriores de Windows.
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

Consulte también

IoBuildPartialMdl