Compartir a través de


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:

  1. Si el intervalo de memoria especificado se pagina en un almacén de respaldo (disco, red, etc.), MmProbeAndLockPages lo convierte en residente.
  2. A continuación, la rutina confirma que las páginas permiten la operación especificada por el parámetro Operation .
  3. 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.
  4. 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.
Una llamada correcta a MmProbeAndLockPages bloquea las páginas de una MDL y establece la estructura MDL en el estado bloqueado. Cada llamada de este tipo debe coincidir con una llamada correspondiente a MmUnlockPages que desbloquea las páginas y establece el MDL en el estado desbloqueado. Después de que una llamada a MmProbeAndLockPages establece una MDL en el estado bloqueado, no se permite una segunda llamada a MmProbeAndLockPages para bloquear el mismo MDL hasta que se llama primero a MmUnlockPages para desbloquear mdL.

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)

Consulte también

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages