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 MyAddDevicede 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).