Последовательность запуска

Так как драйвер адаптера устанавливается как служба драйвера в режиме ядра, операционная система загружает драйвер адаптера во время запуска системы и вызывает подпрограмму DriverEntry драйвера. Подпрограмма DriverEntry получает два параметра: объект драйвера и имя пути к реестру. DriverEntry должен вызывать функцию PortCls PcInitializeAdapterDriver с параметрами driver-object и registry-path name, а также третьим параметром, который является указателем на функцию AddDevice драйвера адаптера.

В следующем примере функция DriverEntry драйвера передает указатель MyAddDeviceфункции , который указывает на функцию AddDevice драйвера, в качестве третьего параметра в подпрограмму PcInitializeAdapterDriver .

NTSTATUS 
  DriverEntry( 
    PDRIVER_OBJECT  DriverObject,
    PUNICODE_STRING  RegistryPath
    )
  {
      return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
  }

Подпрограмма PcInitializeAdapterDriver устанавливает предоставленную подпрограмму AddDevice в расширение драйвера объекта драйвера и обработчики IRP драйвера PortCls в самом объекте драйвера драйвера.

Следующий код является примером реализации функции драйвера MyAddDevice .

#define MAX_MINIPORTS 6    // maximum number of miniports
NTSTATUS
  MyAddDevice(
    PDRIVER_OBJECT  DriverObject,
    PDEVICE_OBJECT  PhysicalDeviceObject 
    )
  {
      return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
                                MAX_MINIPORTS, 0);
  }

Эта функция вызывает функцию PortCls PcAddAdapterDevice, которая создает указанное устройство адаптера, связывает драйвер с устройством и сохраняет указатель на функцию драйвера адаптера MyStartDevice , которая вызывается при запуске устройства операционной системой (см. раздел Запуск устройства). Подпрограмма PcAddAdapterDevice создает объект функционального устройства (FDO) и связывает его с объектом физического устройства (PDO), предоставляемым системой. Новое FDO создается с расширением, которое PortCls использует для хранения контекстных сведений об устройстве. Этот контекст включает указатель функции MyStartDevice , предоставляемый MyAddDevice.

После того как операционная система определит, какие ресурсы (прерывания, каналы DMA, адреса портов ввода-вывода и т. д.) назначить устройству, она отправляет устройству запрос на запуск (IRP_MN_START_DEVICE). В ответ на этот запрос обработчик запросов в драйвере PortCls вызывает функцию драйвера адаптера MyStartDevice , которая показана в следующем примере кода:

NTSTATUS
  MyStartDevice(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PRESOURCELIST ResourceList
    )
  {
    ...
  }

Обработчик запросов предоставляет MyStartDevice указатели на объект устройства, IRP_MN_START_DEVICE запрос и список ресурсов (см. раздел IResourceList). Функция MyStartDevice разделяет список ресурсов на ресурсы, необходимые для каждого драйвера мини-порта, который необходимо запустить. Затем функция запускает каждый драйвер мини-порта и возвращает управление в PortCls, который завершает IRP и возвращает управление операционной системе.

Дополнительные примеры кода запуска драйверов см. в примерах драйверов аудиоадаптера в комплекте драйверов Microsoft Windows (WDK).