Поделиться через


Написание подпрограммы повторной инициализации

Любой драйвер, который должен инициализироваться поэтапно, может содержать подпрограмму повторной инициализации . Подпрограмма повторной инициализации вызывается после того, как подпрограмма DriverEntry вернула управление и другие драйверы инициализировали себя. Как правило, подпрограмма Повторно инициализация выполняет задачи, которые необходимо выполнить после запуска другого драйвера.

Например, драйвер класса клавиатуры системы kbdclass поддерживает как порты PnP, так и устаревшие порты клавиатуры. Если система включает один или несколько устаревших портов, которые диспетчер PnP не может обнаружить, драйвер класса клавиатуры должен тем не менее создать объект устройства для каждого порта и выполнить наложение на драйверы более низкого уровня для порта. Следовательно, драйвер класса имеет подпрограмму Повторная инициализация , которая будет вызвана после вызова процедур DriverEntry и AddDevice и загрузки других драйверов. Подпрограмма повторной инициализации обнаруживает порт, создает для него объект устройства и переносит драйвер на другие драйверы более низкого уровня для устройства.

Подпрограмма DriverEntry драйвера вызывает IoRegisterDriverReinitialization для постановки в очередь подпрограммы Повторной инициализации для выполнения. Подпрограмма Повторной инициализации также может вызывать саму ioRegisterDriverReinitialization , что приводит к повторной постановке в очередь подпрограммы. Один из параметров для повторной инициализации указывает количество вызовов.

Вызов IoRegisterDriverReinitialization может включать указатель на определяемые драйвером контекстные данные, которые система предоставляет в качестве входных данных для повторной инициализации. Если подпрограмма Повторно инициализация использует реестр, данные контекста должны включать указатель RegistryPath , который был передан подпрограмме DriverEntry , так как этот указатель не является входным параметром подпрограммы Reinitialize .

Подпрограмма Повторная инициализация не будет вызываться, если DriverEntry не возвращает STATUS_SUCCESS.

Обычно драйвер с подпрограммой повторной инициализации — это драйвер более высокого уровня, который управляет как PnP, так и устаревшими устройствами. Помимо создания объектов устройств, обнаруженных диспетчером PnP (и для которых диспетчер PnP вызывает подпрограмму AddDevice драйвера), драйвер также должен создавать объекты устройств для устаревших устройств, которые диспетчер PnP не перечисляет. Подпрограмма Повторно инициализация создает эти объекты устройства и накладывает драйвер на следующий ниже драйвер для базового устройства.

Если у драйвера есть подпрограмма Повторно инициализация , он инициализируется в том же базовом шаге, что и в разделе Написание процедуры DriverEntry, а также имеет те же основные требования, что и его подпрограмма DriverEntry .