编写 Reinitialize 例程
任何需要在阶段中自行初始化的驱动程序都可以包含 重新初始化 例程。 在 DriverEntry 例程返回控件并且其他驱动程序自行初始化后,将调用重新初始化例程。 通常, 重新初始化 例程执行其他驱动程序启动后必须完成的任务。
例如,系统的键盘类驱动程序 kbdclass 支持 PnP 和旧键盘端口。 如果系统包含 PnP 管理器无法检测到的一个或多个旧端口,键盘类驱动程序必须为每个端口创建设备对象,并在端口的较低级别驱动程序上自行分层。 因此,类驱动程序有一个 重新初始化 例程,在调用其 DriverEntry 和 AddDevice 例程并加载其他驱动程序后调用。 重新初始化例程会检测端口,为其创建设备对象,并将驱动程序分层到设备的其他较低级别的驱动程序上。
驱动程序的 DriverEntry 例程调用 IoRegisterDriverReinitialization 以将 重新初始化 例程排队以供执行。 重新初始化例程还可以调用 IoRegisterDriverReinitialization 本身,这会导致重新排队例程。 要重新初始化的参数之一指示已调用它的次数。
对 IoRegisterDriverReinitialization 的 调用可以包括指向驱动程序定义的上下文数据的指针,系统将其作为 输入提供给 Reinitialize。 如果 Reinitialize 例程使用注册表,则上下文数据应包括传递给 DriverEntry 例程的 RegistryPath 指针,因为此指针不是 Reinitialize 例程的输入参数。
如果 DriverEntry 不返回STATUS_SUCCESS,则不会调用“重新初始化”例程。
通常,具有 重新初始化 例程的驱动程序是控制 PnP 和旧设备的高级驱动程序。 除了为 PnP 管理器检测到 (且 PnP 管理器调用驱动程序的 AddDevice 例程) 的设备创建设备对象外,驱动程序还必须为 PnP 管理器不枚举的旧设备创建设备对象。 重新初始化例程创建这些设备对象,并将驱动程序分层到基础设备的下一个较低驱动程序上。
如果驱动程序具有 重新初始化 例程,它将按照 编写 DriverEntry 例程中所述的基本步骤进行初始化,并且其基本要求与 DriverEntry 例程相同。