【问题标题】:Hooking into Win32 printing API from C# using EasyHook使用 EasyHook 从 C# 连接到 Win32 打印 API
【发布时间】:2020-12-24 13:30:10
【问题描述】:

类似的东西是asked before,但没有收到任何答案。我的问题比较笼统。

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

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

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

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

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

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

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

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

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

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

那么...有什么想法吗?

【问题讨论】:

    标签: c# printing easyhook apimonitor


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 以编程方式将默认打印机更改为所需的打印机不是更容易吗?如果需要,您可以在以后以编程方式将其更改回来
    • 我考虑过,是的。但我拒绝了它,原因有两个: 1. 我必须确保用户总是通过我的启动器启动应用程序,这将执行交换,然后等待应用程序关闭以将设置返回到以前的值。 2. 所有其他应用都会受此影响。
    猜你喜欢
    • 2013-11-28
    • 2012-09-04
    • 2021-11-24
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2010-10-03
    相关资源
    最近更新 更多