[英]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.dll
的ReadFile
在我的所有测试中都按预期工作。
值得一提的是,我并不赞成专门挂钩OpenPrinterW
的想法。 我选择从这里开始的原因是:
OpenPrinterW
之前更改挂钩内的打印机名称,我会觉得我可能已经完成了 90%。所以...有什么想法吗?
我在钩子 DLL 中添加了一些额外的日志记录代码后发现了问题。
目前我正在尝试从我注入的 DLL 中将钩子安装到记事本进程中, winspool.drv
模块尚未加载到该进程中。 它只会在第一次实际需要时加载。 呸!
一个简单的LoadLibrary
调用解决了我的问题,我现在可以成功拦截OpenPrinterW
API。
现在剩下的 10% 的问题……:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.