Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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) |