我正在尝试开发一个双用途驱动程序,它在启动时执行某些任务,并在Windows启动后执行其他不相关的任务。它是作为启动启动驱动程序开发的。我知道这样做的正确方法可能是开发2个独立的驱动程序,但我更愿意只进行一次WinQual流程。还有一个额外的好处是在我的应用程序中只执行一个驱动程序安装而不是两个。它需要通过Win8 x86& 64.
所以我真正想要的是在DriverInit中确定系统是否处于启动过程中的安全方法,或者它是否已经启动并运行。最初在Windows启动时使用驱动程序,然后在下次重启后在启动时启用。两种情况下的DriverInit代码需要不同。
是否存在或不存在的注册表项?
我可以确定用户是否登录了DriverInit?
我是否可以通过电话确定Windows是否正在启动?
我不是司机写作的专家,所以提前感谢任何建议。
答案 0 :(得分:1)
从技术上讲,glagolig的答案可能是解决这个问题的正确方法。
我特定问题的解决方案略有不同。在Windows启动和运行后,驱动程序需要作为SERVICE_DEMAND_START驱动程序,或者作为具有启动时功能的SERVICE_BOOT_START驱动程序,有两个互斥的用例。情况永远不会出现,因为我需要在同一个Windows会话中同时使用这两种情况的功能。
驱动程序最初是作为SERVICE_DEMAND_START驱动程序安装的(这是WinQual的驱动程序)。然后在将要引导的新驱动器的注册表中将其更改为SERVICE_BOOT_START。每个用例的所有驱动程序入口点(DriverEntry,AddDevice等)都会读取驱动程序服务注册表项中的“Start”值,以确定它的运行方式。
它尚未通过,但我相当确定我可以在注册表中更改驱动程序的启动类型,而不会影响Window的数字签名实施。
答案 1 :(得分:0)
我在SO的其他地方回答过类似的问题。简短的版本是您所要求的不是正常的驱动程序行为,因此不存在支持此操作的API。您可以添加启发式来告诉您这一点,但它们仍然是启发式的。
答案 2 :(得分:0)
在加载启动启动驱动程序时,Windows尚未创建任何用户模式进程。尝试获取一些应该在Windows启动期间稍后创建的进程的句柄。例如,smss.exe,csrss.exe或wininit.exe。 (具有这些名称的进程存在多年,Microdoft在将来放弃它们的同时仍然允许现有的内核模式模块运行是不太可能的。)使用ZwOpenProcess
POBJECT_ATTRIBUTES
指向其中一个进程'姓名。如果呼叫失败,则处于启动时。
您也可以学习Russinovich和Solomon在“Windows Internals”中描述的Windows启动。很可能你会得到许多其他的想法。