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 pelo seguinte:
Chamar IoAllocateDriverObjectExtension para criar e inicializar uma extensão de objeto de driver, se o driver exigir armazenamento para dados em todo o driver. A extensão do objeto de driver é uma estrutura de dados específica do driver. Por exemplo, um driver pode usar sua extensão de objeto de driver para armazenar um caminho do Registro ou outras informações globais.
Chamar PsCreateSystemThread para criar threads de trabalho executivos, se o driver for um driver de nível mais alto (como um driver do sistema de arquivos) que usa esses threads. Nesse caso, o driver também deve ter uma rotina de retorno de chamada do tipo WORKER_THREAD_ROUTINE, que usa um único parâmetro PVOID de entrada.
Registrando uma rotina Reinicializar . (Consulte Escrevendo uma rotina de reinicialização.)
Lidar com requisitos de inicialização específicos da classe que diferem daqueles discutidos aqui, como aqueles que um driver de miniporto ou miniclasse específico do dispositivo que trabalha em conjunto com um driver de porta ou classe pode ter. Consulte a documentação específica do tipo de dispositivo no WDK (Kit de Driver do Windows) para obter detalhes.
Fornecendo armazenamento para recursos do sistema
Os objetos por dispositivo devem ser alocados na rotina AddDevice ou na rotina Dispatch que manipula a solicitação de IRP_MN_START_DEVICE PnP, não em DriverEntry.
No entanto, um driver pode precisar alocar memória de espaço do sistema adicional para outros usos em todo o driver. Nesse caso, a rotina DriverEntry pode chamar uma (ou mais) das seguintes rotinas:
IoAllocateDriverObjectExtension, para criar uma área de contexto associada ao objeto driver
ExAllocatePoolWithTag para memória de espaço do sistema paginada ou nãopagada
MmAllocateNonCachedMemory ou MmAllocateContiguousMemory para memória de espaço do sistema nãopagada 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 Reinicializar pode passar um ponteiro para essa memória quando chama IoRegisterDriverReinitialization, tornando assim a rotina Reinicializar 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 declaram recursos de dispositivo nem gravam diretamente os requisitos de recursos no registro. Em vez disso, esses drivers relatam requisitos em resposta a determinados IRPs PnP, como parte do processo de enumeração do gerenciador de PnP. Um driver PnP recebe seus recursos alocados em uma solicitação de IRP_MN_START_DEVICE PnP.
Os drivers que não interagem diretamente com o gerenciador PnP, como determinados drivers de miniporto, podem ter requisitos de relatório diferentes impostos por um driver de classe ou porta que interage com o gerenciador PnP. Esses requisitos são específicos para a classe de dispositivo. Para obter detalhes específicos do dispositivo e específicos da classe, consulte a documentação da classe de dispositivo relevante no WDK (Kit de Driver do Windows).
Usando o Registro
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 das informações 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 salvar uma cópia da cadeia de caracteres, não o ponteiro em si, já que o ponteiro não é mais válido após o retorno de *DriverEntry.