是否有可能从另一个进程捕获“找不到文件”,然后将文件返回到该进程?

时间:2010-06-08 20:02:29

标签: .net windows error-handling filesystems file-not-found

我有一个遗留应用程序,用于查找目录中的文件。它不能很好地处理丢失的文件。我想要做的是“捕获”文件未找到错误,并将另一个文件发送回调用应用程序。类似于如何在Web服务器上处理404错误并根据请求的URL返回内容,除了在本地文件系统上。

这可能吗?更优选的是,是否可以在.Net?

4 个答案:

答案 0 :(得分:2)

是的,你所描述的是可能的。

我建议使用filesystem filter driver or mini filter来处理这种类型的事情,尽管在.Net中无法做到这一点。

我建议的方式可能是在文件系统级别捕获所有内容的最恰当方式。

答案 1 :(得分:2)

您可以通过拦截对Win API函数CreateFile的调用来完成此操作。这需要dll注入。在.NET中,您可以使用此库:easyhook.codeplex.com

答案 2 :(得分:2)

如果商业解决方案可以接受,那么像Eldos CallbackFilter这样的东西可能符合要求:

http://www.eldos.com/cbflt/spec.php

我没有完全用你的目的使用它,但你当然可以拦截文件系统调用,你可以检查文件是否存在,如果不存在则创建一个虚拟文件。

对于整理行为不当的遗留应用程序来说,这可能更为直接。

答案 3 :(得分:1)

如果您知道进程中的代码将打开文件的位置,您可以编写一个围绕它的包装器进程,其作用类似于调试器,拦截该调用,检查它是否存在,如果不存在,如果不存在,用不同的文件名替换文件名。

类似的东西:

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注入都可以帮助你。

Microsoft拥有可以帮助您的Detours程序包,CodePlex的EasyHook看起来非常有趣。