Portátil

Todos los controladores deben ser portátiles en todas las plataformas de hardware compatibles con Windows. Para lograr la portabilidad multiplataforma, los desarrolladores de controladores deben:

  • Código en C (sin lenguaje de ensamblado).

  • Interactúe con Windows solo mediante las interfaces de programación y los encabezados proporcionados en WDK.

Codificación de controladores en C

Todos los controladores en modo kernel deben escribirse en C para que se puedan volver a compilar con un compilador de C compatible con el sistema, volver a vincular y ejecutarse en diferentes plataformas de Microsoft Windows sin volver a escribir ni reemplazar ningún código. La mayoría de los componentes del sistema operativo se codifican completamente en C, con solo pequeñas piezas de los componentes HAL y kernel escritos en lenguaje de ensamblado, de modo que el sistema operativo sea fácilmente portátil en plataformas de hardware. No puede usar muchas construcciones de lenguaje C++ en controladores en modo kernel, por lo que debe evaluar cuidadosamente el uso de estas construcciones. Para obtener más información sobre los problemas que surgen cuando los controladores incluyen características de C++, consulte el libro blanco de C++ para controladores de modo kernel: Ventajas y desventajas.

Los controladores no deben confiar en las características de ningún compilador de C compatible con el sistema o en la biblioteca de compatibilidad con C en particular si no se garantiza que esas características sean compatibles con otros compiladores compatibles con el sistema. En general, el código de controlador debe ajustarse al estándar ANSI C y no depender de nada que este estándar describa como "definido por la implementación".

Para escribir controladores portátiles, es mejor evitar:

  • Dependencias de tipos de datos que pueden variar en tamaño o diseño de una plataforma a otra.

  • Llamar a cualquier función estándar de la biblioteca en tiempo de ejecución de C que mantenga el estado.

  • Llamar a cualquier función de biblioteca en tiempo de ejecución de C estándar para la que el sistema operativo proporciona una rutina de soporte técnico alternativa.

Uso de Interfaces WDK-Supplied

Cada componente ejecutivo de Windows NT exporta un conjunto de rutinas de soporte para controladores en modo kernel que son llamadas por los controladores y todos los demás componentes en modo kernel. Si la implementación subyacente de una rutina de soporte técnico cambia con el tiempo, sus llamadores permanecen portátiles porque la interfaz del componente de definición no cambia.

WDK proporciona un conjunto de archivos de encabezado que definen tipos de datos y constantes específicos del sistema que los controladores (y todos los demás componentes del modo kernel) usan para ayudar a mantener la portabilidad de una plataforma a otra. Todos los controladores en modo núcleo incluyen uno de los archivos maestros de encabezado del modo núcleo de WDK, Wdm.h o Ntddk.h. Los archivos de encabezado maestro extraen no solo los encabezados proporcionados por el sistema que definen los tipos básicos del modo kernel, sino también las selecciones adecuadas de los encabezados específicos de la arquitectura del procesador cuando se compila un controlador con la directiva del compilador correspondiente.

Algunos controladores, como los controladores de miniporte SCSI, los controladores NDIS y los controladores de miniporte de vídeo, incluyen otros archivos de encabezado proporcionados por el sistema.

Si un controlador requiere definiciones dependientes de la plataforma, es mejor aislar esas definiciones dentro de instrucciones #ifdef , de modo que cada controlador se pueda compilar y vincular para la plataforma de hardware adecuada. Sin embargo, casi siempre puede evitar implementar cualquier código compilado condicionalmente específico de la plataforma en un controlador mediante las rutinas de soporte técnico, las macros, las constantes y los tipos que proporcionan los archivos de encabezado maestro de WDK.

Los controladores en modo kernel pueden usar rutinas RtlXxx en modo kernel documentadas en WDK. Los controladores en modo kernel no pueden llamar a rutinas RtlXxx en modo de usuario.