0

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

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

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

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

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

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

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

注意:我已经确定之前的陈述是错误的,这让我很高兴!除了winspool.drv中的功能之外,没有任何其他功能。我误读了 API Monitor 的输出,并假设它PrintConfig.dll是实现库,而实际上它只是调用库。呸!但可悲的是,仍然没有雪茄,所以问题是存在的。

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

值得一提的是,我并没有特别赞同挂钩的想法OpenPrinterW。我选择从这里开始的原因是:

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

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

4

1 回答 1

0

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

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

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

现在解决剩下的 10% 的问题...... :)

于 2020-12-24T14:09:07.970 回答