ディレクトリ内のファイルを検索する従来のアプリケーションがあります。不足しているファイルをうまく処理できません。私がやりたいことは、エラーが見つからないファイルを「キャプチャ」し、代わりに別のファイルを呼び出し元のアプリに送り返すことです。Web サーバーで 404 エラーを処理し、ローカル ファイル システムを除いて、要求された URL に基づいて何かを返す方法と同様です。
これは可能ですか?そして、より好ましくは、.Netで可能ですか?
ディレクトリ内のファイルを検索する従来のアプリケーションがあります。不足しているファイルをうまく処理できません。私がやりたいことは、エラーが見つからないファイルを「キャプチャ」し、代わりに別のファイルを呼び出し元のアプリに送り返すことです。Web サーバーで 404 エラーを処理し、ローカル ファイル システムを除いて、要求された URL に基づいて何かを返す方法と同様です。
これは可能ですか?そして、より好ましくは、.Netで可能ですか?
これを行うには、WinAPI関数CreateFileの呼び出しをインターセプトします。これにはdllインジェクションが必要です。.NETでは、次のライブラリを使用できます:easyhook.codeplex.com
はい、あなたが説明したことは可能です。
このタイプの場合は、ファイルシステムフィルタードライバーまたはミニフィルターを使用することをお勧めしますが、.Netでは実行できません。
私が提案している方法は、おそらくファイルシステムレベルですべてをキャッチする最も適切な方法です。
商用ソリューションが受け入れられる場合は、Eldos CallbackFilter のようなものが適している可能性があります。
http://www.eldos.com/cbflt/spec.php
私はそれをあなたの目的に正確に使用したわけではありませんが、ファイルが存在するかどうかを確認し、存在しない場合はダミーのファイルを作成できるファイルシステム呼び出しを確実にインターセプトできます。
これは、動作の悪いレガシー アプリケーションを整理するのに、はるかに簡単であることが証明される可能性があります。
ファイルを開くプロセスのどこにコードがあるかがわかっている場合は、デバッガーのように機能するラッパープロセスを記述し、呼び出しをインターセプトして、自分で存在するかどうかを確認し、存在しない場合はファイル名を置き換えます。別のもので。
何かのようなもの:
CreateProcess(bla bla, DEBUG_ONLY_THIS_PROCESS, bla bla);
SetBreakPoint(address of code to set breakpoint)
{
ReadProcessMemory to save off byte for breakpoint
WriteProcessMemory 0xCC to set breakpoint
FlushInstructionCache
}
while (TRUE == bContinue)
{
bContinue = WaitForDebugEvent(&debugEvent);
switch (dwDebugEventCode)
{
case EXCEPTION_BREAKPOINT:
// Read the file name from memory, check if it exists, if not, replace it with
// new file name using the same length in memory :)
// Replace your code byte you read out when you set the breakpoint
}
}
もう1つの方法は、関数呼び出しテーブルをCreateFile(または問題のアプリで使用しているもの)への独自の呼び出しで上書きすることです。APIフックを調べてください。そうしないと、Dllインジェクションでさえここで役立つ場合があります。
Microsoftにはあなたを助けることができるDetoursパッケージがあり、CodePlexには非常に興味深いEasyHookがあります。