Partilhar via


Portáteis

Todos os drivers devem ser portáteis em todas as plataformas de hardware com suporte do Windows. Para alcançar a portabilidade multiplataforma, os gravadores de driver devem:

  • Código em C (sem linguagem de assembly).

  • Interaja com o Windows usando apenas as interfaces de programação e os cabeçalhos fornecidos no WDK.

Codificando drivers em C

Todos os drivers de modo kernel devem ser escritos em C para que possam ser recompilados com um compilador C compatível com o sistema, revinculados e executados em diferentes plataformas Microsoft Windows sem reescrever ou substituir nenhum código. A maioria dos componentes do sistema operacional é codificada inteiramente em C, com apenas pequenas partes dos componentes HAL e kernel escritos na linguagem de assembly, para que o sistema operacional seja prontamente portátil entre plataformas de hardware. Não é possível usar muitos constructos de linguagem C++ em drivers no modo kernel, portanto, você deve avaliar cuidadosamente usando tais constructos. Para obter mais informações sobre problemas que surgem quando os drivers incluem recursos do C++, consulte o white paper C++ para drivers de modo kernel: prós e contras .

Os drivers não devem depender dos recursos de qualquer compilador C compatível com o sistema específico ou biblioteca de suporte C se esses recursos não tiverem garantia de que têm suporte de outros compiladores compatíveis com o sistema. Em geral, o código do driver deve estar em conformidade com o padrão ANSI C e não depender de nada que esse padrão descreva como "definido pela implementação".

Para escrever drivers portáteis, é melhor evitar:

  • Dependências de tipos de dados que podem variar em tamanho ou layout de uma plataforma para outra.

  • Chamar qualquer função de biblioteca de runtime C padrão que mantenha o estado.

  • Chamar qualquer função de biblioteca de runtime C padrão para a qual o sistema operacional fornece uma rotina de suporte alternativa.

Usando interfaces WDK-Supplied

Cada componente executivo Windows NT exporta um conjunto de rotinas de suporte de driver no modo kernel que os drivers e todos os outros componentes do modo kernel chamam. Se a implementação subjacente de uma rotina de suporte mudar ao longo do tempo, seus chamadores permanecerão portáteis porque a interface para o componente definidor não será alterada.

O WDK fornece um conjunto de arquivos de cabeçalho que definem tipos de dados e constantes específicos do sistema que os drivers (e todos os outros componentes do modo kernel) usam para ajudar a manter a portabilidade de uma plataforma para outra. Todos os drivers de modo kernel incluem um dos master arquivos de cabeçalho do modo kernel do WDK, Wdm.h ou Ntddk.h. Os arquivos de cabeçalho master efetuam pull não apenas de cabeçalhos fornecidos pelo sistema que definem os tipos básicos de modo kernel, mas também seleções apropriadas de qualquer cabeçalho específico da arquitetura do processador quando um driver é compilado com a diretiva do compilador correspondente.

Alguns drivers, como drivers de miniporto SCSI, drivers NDIS e drivers de miniporta de vídeo, incluem outros arquivos de cabeçalho fornecidos pelo sistema.

Se um driver exigir definições dependentes da plataforma, é melhor isolar essas definições em #ifdef instruções, para que cada driver possa ser compilado e vinculado para a plataforma de hardware apropriada. No entanto, quase sempre é possível evitar a implementação de qualquer código compilado condicionalmente específico da plataforma em um driver usando as rotinas, macros, constantes e tipos de suporte fornecidos pelo WDK master arquivos de cabeçalho.

Os drivers no modo kernel podem usar rotinas RtlXxx no modo kernel documentadas no WDK. Os drivers no modo kernel não podem chamar rotinas RtlXxx no modo de usuário.