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



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

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

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

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

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

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

使用API Monitor v2,我能够确定Notepad调用PrintConfig.dll内部的OpenPrinterW。我找不到这个特定DLL的头,但我在winspool.drv中发现了一个非常相似的函数。

注意:我已经确定之前的说法是错误的,这让我很高兴!除了winspool.drv中的函数之外,没有其他函数。我误解了API Monitor的输出,并假设PrintConfig.dll是实现库,而实际上它只是调用库。呜呜!但遗憾的是,仍然没有雪茄,所以问题依然存在

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

值得一提的是,我并没有接受专门勾搭OpenPrinterW的想法。我选择从这里开始的原因是:

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

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

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

目前,我正试图从注入的DLL中将钩子安装到Notepad进程中,但winspool.drv模块尚未加载到该进程中。它只有在第一次真正需要时才加载。Doh!

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

现在对于剩下的10%的问题…:(

最新更新