Especificando a ordem de carregamento do driver

Para a maioria dos sistemas, a hierarquia física dos dispositivos em um computador determina a ordem na qual o Windows e o gerenciador PnP carregam drivers. O Windows e o gerenciador PnP configuram dispositivos começando com o dispositivo raiz do sistema e, em seguida, configuram os dispositivos filho do dispositivo raiz (por exemplo, um adaptador PCI), os filhos desses dispositivos e assim por diante. O gerenciador PnP carregará os drivers de cada dispositivo à medida que o dispositivo estiver configurado, se os drivers não tiverem sido carregados anteriormente para outro dispositivo.

As configurações no arquivo INF podem influenciar a ordem de carregamento do driver. Este tópico descreve os valores relevantes que os fornecedores devem especificar na seção service-install-section referenciada pela diretiva INF AddService de um driver. Especificamente, este tópico discute as entradas StartType, BootFlags, LoadOrderGroup e Dependencies .

Os drivers devem seguir estas regras para especificar StartType:

  • Driver PnP não necessário no início da inicialização

    Um driver PnP deve ter um tipo inicial de SERVICE_DEMAND_START (0x3), especificando que o gerenciador PnP pode carregar o driver quando o gerenciador PnP encontrar um dispositivo que o driver atende.

  • Driver para um dispositivo necessário para iniciar o computador

    Se um dispositivo for necessário para iniciar o computador, os drivers do dispositivo deverão ter um tipo inicial de SERVICE_BOOT_START (0x0).

  • Driver não inicializado que detecta dispositivos que não são enumeráveis PnP

    Para um dispositivo que não é PnP-enumerável, um driver relata o dispositivo ao gerenciador PnP chamando IoReportRootDevice ou IoReportDetectedDevice. Esse driver deve ter o tipo inicial SERVICE_SYSTEM_START (0x01) para que o Windows carregue o driver durante a inicialização do sistema.

    Somente os drivers que relatam hardware não PnP devem definir esse tipo de inicialização. Se um driver atende dispositivos PnP e não PnP, ele deve definir esse tipo de inicialização.

  • Driver não PnP que deve ser iniciado pelo gerenciador de controle de serviço

    Esse driver deve ter o tipo inicial SERVICE_AUTO_START (0x02). Os drivers PnP não devem definir esse tipo de inicialização.

Um driver PnP deve ser gravado para que ele possa ser carregado quando o Windows configurar um dispositivo que o driver atende. Por outro lado, um driver deve ser capaz de ser descarregado sempre que o gerenciador PnP determinar que não há mais dispositivos presentes que os serviços de driver. As únicas ordenações de carregamento de driver das quais os drivers PnP devem depender são as seguintes:

  1. Os drivers de um dispositivo filho podem depender do fato de que os drivers para o dispositivo pai são carregados.

  2. Um driver na pilha do dispositivo pode depender do fato de que todos os drivers abaixo dele são carregados.

    Por exemplo, o driver de função pode ter certeza de que todos os drivers de filtro inferior são carregados.

    No entanto, lembre-se de que um driver na pilha do dispositivo não pode depender de ser carregado sequencialmente após os drivers inferiores de um dispositivo, pois o driver pode ter sido carregado anteriormente quando outro dispositivo foi configurado.

Os drivers de filtro em um grupo de filtros não podem prever sua ordenação de carga. Por exemplo, se um dispositivo tiver três drivers de filtro superior registrados, esses três drivers serão carregados após o driver de função, mas poderão ser carregados em qualquer ordem dentro de seu grupo de filtros superiores.

Se um driver tiver uma dependência de ordem de carga explícita em outro driver, essa dependência deverá ser implementada por meio de uma relação pai/filho. Um driver para um dispositivo filho pode depender dos drivers do dispositivo pai que está sendo carregado antes que os drivers filho sejam carregados.

Para reforçar a importância de definir o valor StartType correto, a lista a seguir descreve como o Windows e o gerenciador PnP usam as entradas StartType em arquivos INF:

  1. Na inicialização do sistema, o carregador do sistema operacional carrega drivers do tipo SERVICE_BOOT_START antes de transferir o controle para o kernel. Esses drivers estão na memória quando o kernel obtém o controle.

    Os drivers de inicialização são carregados antes que a maioria dos dispositivos sejam configurados, portanto, sua ordem de carga não pode ser determinada pela hierarquia do dispositivo. Os drivers de inicialização podem usar entradas LOADOrderGroup do INF para ordenar o carregamento. O sistema operacional ignora as entradas de Dependências do INF para drivers de inicialização.

  2. O gerenciador PnP chama as rotinas driverEntry dos drivers de SERVICE_BOOT_START para que os drivers possam atender aos dispositivos de inicialização.

    Se um dispositivo de inicialização tiver dispositivos filho, esses dispositivos serão enumerados. Os dispositivos filho são configurados e iniciados se seus drivers também são drivers de inicialização. Se os drivers de um dispositivo não forem todos drivers de inicialização, o gerenciador PnP criará um nó de dispositivo (devnode) para o dispositivo, mas ainda não iniciará o dispositivo.

  3. Depois que todos os drivers de inicialização tiverem sido carregados e os dispositivos de inicialização forem iniciados, o gerenciador PnP configurará o restante dos dispositivos PnP e carregará seus drivers.

    O gerenciador PnP percorre a árvore do dispositivo e carrega os drivers para os devnodes que ainda não foram iniciados (ou seja, quaisquer devnodes não iniciados da etapa anterior). À medida que cada dispositivo é iniciado, o gerenciador PnP enumera os filhos do dispositivo, se houver.

    À medida que configura esses dispositivos, o gerenciador PnP carrega os drivers para os dispositivos, independentemente dos valores StartType dos drivers (exceto quando StartType é SERVICE_DISABLED) antes de continuar a iniciar os dispositivos. Muitos desses motoristas são SERVICE_DEMAND_START motoristas.

    O gerenciador de PnP ignora as entradas do Registro que foram criadas como resultado de entradas de dependências INF e entradas LoadOrderGroup para drivers carregados nesta etapa. A ordenação de carga é baseada na hierarquia do dispositivo físico.

    No final desta etapa, todos os dispositivos são configurados, exceto dispositivos que não são enumeráveis PnP e descendentes desses dispositivos. (Os descendentes podem ou não ser PnP-enumeráveis.)

  4. O gerenciador PnP carrega drivers de StartType SERVICE_SYSTEM_START que ainda não foram carregados.

    Esses drivers detectam e relatam seus dispositivos não PnP. O gerenciador PnP processa entradas do Registro que são o resultado de entradas INF LoadOrderGroup para esses drivers. Ele ignora as entradas do Registro que foram criadas devido a entradas de dependências inf para esses drivers.

  5. O gerenciador de controle de serviço carrega drivers de StartType SERVICE_AUTO_START que ainda não foram carregados.

    O gerenciador de controle de serviço processa as informações do banco de dados de serviço em relação a DependOnGroup e DependOnServices dos serviços. Essas informações são de entradas de dependências em entradas de AddService do INF. Lembre-se de que as informações de dependências só são processadas para drivers não PnP porque todos os drivers PnP necessários foram carregados em uma etapa anterior da inicialização do sistema. O gerenciador de controle de serviço ignora as informações de LoadOrderGroup do INF.

    Consulte a documentação do SDK do Microsoft Windows para obter mais informações sobre o gerenciador de controle de serviço.

Usando BootFlags para promover um StartType de driver na inicialização, dependendo do cenário de inicialização

O sistema operacional pode promover o StartType de um driver para ser um driver inicial de inicialização, dependendo do valor BootFlags especificado no INF do driver. Você pode especificar um ou mais (ORed) dos seguintes valores numéricos no arquivo INF, expressos como um valor hexadecimal:

  • Se um driver deve ser promovido para ser um driver inicial de inicialização na inicialização de rede, especifique 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
  • Se um driver deve ser promovido na inicialização de um VHD, especifique 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
  • Se um driver deve ser promovido durante a inicialização de um disco USB, especifique 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
  • Se um driver deve ser promovido durante a inicialização do armazenamento SD, especifique 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
  • Se um driver deve ser promovido durante a inicialização de um disco em um controlador USB 3.0, especifique 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
  • Se um driver deve ser promovido durante a inicialização com a inicialização medida habilitada, especifique 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
  • Se um driver deve ser promovido durante a inicialização com a inicialização do verificador habilitada, especifique 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
  • Se um driver deve ser promovido na inicialização do WinPE, especifique 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).

Para obter mais informações sobre como promover o StartType de um driver na inicialização, dependendo do cenário de inicialização, consulte Diretiva AddService do INF.