Sequência de inicialização
Como o driver do adaptador é instalado como um serviço de driver no modo kernel, o sistema operacional carrega o driver do adaptador no momento da inicialização do sistema e chama a rotina DriverEntry do driver. A rotina DriverEntry recebe dois parâmetros: um objeto de driver e um nome de caminho do Registro. DriverEntry deve chamar a função PortCls PcInitializeAdapterDriver com os parâmetros driver-object e registry-path name mais um terceiro parâmetro, que é um ponteiro para a função AddDevice do driver do adaptador.
No exemplo a seguir, a função DriverEntry do driver passa o ponteiro MyAddDevice
de função , que aponta para a função AddDevice do driver, como o terceiro parâmetro para a rotina PcInitializeAdapterDriver .
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
}
A rotina PcInitializeAdapterDriver instala a rotina AddDevice fornecida na extensão do driver do objeto driver e instala os manipuladores IRP do driver PortCls no próprio objeto driver.
O código a seguir é um exemplo de implementação da função do MyAddDevice
driver.
#define MAX_MINIPORTS 6 // maximum number of miniports
NTSTATUS
MyAddDevice(
PDRIVER_OBJECT DriverObject,
PDEVICE_OBJECT PhysicalDeviceObject
)
{
return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
MAX_MINIPORTS, 0);
}
Essa função chama a função PortCls PcAddAdapterDevice, que cria o dispositivo adaptador especificado, associa um driver ao dispositivo e armazena um ponteiro para a função do driver do MyStartDevice
adaptador, que é chamada quando o sistema operacional inicia o dispositivo (consulte Iniciando um dispositivo). A rotina PcAddAdapterDevice cria um FDO (objeto de dispositivo funcional) e o associa ao PDO (objeto de dispositivo físico) fornecido pelo sistema. O novo FDO é criado com uma extensão que PortCls usa para armazenar informações de contexto sobre o dispositivo. Esse contexto inclui o ponteiro de MyStartDevice
função fornecido por MyAddDevice
.
Depois que o sistema operacional determina quais recursos (interrupções, canais de DMA, endereços de porta de E/S e assim por diante) para atribuir ao dispositivo, ele envia ao dispositivo uma solicitação para iniciar (IRP_MN_START_DEVICE). Em resposta a essa solicitação, o manipulador de solicitação no driver PortCls chama a função do driver do MyStartDevice
adaptador, que é mostrada no código de exemplo a seguir:
NTSTATUS
MyStartDevice(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PRESOURCELIST ResourceList
)
{
...
}
O manipulador de solicitação MyStartDevice
fornece ponteiros para o objeto do dispositivo, IRP_MN_START_DEVICE solicitação e lista de recursos (consulte IResourceList). A MyStartDevice
função particiona a lista de recursos nos recursos necessários para cada driver de miniporta que precisa ser iniciado. Em seguida, a função inicia cada driver de miniporto e retorna o controle para PortCls, que conclui o IRP e retorna o controle para o sistema operacional.
Para obter mais exemplos de código de inicialização do driver, consulte os drivers de adaptador de áudio de exemplo no WDK (Microsoft Windows Driver Kit).