涉及splwow64.exe时如何检测打印应用程序?
How to detect printing app when splwow64.exe is involved?
我们有一个打印驱动程序,可以在驱动程序的 UI 模块中捕获打印 exe 的名称。它通过使用 GetModuleFileName
函数来实现。在 64 位机器上打印 32 位之前,此方法一直有效。在那种情况下 Windows 调用 splwow64.exe 代表 32 位应用程序进行打印,因此 GetModuleFileName
returns "splwow64.exe" 作为打印应用程序而不是打印应用程序那实际上是在打印。
我们试图通过使用 Toolhelp32 API 捕获 splwow64.exe 的父进程来解决此问题,但这并不可靠,因为一旦第一个应用程序完成打印以便为其他应用程序提供服务,splwow64 就会保持加载状态应用。这意味着父进程可能是也可能不是实际打印的进程。到目前为止,我们一直找不到连接 splwow64 和打印应用程序的任何文件或命名管道或其他 IPC 对象。
Microsoft 发布了一个修补程序 (KB2815716),导致 splwow64 在用户指定的超时期限后终止,但这并没有解决问题,因为 splwow64.exe 会在第一次打印时无限期地保留在内存中调用它的应用程序保持加载状态。它完全忽略热修复提供的超时。 (我认为这是一个 Windows 错误。)
我的问题是:
我们需要一种方法来可靠地确定正在打印的应用程序恰好是 32 位并且正在使用 splwow64.exe。
解决方案可以驻留在打印驱动程序或用户模式应用程序中——两者都可以。我们强烈建议不要使用涉及 API 挂钩或代码注入的技术,因为这些操作往往会被防病毒软件标记。
我根据引用的修补程序假设您的目标机器是 Vista 之后的机器。
具有成员
的GetPrintExecutionData
function looks to provide the information you want. It does assume you're running in the context of the spooler, but from the question, that doesn't seem to be a problem. The function returns a PRINT_EXECUTION_DATA
结构
[...]clientAppPID [which] identifies the client application on whose behalf the splwow64.exe process loaded the printer driver.
KB2815716 中提到的问题可能仍会影响此问题。我假设 KB 安装已经过验证并且超时是默认值(2 分钟)或非零。知识库对于是请求打印的进程必须终止还是打印作业必须终止有点含糊不清。此外,如果打印以任何方式涉及终端服务,如 KB2513330
,那么您可能需要设置 Sysprocs
键。
我们有一个打印驱动程序,可以在驱动程序的 UI 模块中捕获打印 exe 的名称。它通过使用 GetModuleFileName
函数来实现。在 64 位机器上打印 32 位之前,此方法一直有效。在那种情况下 Windows 调用 splwow64.exe 代表 32 位应用程序进行打印,因此 GetModuleFileName
returns "splwow64.exe" 作为打印应用程序而不是打印应用程序那实际上是在打印。
我们试图通过使用 Toolhelp32 API 捕获 splwow64.exe 的父进程来解决此问题,但这并不可靠,因为一旦第一个应用程序完成打印以便为其他应用程序提供服务,splwow64 就会保持加载状态应用。这意味着父进程可能是也可能不是实际打印的进程。到目前为止,我们一直找不到连接 splwow64 和打印应用程序的任何文件或命名管道或其他 IPC 对象。
Microsoft 发布了一个修补程序 (KB2815716),导致 splwow64 在用户指定的超时期限后终止,但这并没有解决问题,因为 splwow64.exe 会在第一次打印时无限期地保留在内存中调用它的应用程序保持加载状态。它完全忽略热修复提供的超时。 (我认为这是一个 Windows 错误。)
我的问题是:
我们需要一种方法来可靠地确定正在打印的应用程序恰好是 32 位并且正在使用 splwow64.exe。
解决方案可以驻留在打印驱动程序或用户模式应用程序中——两者都可以。我们强烈建议不要使用涉及 API 挂钩或代码注入的技术,因为这些操作往往会被防病毒软件标记。
我根据引用的修补程序假设您的目标机器是 Vista 之后的机器。
具有成员
的GetPrintExecutionData
function looks to provide the information you want. It does assume you're running in the context of the spooler, but from the question, that doesn't seem to be a problem. The function returns a PRINT_EXECUTION_DATA
结构
[...]clientAppPID [which] identifies the client application on whose behalf the splwow64.exe process loaded the printer driver.
KB2815716 中提到的问题可能仍会影响此问题。我假设 KB 安装已经过验证并且超时是默认值(2 分钟)或非零。知识库对于是请求打印的进程必须终止还是打印作业必须终止有点含糊不清。此外,如果打印以任何方式涉及终端服务,如 KB2513330
,那么您可能需要设置 Sysprocs
键。