我有一个传统的应用程序,在一个目录中查找文件。 它不能很好地处理丢失的文件。 我想要做的是“捕获”文件找不到错误,并将另一个文件发送callback用应用程序。 类似于您可以在Web服务器上处理404错误,并根据请求的URL返回的内容,本地文件系统除外。
这可能吗? 更可取的是,在.Net中可能吗?
您可以通过拦截对Win API函数CreateFile的调用来做到这一点。 这需要DLL注入。 在.NET中,你可以使用这个库: easyhook.codeplex.com
如果商业解决方案是可以接受的,那么像Eldos CallbackFilter这样的东西可能适合这个法案:
http://www.eldos.com/cbflt/spec.php
我没有把它用于你的目的,但你可以拦截文件系统调用,在那里你可以检查文件是否存在,并创建一个虚拟的,如果不存在。
对于整理糟糕的行为遗留应用程序,这可能证明是更直接的。
是的,你所描述的是可能的。
我建议使用文件系统过滤器驱动程序或微型过滤器这种类型的东西虽然不能在.Net中完成。
我建议的方式可能是在文件系统级别捕捉所有内容的最合适的方式。
如果你知道要打开文件的进程中的代码,你可以在它周围编写一个包装过程,就像调试器一样,拦截调用,检查它是否存在,如果不存在,替换文件名与另一个不同。
就像是:
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 } }
另一种方法是用你自己的CreateFile调用(或者在应用程序中使用的任何东西)覆盖函数调用表。 查找API钩子,甚至Dll注入可能会帮助你在这里。
微软有Detours软件包可以帮助你,CodePlex的EasyHook看起来很有趣。