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 |
---|---|
|
La rutina ha avanzado correctamente el principio de la MDL. |
|
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.
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 |