Creación de controladores de reliable Kernel-Mode
Los controladores constituyen un porcentaje significativo del código total que se ejecuta en modo kernel. Un controlador en modo kernel es, en efecto, un componente del sistema operativo. Por lo tanto, los controladores que son confiables y seguros contribuyen significativamente a la confiabilidad general del sistema operativo. Para crear un controlador confiable en modo kernel, siga estas instrucciones:
Proteger los objetos de dispositivo correctamente.
El acceso de usuario a los controladores y dispositivos de un sistema se controla mediante descriptores de seguridad que el sistema asigna a objetos de dispositivo. Normalmente, el sistema establece parámetros de seguridad de dispositivos cuando se instala un dispositivo. Para obtener más información, consulte Creación de instalaciones de dispositivos seguros. A veces es adecuado para que un controlador desempeñe un papel en el control del acceso a su dispositivo. Para obtener más información, consulte Protección de objetos de dispositivo.
Valide los objetos de dispositivo correctamente.
Si un controlador crea varios tipos de objetos de dispositivo, debe comprobar qué tipo recibe en cada IRP. Para obtener más información, consulte Error al validar objetos de dispositivo.
Use funciones de "cadena segura".
Al manipular cadenas, un controlador debe usar funciones de cadena seguras en lugar de las funciones de cadena que se proporcionan con bibliotecas de Language Runtime de C/C++. Para obtener más información, vea Uso de funciones de cadena segura.
Valide los identificadores de objeto.
Los controladores que reciben identificadores de objeto como entrada deben comprobar que los identificadores son válidos, son accesibles y son del tipo esperado. Para obtener más información sobre el uso de identificadores de objetos, vea los temas siguientes:
Admite los multiprocesadores correctamente.
Nunca suponga que el controlador solo se ejecutará en sistemas de procesador único. Para obtener información sobre las técnicas de programación que puede usar para asegurarse de que el controlador funcionará correctamente en sistemas multiprocesador, consulte los temas siguientes:
Controle el estado del controlador correctamente.
Es importante comprobar siempre que el controlador está en el estado en el que se supone que está en. Por ejemplo, si el controlador recibe un IRP, ¿ya está dando servicio a un IRP del mismo tipo? Si el controlador no comprueba esta situación, se podría perder el primer IRP. Para obtener más información, vea Error al comprobar el estado de un controlador.
Valide los valores de entrada de IRP.
Es esencial, tanto desde una perspectiva de confiabilidad como de seguridad, validar todos los valores asociados a un IRP, como las direcciones y las longitudes del búfer. En los temas siguientes se proporciona información sobre cómo validar los valores de entrada de IRP:
DispatchReadWrite mediante E/S almacenadas en búfer
Errores en E/S almacenados en búfer
DispatchReadWrite mediante E/S directa
Controle correctamente la pila de E/S.
Al pasar IRP a la pila de controladores, es importante que los controladores llamen a IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext para configurar la siguiente ubicación de pila de E/S del controlador. No escriba código que copie directamente una ubicación de pila de E/S a la siguiente.
Controle las operaciones de finalización de IRP correctamente.
Un controlador nunca debe completar un IRP con un valor de estado de STATUS_SUCCESS a menos que realmente admita y procese el IRP. Para obtener información sobre las formas correctas de controlar las operaciones de finalización de IRP, consulte Finalización de IRP.
Controle las operaciones de cancelación de IRP correctamente.
Las operaciones de cancelación pueden ser difíciles de codificar correctamente porque normalmente se ejecutan de forma asincrónica. Los problemas en el código que controla las operaciones de cancelación pueden pasar desapercibidos durante mucho tiempo, ya que este código normalmente no se ejecuta con frecuencia en un sistema en ejecución.
Asegúrese de leer y comprender toda la información proporcionada en Cancelar IRP. Preste especial atención a la sincronización de la cancelación de IRP y los puntos a tener en cuenta al cancelar los IRP.
Una manera de evitar los problemas de sincronización asociados a las operaciones de cancelación es implementar una cola irP segura para cancelar. Una cola IRP segura de cancelación es una cola administrada por controladores que se introdujo para Windows XP y versiones posteriores del sistema operativo, pero también es compatible con versiones anteriores.
Controle correctamente las operaciones de limpieza y cierre de IRP.
Asegúrese de comprender la diferencia entre las solicitudes de IRP_MJ_CLEANUP y IRP_MJ_CLOSE . Las solicitudes de limpieza llegan después de que una aplicación cierre todos los identificadores de un objeto de archivo, pero a veces antes de que se hayan completado todas las solicitudes de E/S. Las solicitudes de cierre llegan después de que se hayan completado o cancelado todas las solicitudes de E/S para el objeto de archivo. Para obtener más información, vea los temas siguientes:
DispatchCreate, DispatchClose y DispatchCreateClose Routines
Errores en el control de las operaciones de limpieza y cierre
Para obtener más información sobre cómo controlar los IRP correctamente, consulte Errores adicionales en el control de IRP.
Uso del comprobador de controladores
Driver Verifier es la herramienta más importante que puede usar para garantizar la confiabilidad del controlador. El Comprobador de controladores puede comprobar si hay una variedad de problemas comunes de controladores, incluidos algunos de los que se describen en esta sección. Sin embargo, el uso del Comprobador de controladores no reemplaza el diseño de software cuidadoso y cuidadoso.