Compartir a través de


Función MmSecureVirtualMemory (ntddk.h)

El MmSecureVirtualMemory rutina protege un intervalo de direcciones de memoria de espacio de usuario para que no se pueda liberar y su protección de páginas 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 al MmUnsecureVirtualMemory rutina para no asegurar el intervalo de direcciones de memoria. Si la rutina no puede proteger el intervalo de direcciones de memoria, devuelve NULL.

Observaciones

mmSecureVirtualMemory se puede usar para evitar ciertas condiciones de carrera en los búferes en modo de usuario. Por ejemplo, si un controlador comprueba si el búfer se puede escribir, pero el proceso de modo de 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 evitar 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 protege automáticamente cuando finaliza el proceso.

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

  • Normalmente, los controladores necesitan hacer referencia al proceso cuando protegen la memoria y luego 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 genere 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 de usuario en un try/excepto bloque. Por este motivo, se recomienda que los controladores no usen esta función. Para obtener más información, vea Control de excepciones.

Requisitos

Requisito Valor
de la plataforma de destino de Universal
encabezado de ntddk.h (incluya Ntddk.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL <=APC_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm)

Consulte también

MmUnsecureVirtualMemory