Partilhar via


Responsabilidades opcionais do DriverEntry

Dependendo da posição de um determinado driver em uma cadeia de drivers em camadas, da natureza do dispositivo subjacente e do design do driver, uma rotina DriverEntry também pode ser responsável pelas seguintes tarefas:

  • Chamando IoAllocateDriverObjectExtension para criar e inicializar uma extensão de objeto de driver, se o driver exigir armazenamento de dados globalmente. A extensão de objeto do driver é uma estrutura de dados específica do driver. Por exemplo, um driver pode usar a sua extensão de objeto de driver para armazenar um caminho do registo ou outras informações globais.

  • Chamando PsCreateSystemThread para criar threads de trabalho executivo, se o driver for um driver de nível mais alto (como um driver de sistema de arquivos) que usa esses threads. Neste caso, o driver também deve ter uma rotina de retorno de chamada do tipo WORKER_THREAD_ROUTINE, que leva um único PVOID Parameter de entrada.

  • Registrando uma rotina de reinicialização . (Consulte Escrevendo uma rotina de reinicialização.)

  • Lidar com requisitos de inicialização específicos da classe que diferem dos discutidos aqui, como aqueles que uma miniporta específica do dispositivo ou um driver de miniclasse trabalhando em conjunto com um driver de porta ou classe pode ter. Consulte a documentação específica do tipo de dispositivo no Kit de Driver do Windows (WDK) para obter detalhes.

Fornecendo armazenamento para recursos do sistema

Aloque objetos por dispositivo na rotina AddDevice ou na rotina Dispatch que lida com a solicitação de IRP_MN_START_DEVICE PnP, não em DriverEntry.

No entanto, um driver pode precisar alocar memória adicional de espaço do sistema para outros usos em todo o driver. Em caso afirmativo, a rotina DriverEntry pode chamar uma (ou mais) das seguintes rotinas:

  • IoAllocateDriverObjectExtension, para criar uma área de contexto associada ao objeto de driver

  • ExAllocatePoolWithTag para memória de espaço do sistema paginada ou não paginada

  • MmAllocateNonCachedMemory ou MmAllocateContiguousMemory para memória de espaço do sistema não paginada alinhada ao cache (usada para buffers de E/S)

Cada rotina DriverEntry é executada no contexto de um thread do sistema em IRQL = PASSIVE_LEVEL. Portanto, qualquer memória alocada com ExAllocatePoolWithTag para uso exclusivo durante a inicialização pode ser do pool paginado, desde que o driver não controle o dispositivo que contém o arquivo de página do sistema. A memória alocada deve ser liberada com ExFreePool antes que DriverEntry retorne o controle. No entanto, um driver que define uma rotina Reinitialize pode passar um ponteiro para essa memória quando ele chama IoRegisterDriverReinitialization, tornando a rotina Reinitialize do driver responsável por liberar a alocação de memória.

Reivindicando recursos de hardware

Drivers mais antigos e não PnP reivindicaram recursos do registro. Os drivers PnP, por outro lado, não reivindicam recursos de dispositivo do registo nem gravam os requisitos de recursos diretamente no registo. Em vez disso, esses drivers relatam requisitos em resposta a certos IRPs de PnP, como parte do processo de enumeração do gestor PnP. Um driver PnP recebe os seus recursos alocados num pedido PnP IRP_MN_START_DEVICE.

Os drivers que não interagem diretamente com o gestor PnP, como certos drivers de miniporta, podem ter diferentes requisitos de relatório impostos por uma classe ou driver de porta que interage com o gestor PnP. Tais requisitos são específicos para a classe de dispositivo. Para obter detalhes específicos do dispositivo e da classe, consulte a documentação da classe de dispositivo relevante no Kit de Driver do Windows (WDK).

Utilizar o Registo

Uma rotina DriverEntry pode usar o registro para obter algumas das informações necessárias para inicializar o driver ou pode definir informações no registro para outros drivers ou subsistemas protegidos usarem. A natureza da informação depende do tipo de dispositivo. Os drivers podem acessar o registro usando as rotinas ZwXxx e RtlXxx . O parâmetro RegistryPath da rotina DriverEntry aponta para uma cadeia de caracteres Unicode contada que especifica um caminho para a chave do Registro do driver, \Registry\Machine\System\CurrentControlSet\Services\DriverName. A rotina deve guardar uma cópia da cadeia de caracteres, não o ponteiro em si, já que o ponteiro não é mais válido depois de DriverEntry retornar.