Windows 驱动程序开发本地调试问题。

Posted

技术标签:

【中文标题】Windows 驱动程序开发本地调试问题。【英文标题】:Windows Driver Developement Local debugging questions. 【发布时间】:2013-11-11 02:04:16 【问题描述】:

这里是场景。 我在 Windows 8 机器上/也在 Windows 7 机器上试过这个。

我正在开发一个驱动程序(镜像驱动程序/远程显示驱动程序)。我应该说我要开始工作了,因为我被困住了。

于是我就按照KmdfSmall的MSDN示例

http://msdn.microsoft.com/en-us/library/windows/hardware/hh439665(v=vs.85).aspx

我编译了驱动程序代码。远程调试也开始了。

我在主机上看不到任何调试消息(我已将寄存器 IHVDRIVER 设置为 0x8 我还将 DEFAULT 设置为 0xf 以便能够使用 DbgPrint

还有更多。我真正的目标是启动我的驱动程序即服务

http://www.codeproject.com/Articles/9504/Driver-Development-Part-1-Introduction-to-Drivers

我想在本地机器上测试它。我不想有一个目标和主机来调试。普通的老式单机。

问题

1) 当服务通过CreateServiceOpenService 启动驱动程序时,它是调用DriverEntry 函数还是等到有人用户级应用程序使用驱动程序。

2) 当我运行应用程序以将驱动程序加载为服务器时,DbgPrintEx 会在哪里打印 DebugView 或 WinDbg 或其他地方。

3) 如果我正在使用

CreateService

我的 sys 文件是否必须在 windows/system32/drivers 文件夹中?我在某处读到 64 位机器 CreateService 仅从系统文件夹加载。

4) 当我将它作为服务启动时,我想在任务管理器上看到它

5)如果调用DriverEntry 来初始化驱动程序,是否可以再次调用它或者必须等到它卸载?所以我加载了我的驱动程序而忘记优雅地卸载它并再次运行我的程序会调用DriverEntry 吗?

我知道这里有很多问题。提前致谢

【问题讨论】:

【参考方案1】:

无法使用旧式 API 安装 KMDF 驱动程序。检查来自 MSDN 的 this sample。

您还需要考虑它是哪种驱动程序,过滤器驱动程序或实际设备驱动程序等。

1) 当服务通过 CreateService 和 OpenService 启动驱动时, 它是调用 DriverEntry 函数还是等到有人 用户级应用使用驱动程序。

一旦驱动程序被加载,它的DriverEntry 例程就会被调用。

2) 当我运行应用程序以将驱动程序加载为服务器时 DbgPrintEx 假设打印 DebugView 或 WinDbg 或其他位置。

当 DebugView 或 WinDbg 均未运行时,输出将丢失并且不会在任何地方打印/记录。

3) 如果我使用CreateService,我的 sys 文件是否必须在 windows/system32/drivers 中 文件夹 ?我在某处读到仅在 64 位机器 CreateService 中 从系统文件夹加载。

较新的窗口有这种限制。

4) 当我将它作为服务启动时,我想在任务中看到它吗 经理

内核驱动程序未在任务管理器中列出,因为它们实际上是操作系统的一部分,而不是单独的应用程序。但是,如果您有用户级服务,它会在运行时列在任务管理器中。

5)如果调用DriverEntry来初始化一个驱动,是否可以再次调用或者 它必须等到它卸载?所以我加载我的驱动程序并忘记 优雅地卸载它并再次运行我的程序会调用 DriverEntry 吗?

每次加载驱动程序时都会调用DriverEntry。如果驱动程序是按需加载的,它将在每次加载/启动驱动程序时运行,即使驱动程序没有正常卸载(例如泄漏内存/锁等)。但是如果驱动程序没有很好地卸载,您可能会导致系统不稳定和蓝屏。

【讨论】:

以上是关于Windows 驱动程序开发本地调试问题。的主要内容,如果未能解决你的问题,请参考以下文章

事后调试.VC_资料01

spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive

[0010] windows 下 eclipse 开发 hdfs程序样例

在云端开发,但通过远程桌面通过 USB 在本地设备上调试 Android 应用程序

本地开发小程序时注意事项

建立PHP的本地调试环境PHP基础教程