Portátil

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

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

  • Interactúe con Windows solo con 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 entre plataformas de hardware. No puede usar muchas construcciones de lenguaje C++ en controladores en modo kernel, por lo que debe evaluar cuidadosamente con estas construcciones. Para obtener más información sobre los problemas que surgen cuando los controladores incluyen características de C++, consulte las notas del producto C++ for Kernel Mode Drivers: Pros and Cons (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 de C en particular si no se garantiza que otras 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 de biblioteca en tiempo de ejecución de C estándar 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 de WDK-Supplied

Cada componente ejecutivo de Windows NT exporta un conjunto de rutinas de controlador en modo kernel que los controladores y todos los demás componentes del modo kernel llaman. 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 que define 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 kernel incluyen uno de los archivos de encabezado del modo kernel de WDK maestros, 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 un controlador se compila 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, macros, constantes y tipos que proporcionan los archivos de encabezado maestro de WDK.

Los controladores en modo kernel pueden usar rutinas RtlXxx en modo kernel que se documentan en el WDK. Los controladores en modo kernel no pueden llamar a rutinas RtlXxx en modo de usuario.