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.
Los controladores que crean secciones y vistas que no se van a compartir con el modo de usuario deben usar el siguiente protocolo cuando trabajen con secciones y vistas:
El controlador debe usar un identificador de kernel cuando abra un identificador para el objeto de sección. Los controladores pueden asegurarse de que un identificador es un identificador de kernel creandolo en el proceso del sistema o especificando el atributo OBJ_KERNEL_HANDLE para el identificador. Para obtener más información, vea identificadores de objeto.
La vista solo debe asignarse desde un subproceso del sistema. (De lo contrario, se puede acceder a la vista desde el proceso en cuyo contexto se ha creado). Un controlador puede asegurarse de que la vista se mapea desde el proceso del sistema mediante un hilo de trabajo del sistema para realizar la operación de mapeo. Para obtener más información, consulte Subprocesos de trabajo del sistema y contexto del subproceso del controlador.
Los controladores que comparten una vista con un proceso en modo de usuario deben usar el siguiente protocolo cuando trabajen con secciones y vistas:
El controlador, no el proceso en modo de usuario, debe crear el objeto de sección y mapear las vistas.
Como se mencionó anteriormente, el controlador debe usar un identificador del kernel cuando abra un identificador para el objeto de sección. Los controladores pueden asegurarse de que un identificador es un identificador de kernel creandolo en el proceso del sistema o especificando el atributo OBJ_KERNEL_HANDLE para el identificador. Para obtener más información, vea identificadores de objeto.
La vista se asigna en el contexto del hilo de ejecución del proceso que comparte la vista. Un controlador de nivel superior puede garantizar que la vista se asigna en el contexto de proceso actual realizando la operación de asignación en una rutina de distribución, como DispatchDeviceControl. Las rutinas de distribución de controladores de nivel inferior se ejecutan en un contexto arbitrario de subprocesos y, por tanto, no pueden asignar de forma segura una vista en una rutina de distribución. Para obtener más información, vea Contexto del subproceso del controlador.
Todos los accesos de memoria a la vista dentro del controlador deben estar protegidos por bloques try-except. Una aplicación malintencionada en modo de usuario podría desasignar la vista o cambiar el estado de protección de la vista. Cualquiera de ellos causaría un fallo del sistema salvo que esté protegido por un bloque try-except. Para obtener más información, vea Control de excepciones.
El controlador también debe validar el contenido de la vista según sea necesario. El escritor de controladores no puede suponer que solo un componente de modo usuario confiable tiene acceso a la vista.
Un controlador que debe compartir un objeto de sección con una aplicación en modo de usuario (que debe poder crear sus propias vistas) debe usar el siguiente protocolo:
El controlador, no el proceso en modo de usuario, debe crear el objeto de sección. Los controladores nunca deben usar un identificador que ha sido pasado desde modo usuario.
Antes de pasar el identificador al modo usuario, el controlador debe llamar a ObReferenceObjectByHandle para obtener una referencia al objeto de sección. Esto impide que una aplicación malintencionada elimine el objeto de sección cerrando el identificador. La referencia de objeto debe almacenarse en la extensión del dispositivo del controlador.
Después de que el controlador ya no use el objeto section, debe llamar a ObDereferenceObject para liberar la referencia de objeto.
En sistemas que ejecutan Microsoft Windows Server 2003 con Service Pack 1 (SP1) y versiones posteriores, solo los controladores en modo kernel pueden abrir \Device\PhysicalMemory. Sin embargo, los controladores pueden decidir asignar un identificador a una aplicación de usuario. Para evitar problemas de seguridad, solo las aplicaciones de usuario en las que confía el controlador deben tener acceso a \Device\PhysicalMemory.