2

我正在尝试开发一个双重用途的驱动程序,它在启动时执行某些任务,以及在 Windows 已经启动后执行其他不相关的任务。它被开发为引导启动驱动程序。我知道这样做的正确方法可能是开发 2 个单独的驱动程序,但我宁愿只通过一次 WinQual 过程。还有一个额外的好处是在我的应用程序中只安装一个驱动程序而不是两个。它需要通过 Win8 x86 & 64 在 Vista 上工作。

所以我真正在寻找的是一种在 DriverInit 中确定系统是否处于启动过程中,或者它是否已经启动并运行的安全方法。该驱动程序最初将在 Windows 已启动时使用,然后在下次重新启动后在启动时启用。对于这两种情况,DriverInit 代码需要不同。

是否存在存在或不存在的注册表项?

我可以确定用户是否在 DriverInit 中登录?

是否可以拨打电话来确定 Windows 是否正在启动?

我不是驱动程序写作方面的专家,所以提前感谢您的任何建议。

4

4 回答 4

1

从技术上讲,glagolig 的答案可能是解决这个问题的正确方法。

我的特定问题的解决方案有点不同。有 2 个相互排斥的用例,即驱动程序在 Windows 启动并运行后需要作为 SERVICE_DEMAND_START 驱动程序,或者作为具有启动时间功能的 SERVICE_BOOT_START 驱动程序。如果我在同一个 Windows 会话中同时需要这两种情况的功能,这种情况永远不会出现。

该驱动程序最初安装为 SERVICE_DEMAND_START 驱动程序(这是将要安装到 WinQual 的驱动程序)。然后在将要引导的新驱动器上的注册表中将其更改为 SERVICE_BOOT_START。对于每个用例而言,所有不同的驱动程序入口点(DriverEntry、AddDevice 等)都会读取驱动程序服务注册表项中的“开始”值以确定它需要如何操作。

它还没有通过,但我相当确定我可以在注册表中更改驱动程序的启动类型,而不会影响 Window 的数字签名强制执行。

于 2013-08-01T04:30:18.777 回答
0

在加载启动启动驱动程序时,Windows 尚未创建任何用户模式进程。尝试获取某个进程的句柄,该进程应该稍后在 Windows 启动期间创建。例如,smss.exe、csrss.exe 或 wininit.exe。(具有这些名称的进程已存在多年,Microdoft 不太可能在未来放弃它们,同时仍允许现有内核模式模块运行。)使用ZwOpenProcesswithPOBJECT_ATTRIBUTES指向这些进程的名称之一。如果呼叫失败,您将处于启动时。

您也可以学习 Russinovich 和 Solomon 在“Windows Internals”中描述的 Windows 启动。你很可能会得到许多其他的想法。

于 2013-07-23T04:39:05.097 回答
0

我在SO的其他地方回答了类似的问题。简短的版本是您所要求的不是正常的驱动程序行为,因此不存在支持这一点的 API。您可以添加启发式方法来告诉您这一点,但它们仍将是启发式方法。

于 2013-07-18T07:51:39.120 回答
0

您可以使用 IoGetBootDiskInformation 检查您是否在启动后或在启动期间加载。如果在重启后调用此 API,它将返回 STATUS_TOO_LATE。

于 2015-12-21T10:36:19.183 回答