私は Delphi XE2 で書かれたリソース リーク検出ユニットに取り組んでいます。ハンドル (ファイル ハンドル、イベント ハンドルなど) と GDI オブジェクト (ビットマップ、ブラシなど) の作成と削除を監視したいと考えています。そのため、ハンドルまたは GDI オブジェクトが作成されるたびにリストに追加し、削除されたら削除します。このようにして、リークや重複削除を検出できます。これを実現するために、インポート テーブルを変更して、静的にリンクされた API をフックします。遅延ロードされた、または GetProcAddress によって取得された API は、別の方法でフックされますが、それは私の質問にとって重要ではありません。
背景情報はここまでにして、質問に移りましょう。
静的にリンクされた関数のフッキング アルゴリズムを作成していたとき、PE ファイル形式、特にインポート テーブルを調べる必要がありました。一部のインポートされた関数 (私の場合は「CloseHandle」など) が 2 回インポートされていることに気付きました! 一部のモジュールが複数回表示されることもわかりました。たとえば、モジュール「kernel32.dll」は、私が取り組んでいたアプリケーションの 6 回発生しました。
私の質問は、一部の関数がインポート テーブルに複数回表示されるのはなぜですか。また、一部のモジュールがインポート テーブルに複数回表示されるのはなぜですか?
私のアプリケーションでは、関数の出現箇所をすべて自分の関数 (フック) に置き換えるだけですが、これらの重複の理由は何だろうと思っていました。理由がわかったら、アプリケーションを変更する必要があるかもしれません。