Можно ли перехватить «файл не найден» из другого процесса и затем вернуть файл этому процессу? - PullRequest
1 голос
/ 09 июня 2010

У меня есть устаревшее приложение, которое ищет файлы в каталоге.Он не очень хорошо справляется с отсутствующими файлами.То, что я хочу сделать, это «перехватить» файл не найденных ошибок и отправить вместо него другой файл обратно в вызывающее приложение.Подобно тому, как вы могли бы обработать ошибку 404 на веб-сервере и вернуть что-то, основываясь на том, что был запрошенный URL, кроме локальной файловой системы.

Возможно ли это?И более предпочтительно, возможно ли это в .Net?

Ответы [ 4 ]

2 голосов
/ 09 июня 2010

Вы можете сделать это, перехватив вызов Win API-функции CreateFile.Это требует инъекции DLL.В .NET вы можете использовать эту библиотеку: easyhook.codeplex.com

2 голосов
/ 09 июня 2010

Если коммерческое решение приемлемо, то что-то вроде Eldos CallbackFilter может удовлетворить все требования:

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

Я не использовал его именно для ваших целей, но вы, конечно, можетеперехватывать вызовы файловой системы, где вы можете проверить, существует ли файл, и создать фиктивный, если его нет.

Это может оказаться намного проще для сортировки унаследованного приложения с плохим поведением.

2 голосов
/ 09 июня 2010

Да, то, что вы описали, возможно.

Я бы предложил использовать драйвер фильтра файловой системы или мини-фильтр для этого типа вещей, чего нельзя сделать в .Net.

Способ, который я предлагаю, вероятно, является наиболее подходящим способом, который ловит все на уровне файловой системы.

1 голос
/ 09 июня 2010

Если вы знаете, где код в процессе, который собирается открыть файл, вы можете написать процесс-обертку вокруг него, который действует как отладчик, перехватить вызов, проверить, существует ли он сам, и если нет, замените имя файла другим.

Что-то вроде:

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 , который выглядит довольно интересно.

...