以前にも同様の質問がありましたが、回答がありませんでした。私の質問はもう少し一般的です。
C# アプリでEasyHook ライブラリを使用して、notepad.exe などから主要な印刷 API 呼び出しを傍受できるようにする方法を探しています。
私の目標は、メモ帳の印刷を、選択したメモ帳とは異なるプリンターにリダイレクトすることです。
もちろん、これは単なる人為的なテストです。しかし、成功した場合は、このソリューションを使用して、ターゲット プリンターを構成する方法がない実際のレガシー アプリから印刷をリダイレクトします。単にシステムのデフォルト プリンタに出力するだけであり、これは常にユーザーに受け入れられるとは限りません。
さらに、アプリの元のソース コードは、何年も前にベンダーが廃業したときに失われているため、変更する機会はありません。しかし、説明したように、API フックを使用して解決したいと考えています。
さて、問題は、どの API をフックすればよいか、完全にはわからないことです!
API Monitor v2を使用して、メモ帳がOpenPrinterW
内部に呼び出していることを確認できましたPrintConfig.dll
。この特定の DLL のヘッダーは見つかりませんでしたが、winspool.drv内に非常によく似た関数が見つかりました。
注: 嬉しいことに、前の発言は間違っていたと判断しました。winspool.drvにある機能以外に機能はありません。私は API モニターの出力を読み違えて、それPrintConfig.dll
が実装ライブラリーであると想定しましたが、実際にはそれは呼び出し側のライブラリーにすぎません。ふぅ!しかし悲しいことに、まだ葉巻がないので、疑問が残ります.
残念ながら、それをフックする試みはすべて失敗しました。私のコードは単に呼び出されていません。一方、フックなどは、すべてkernel32.dll
のReadFile
テストで期待どおりに機能します。
私は特にフックするという考えに固執していないことに言及する価値がありOpenPrinterW
ます。ここから始めようと思った理由は次のとおりです。
- API モニターは、それが実際に呼び出されていることを示しています (少なくともメモ帳によって)。
- プリンター名を受け入れてハンドルを返し、それが他の印刷呼び出しに渡されるため、正しいもののように見えます。実際の を呼び出す前に、フック内のプリンター名を変更できれば、
OpenPrinterW
おそらく 90% 完了したように感じるでしょう。
それで...何かアイデアはありますか?