繁体   English   中英

使用 EasyHook 从 C# 挂接到 Win32 打印 API

[英]Hooking into Win32 printing API from C# using EasyHook

之前问过类似的问题,但没有得到任何答案。 我的问题有点笼统。

我正在寻找一种在 C# 应用程序中使用EasyHook 库的方法,这将使我能够拦截来自 notepad.exe 的键打印 API 调用。

我的目标是将记事本的打印重定向到与所选记事本不同的打印机

当然,这只是一个人为的测试。 但如果证明成功,我会使用该解决方案从无法配置目标打印机的实际遗留应用程序重定向打印。 它只是打印到系统默认打印机,这并不总是为用户所接受。

此外,该应用程序的原始源代码已在多年前供应商倒闭时丢失,因此没有机会对其进行修改。 但我希望使用 API 钩子来解决它,如解释的那样。

现在,问题是我不完全确定要挂钩哪些 API!

使用API Monitor v2 ,我能够确定记事本调用了PrintConfig.dll中的OpenPrinterW 我找不到这个特定 DLL 的标头,但我在winspool.drv中找到了一个非常相似的 function。

注意:我确定之前的陈述是错误的,这让我很高兴! 除了winspool.drv中的那个,没有其他任何 function。 我误读了 API Monitor 的 output,并假设PrintConfig.dll是实现库,而实际上它只是调用库。 呸,但遗憾的是,仍然没有雪茄。 所以问题来了。

不幸的是,我所有的挂钩尝试都失败了。 我的代码根本没有被调用。 另一方面,挂钩例如kernel32.dllReadFile在我的所有测试中都按预期工作。

值得一提的是,我并不赞成专门挂钩OpenPrinterW的想法。 我选择从这里开始的原因是:

  1. API Monitor 显示它确实是被调用的那个(至少记事本是这样)。
  2. 看起来是正确的,因为它接受打印机名称并返回一个句柄,然后将其传递给其他打印调用。 如果我可以在调用实际的OpenPrinterW之前更改挂钩内的打印机名称,我会觉得我可能已经完成了 90%。

所以...有什么想法吗?

我在钩子 DLL 中添加了一些额外的日志记录代码后发现了问题。

目前我正在尝试从我注入的 DLL 中将钩子安装到记事本进程中, winspool.drv模块尚未加载到该进程中。 它只会在第一次实际需要时加载。 呸!

一个简单的LoadLibrary调用解决了我的问题,我现在可以成功拦截OpenPrinterW API。

现在剩下的 10% 的问题……:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM