Función MmProbeAndLockPages (wdm.h)
La rutina MmProbeAndLockPages sondea las páginas de memoria virtual especificadas, las convierte en residentes y las bloquea en la memoria (por ejemplo, para una transferencia DMA). Esto garantiza que las páginas no se pueden liberar y reasignar mientras un controlador de dispositivo (o hardware) sigue usándolos.
Sintaxis
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
Parámetros
[in, out] MemoryDescriptorList
Puntero a un MDL que especifica un búfer de memoria virtual. Si la rutina bloquea correctamente las páginas en memoria, mdl se actualiza para describir las páginas físicas subyacentes.
[in] AccessMode
Modo de acceso en el que se van a sondear los argumentos, kernelMode o UserMode.
[in] Operation
Tipo de operación para la que el autor de la llamada quiere que se sondee los derechos de acceso y las páginas bloqueadas. Establezca este parámetro en IoReadAccess, IoWriteAccess o IoModifyAccess. IoReadAccess indica que el controlador puede examinar el contenido del búfer, pero no puede cambiar el contenido. IoWriteAccess y IoModifyAccess, que son equivalentes, indican que el controlador tiene acceso de lectura y escritura al búfer.
Valor devuelto
None
Observaciones
El controlador de nivel más alto de una cadena de controladores superpuestas que usan E/S directa llama a esta rutina. Los controladores que usan E/S almacenada en búfer nunca llaman a MmProbeAndLockPages.
MmProbeAndLockPages realiza las siguientes operaciones:
- Si el intervalo de memoria especificado se pagina en un almacén de respaldo (disco, red, etc.), MmProbeAndLockPages lo convierte en residente.
- A continuación, la rutina confirma que las páginas permiten la operación especificada por el parámetro Operation .
- Si el intervalo de memoria permite la operación especificada, la rutina bloquea las páginas en memoria para que no se puedan paginar. Use la rutina MmUnlockPages para desbloquear las páginas.
- Por último, la rutina actualiza la matriz de número de marco de página (PFN) en mdL para describir las páginas físicas bloqueadas.
Si dos o más MDL describen la misma página física, la página se puede bloquear varias veces, una vez por cada MDL. La página se desbloquea cuando el último MDL se establece en el estado desbloqueado.
Una rutina como MmBuildMdlForNonPagedPool o IoBuildPartialMdl actualiza una MDL para describir las páginas que no se pueden paginar o que ya están bloqueadas. No se permite una llamada a MmProbeAndLockPages o MmUnlockPages para bloquear o desbloquear dicho MDL.
Las llamadas a MmProbeAndLockPages se deben incluir en un bloque try/except . Si las páginas no admiten la operación especificada, la rutina genera el STATUS_ACCESS_VIOLATION u otras excepciones. Para obtener más información, consulte Control de excepciones.
Los autores de llamadas de MmProbeAndLockPages deben ejecutarse en IRQL <= APC_LEVEL para direcciones paginables o en IRQL <= DISPATCH_LEVEL para direcciones no paginables.
Esta rutina no proporciona ninguna garantía sobre la dirección virtual que describe estas páginas (es decir, la dirección virtual podría estar sin asignar, reutilizar, etc.). Sin embargo, se garantiza que las páginas físicas se bloquean al devolverse correctamente.
Para evitar errores de página, use VirtualLock para bloquear la dirección virtual, por lo que no se recortará a menos que la aplicación la desbloquee o libere explícitamente mediante una llamada a VirtualFree o UnmapViewOfFile.
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 | vea la sección Comentarios. |
Reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport) |