Winapi 当涉及splwow64.exe时,如何检测打印应用程序?

Winapi 当涉及splwow64.exe时,如何检测打印应用程序?,winapi,wdk,print-spooler-api,Winapi,Wdk,Print Spooler Api,我们有一个打印驱动程序,它在驱动程序的UI模块中捕获打印exe的名称。它通过使用GetModuleFileName函数来实现这一点。在64位机器上打印出32位之前,这种方法一直很有效。在这种情况下,Windows调用splwow64.exe代表32位应用程序进行打印,因此GetModuleFileName返回“splwow64.exe”作为打印应用程序,而不是实际进行打印的应用程序 我们试图通过使用Toolhelp32 API捕获splwow64.exe的父进程来解决此问题,但这并不可靠,因为s

我们有一个打印驱动程序,它在驱动程序的UI模块中捕获打印exe的名称。它通过使用
GetModuleFileName
函数来实现这一点。在64位机器上打印出32位之前,这种方法一直很有效。在这种情况下,Windows调用splwow64.exe代表32位应用程序进行打印,因此
GetModuleFileName
返回“splwow64.exe”作为打印应用程序,而不是实际进行打印的应用程序

我们试图通过使用Toolhelp32 API捕获splwow64.exe的父进程来解决此问题,但这并不可靠,因为splwow64在第一个应用程序完成打印后仍保持加载状态,以便为其他应用程序提供服务。这意味着父进程可能是也可能不是实际正在打印的进程。到目前为止,我们还无法找到任何连接splwow64和打印应用程序的文件、命名管道或其他IPC对象

Microsoft发布了一个热修复程序(KB2815716),该程序会导致splwow64在用户指定的超时时间后终止,但这并不能解决问题,因为只要调用它的第一个打印应用程序保持加载状态,splwow64.exe就会无限期地保留在内存中。它完全忽略热修复程序提供的超时。(我认为这是Windows漏洞)

我的问题是:

我们需要一种方法来可靠地确定哪个应用程序恰好是32位并且正在使用splwow64.exe时正在打印


该解决方案可以驻留在打印驱动程序中,也可以驻留在用户模式应用程序中,两者都可以。我们强烈建议不要使用涉及API挂接或代码注入的技术,因为这些操作往往会被反病毒软件标记。

我从引用的修补程序中假设,您的目标是Vista之后的机器

该函数将提供所需的信息。它确实假设您正在后台处理程序的上下文中运行,但从问题来看,这似乎不是问题。函数返回包含成员的结构

[…]clientAppPID[它]标识splwow64.exe进程代表其加载打印机驱动程序的客户端应用程序


KB2815716中提到的问题可能仍会影响这一点。我假设KB安装已经过验证,并且超时是默认值(2min)或非零。KB对于是请求打印的进程必须终止,还是打印作业必须终止有点含糊不清。另外,如果终端服务以任何方式涉及到打印,如在
KB2513330
中,那么您可能需要设置
Sysprocs
键。

哇,我已经使用Windows打印子系统多年了,我认为我知道其中的每个功能,但您刚刚发现了一个我不知道的存在。非常感谢你!