Последовательность запуска
Так как драйвер адаптера устанавливается как служба драйвера в режиме ядра, операционная система загружает драйвер адаптера во время запуска системы и вызывает подпрограмму 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).