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


Необязательные функции DriverEntry

В зависимости от положения конкретного драйвера в цепочке многоуровневых драйверов, характера базового устройства и проектирования драйвера подпрограмма DriverEntry также может отвечать за следующие задачи:

  • Вызов IoAllocateDriverObjectExtension для создания и инициализации расширения объекта драйвера, если драйверу требуется хранилище данных на уровне драйвера. Расширение объекта драйвера — это структура данных для конкретного драйвера. Например, драйвер может использовать расширение объекта драйвера для хранения пути реестра или других глобальных сведений.

  • Вызов PsCreateSystemThread для создания рабочих потоков исполнительной роли, если драйвер является драйвером верхнего уровня (например, драйвером файловой системы), который использует такие потоки. В этом случае драйвер должен также иметь подпрограмму обратного вызова типа WORKER_THREAD_ROUTINE, которая принимает один входной параметр PVOID.

  • Регистрация процедуры повторной инициализации. (См. написание процедуры повторной инициализации.)

  • Обработка требований к инициализации конкретного класса, отличающихся от обсуждаемых здесь, например, требований, которые могут иметь минипорт для конкретного устройства или драйвер миникласса, работающий совместно с портом или драйвером класса. Дополнительные сведения см. в документации по конкретному типу устройства в комплекте драйверов Windows (WDK).

Предоставление хранилища для системных ресурсов

Выделяйте объекты на устройство в подпрограмме AddDevice или в диспетчерской подпрограмме, которая обрабатывает запрос PnP IRP_MN_START_DEVICE, а не в DriverEntry.

Однако драйверу может потребоваться выделить дополнительную системную память для других общих задач драйвера. В этом случае подпрограмма DriverEntry может вызывать одну (или несколько) следующих подпрограмм:

  • IoAllocateDriverObjectExtension, чтобы создать контекстную область, связанную с объектом драйвера

  • ExAllocatePoolWithTag для страницы или непагрегированного системного пространства памяти

  • MmAllocateNonCachedMemory или MmAllocateContiguousMemory для некэшированной памяти непрерывного системного пространства с кэш-выравниванием (используется для буферов ввода-вывода)

Каждая подпрограмма DriverEntry выполняется в контексте системного потока в IRQL = PASSIVE_LEVEL. Таким образом, любая память, выделенная с exAllocatePoolWithTag для использования исключительно во время инициализации, может быть из пула страниц, если драйвер не управляет устройством, в котором хранится системный файл страницы. Выделенная память должна быть освобождена с помощью ExFreePool прежде, чем DriverEntry возвращает управление. Однако драйвер, который задает подпрограмму повторной инициализации , может передать указатель на эту память при вызове IoRegisterDriverReinitialization, что делает подпрограмму повторной инициализации драйвера, ответственной за освобождение выделения памяти.

Запрос аппаратных ресурсов

Старые драйверы, не поддерживающие PnP, запрашивали ресурсы из реестра. Драйверы PnP, с другой стороны, не запрашивают ресурсы устройства из реестра и не записывают напрямую требования к ресурсам в реестр. Вместо этого эти драйверы представляют требования в ответ на определенные PnP IRP в рамках процесса перечисления диспетчера PnP. Драйвер PnP получает выделенные ресурсы в запросе IRP_MN_START_DEVICE PnP.

Драйверы, которые не взаимодействуют напрямую с диспетчером PnP, например с определенными драйверами минипорта, могут иметь различные требования к отчетам, введенные классом или драйвером портов, который взаимодействует с диспетчером PnP. Такие требования относятся к классу устройства. Дополнительные сведения об устройствах и классах см. в документации по соответствующему классу устройств в комплекте драйверов Windows (WDK).

Использование реестра

Подпрограмма DriverEntry может использовать реестр для получения некоторых сведений, необходимых для инициализации драйвера, или может задать сведения в реестре для других драйверов или защищенных подсистем. Характер информации зависит от типа устройства. Драйверы могут получить доступ к реестру с помощью подпрограмм ZwXxx и RtlXxx . Параметр RegistryPath функции DriverEntry указывает на строку с длиной в формате Unicode, которая определяет путь к ключу реестра драйвера \Registry\Machine\System\CurrentControlSet\Services\DriverName. Подпрограмма должна сохранять копию строки, а не сам указатель, так как указатель больше не действителен после возврата DriverEntry .