Compartir a través de


Función MmProbeAndLockPages (wdm.h)

El MmProbeAndLockPages rutina 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ándolas.

Sintaxis

void MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

Parámetros

[in, out] MemoryDescriptorList

Puntero a una 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, ya sea 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, IoWriteAccesso 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

Ninguno

Observaciones

El controlador de nivel más alto de una cadena de controladores en capas que usan E/S directa llama a esta rutina. Los controladores que usan la 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 número de fotograma 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 MmProbeAndLockPages llamada establece una MDL en el estado bloqueado, una segunda llamada a MmProbeAndLockPages para bloquear la misma MDL no se permite hasta que se llame 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 para 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 páginas que no se pueden paginar o que ya están bloqueadas. No se permite una llamada a MmProbeAndLockPages o MmUnlockPages bloquear o desbloquear este tipo de MDL.

Las llamadas a mmProbeAndLockPages deben incluirse 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, vea 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 no asignarse, reutilizarse, 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 Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
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 Consulte la sección Comentarios.
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport)

Consulte también

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages