DriverEntry 的可选责任
根据特定驱动程序在分层驱动程序链中的位置、基础设备的性质以及驱动程序的设计, 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 返回后指针不再有效。