Compartir a través de


Función MmSecureVirtualMemory (ntddk.h)

La rutina MmSecureVirtualMemory protege un intervalo de direcciones de memoria de espacio de usuario para que no se pueda liberar y su protección de página no se pueda hacer más restrictiva.

Sintaxis

HANDLE MmSecureVirtualMemory(
  [in] PVOID  Address,
  [in] SIZE_T Size,
  [in] ULONG  ProbeMode
);

Parámetros

[in] Address

El principio del intervalo de direcciones virtuales de usuario que se va a proteger.

[in] Size

Tamaño, en bytes, del intervalo de direcciones virtuales que se va a proteger.

[in] ProbeMode

Especifica la protección de página más restrictiva que se permite. Use PAGE_READWRITE para especificar que el intervalo de direcciones debe permanecer legible y grabable, o bien use PAGE_READONLY para especificar que el intervalo de direcciones solo debe permanecer legible.

ProbeMode Significado
PAGE_READWRITE No se puede cambiar la protección a PAGE_NOACCESS o PAGE_READONLY. Se permiten todos los demás cambios de protección.
PAGE_READONLY No se puede cambiar la protección a PAGE_NOACCESS. Se permiten todos los demás cambios de protección.

Valor devuelto

Si se ejecuta correctamente, MmSecureVirtualMemory devuelve un valor de puntero opaco que el controlador pasa a la rutina MmUnsecureVirtualMemory para no asegurar el intervalo de direcciones de memoria. Si la rutina no puede proteger el intervalo de direcciones de memoria, devuelve NULL.

Comentarios

MmSecureVirtualMemory se puede usar para evitar ciertas condiciones de carrera en búferes en modo de usuario. Por ejemplo, si un controlador comprueba si el búfer se puede escribir, pero el proceso de modo usuario de origen cambia el búfer para que sea de solo lectura antes de que el controlador pueda escribir en el búfer, puede producirse una condición de carrera. El controlador puede usar MmSecureVirtualMemory con PAGE_READWRITE modo de sondeo para garantizar que el búfer permanecerá grabable hasta que el controlador llame a MmUnsecureVirtualMemory. La rutina también protege contra el proceso de modo usuario de origen que libera el búfer. Estas son algunas directrices sobre cómo llamar a estas rutinas:

  • Llamar a MmSecureVirtualMemory con PAGE_READONLY no garantiza que el búfer permanezca de solo lectura. El modo de sondeo de solo lectura impide que el usuario cambie la protección del búfer a PAGE_NOACCESS. No impide cambiar la protección a PAGE_READWRITE (o PAGE_WRITECOPY, para las vistas asignadas).

  • Si un controlador llama a MmSecureVirtualMemory y no llama a MmUnsecureVirtualMemory, la memoria no se garantiza automáticamente cuando finaliza el proceso.

  • Si el controlador llama a MmUnsecureVirtualMemory, debe llamarlo en el contexto del proceso en el que la memoria se ha protegido originalmente y antes de que finalice ese proceso.

  • Normalmente, los controladores deben hacer referencia al proceso cuando protegen la memoria y, posteriormente, llaman a KeStackAttachProcess para cambiar al contexto de ese proceso antes de llamar a MmUnsecureVirtualMemory.

  • Para detectar controladores de terminación de procesos, puede usar PsSetCreateProcessNotifyRoutine. Como alternativa, el proceso puede enviar un IRP con una rutina de cancelación invocada por el administrador de E/S cuando se cierra el proceso. En la rutina de cancelación, el controlador puede asociarse al proceso y llamar a MmUnsecureVirtualMemory.

Aunque MmSecureVirtualMemory se puede usar para garantizar que la lectura o escritura de la memoria del usuario no generará una excepción debido a permisos de página insuficientes, no protege contra otros tipos de excepciones. Por ejemplo, no protege contra excepciones generadas cuando el sistema encuentra un bloque de disco incorrecto en el archivo de página. Por lo tanto, los controladores deben seguir encapsulando todos los accesos de memoria del usuario en un bloque try/except . Por este motivo, se recomienda que los controladores no usen esta función. Para obtener más información, consulte Control de excepciones.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado ntddk.h (incluya Ntddk.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <=APC_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm)

Consulte también

MmUnsecureVirtualMemory