根据特定驱动程序在分层驱动程序链中的位置、基础设备的性质和驱动程序的设计, DriverEntry 例程还可以负责以下任务:
调用 IoAllocateDriverObjectExtension 以创建和初始化驱动程序对象扩展(如果驱动程序需要存储驱动程序范围的数据)。 驱动程序对象扩展是特定于驱动程序的数据结构。 例如,驱动程序可能使用其驱动程序对象扩展来存储注册表路径或其他全局信息。
如果驱动程序是使用此类线程的最高级别驱动程序(例如文件系统驱动程序),则调用 PsCreateSystemThread 来创建执行工作线程。 在这种情况下,驱动程序还必须具有WORKER_THREAD_ROUTINE类型的回调例程,该例程采用单个输入 PVOID 参数。
处理与此处讨论的初始化要求不同的类特定的初始化要求,例如,与端口或类驱动程序一起工作的特定于设备的微型端口或微型类驱动程序可能具有的初始化要求。 有关详细信息,请参阅 Windows 驱动程序工具包(WDK)中的设备类型特定文档。
为系统资源提供存储
在 AddDevice 例程或处理 PnP IRP_MN_START_DEVICE 请求的 Dispatch 例程中分配按设备对象,而不是在 DriverEntry 中。
但是,驱动程序可能需要为其他驱动程序范围的用途分配额外的系统空间内存。 如果是这样, DriverEntry 例程可以调用以下例程中的一个或多个:
IoAllocateDriverObjectExtension,用于创建与驱动程序对象关联的上下文区域
在分页或非分页系统空间内存中ExAllocatePoolWithTag
MmAllocateNonCachedMemory 或 MmAllocateContiguousMemory 用于缓存对齐的非分页系统空间内存(用于 I/O 缓冲区)
每个 DriverEntry 例程在 IRQL = PASSIVE_LEVEL 的系统线程上下文中运行。 因此,只要驱动程序不控制保存系统页面文件的设备,使用 ExAllocatePoolWithTag 分配的任何内存在初始化期间专用时都可以来自分页池。 在 DriverEntry 返回控制权之前,必须使用 ExFreePool 释放分配的内存。 但是,设置 Reinitialize 例程的驱动程序可以在调用 IoRegisterDriverReinitialization 时传递指向此内存的指针,从而使驱动程序的 Reinitialize 例程负责释放内存分配。
申请硬件资源
较旧的非 PnP 驱动程序从注册表中占用了资源。 另一方面,PnP 驱动程序不会从注册表中声明设备资源,也不直接将资源要求写入注册表。 相反,这些驱动程序会报告需求,以便响应某些 PnP IRP,这是 PnP 管理器枚举过程的一部分。 PnP 驱动程序在 PnP IRP_MN_START_DEVICE 请求中接收其分配的资源。
不直接与 PnP 管理器交互的驱动程序(如某些微型端口驱动程序)可能具有与 PnP 管理器交互的类或端口驱动程序施加的不同报告要求。 此类要求特定于设备类。 有关设备特定和类特定的详细信息,请参阅 Windows 驱动程序工具包(WDK)中相关设备类的文档。
使用注册表
DriverEntry 例程可能使用注册表获取初始化驱动程序所需的一些信息,或者可能会设置注册表中用于其他驱动程序或受保护子系统的信息。 信息的性质取决于设备的类型。 驱动程序可以使用 ZwXxx 和 RtlXxx 例程访问注册表。 DriverEntry 例程的 RegistryPath 参数指向计数的 Unicode 字符串,该字符串指定驱动程序注册表项 \Registry\Machine\System\CurrentControlSet\Services\DriverName 的路径。 该例程应保存字符串的副本,而不是指针本身,因为该指针在 DriverEntry 返回后不再有效。