В общем, задача такая: есть чужое приложение (допустим, Word), ему надо подсунуть какое-нибудь имя файла, которого реально нет на диске, но все обращения к нему перехватывались моей программой и подставлялись нужные данные, "как будто из этого файла". Т.е. что-то типа виртуального диска, но только файл. Нужно на Win32 не ниже Windows XP. Из вариантов: 1) Свой драйвер-перехватчик обращений к диску, по типу как это сделано в filemon. Способ в теории рабочий, но слишком уж геморный - надо отслеживать всю таблицу открытых файлов, проверять каждый раз не к твоему ли это файлу было обращение, бока с быстродействием и т.п. Короче плохой способ. Но рабочий. 2) CreateNamedPipe или CreateFileA ('\\.\pipe\mypipe') и подсовывание "этого" в качестве имени файла в стандартный диалог File->Open. Способ простой, но у меня не заработало. И не знаю в принципе, может ли работать. В смысле можно ли стороннее приложение, которое работает только с файлами и про пайпы ничего не знает, таким вот образом обмануть. Все-таки пайп - не совсем файл. 3) Виртуальная шара. Сделать, чтобы в качестве имени файла было что-то типа "\\localhost\myshare\file.txt" и самому как-то обрабатывать обращения к этой шаре из приложения-сервера в терминологии "клиен-серверной архитектуры". Что-то типа сетевого демона в *NIX. Это намного проще, чем перехват обращений к диску, скорее всего не придется лезть на 0-е кольцо, плюс возможно тут не понадобится фильтрация ВСЕХ обращений -> увеличится быстродействие. Но я тут не знаю, в какую сторону копать. На какой уровень сетевого взаимодействия встраиваться, какой стек юзать (по идее, TCP/IP тут совсем не обязательно, может есть проще?). 4) Свой виртуальный диск, а на нем уже виртуальный файл. Тоже рабочий способ, но тоже очень сложный. Помимо обращений к файлу надо еще как-то эмулировать всю файловую систему, плюс опять же, все это должно происходить на уровне ядра, а дебажить драйвер - развлечение еще то. Хотелось бы как-то попроще. Какие есть еще варианты?
первый способ можно по разному сделать, проще всего наверное апи похукать... вообще можно в ринг3 сделать, допустим инжектом в целевой процесс и сплайсингом функций...
Апи хукать плохо тем, что одни процессы будут видеть файл, другие не будут, всякие там OLE вообще начнут глючить, да и сам процесс тоже, если сначала напрямую общался, потом через тебя начал - не известно, как себя поведет. Ну то есть да, способ тоже условно рабочий, но потенциально очень глючный. И уж точно не проще, чем с пайпом. Хотя в принципе простой, да.
nu10n Вы забыли добавить что это ваше ИМХО. Реально же, это лучший способ из предложенного. А по скорости - как реализуете - так и будет. При грамотной реализации тормозов не увидите. Сложно? ну если вы первый раз с ядром то да.
Вообще-то сделать драйвер своего символьного устройства, по типу '\\.\my_driver' намного проще. А пайп - вообще в две строчки. Если б способ 2 заработал - было бы идеально. Может в винде есть какой-то стандартный способ это сделать? Ну типа аналог линухового mknode? Неохота лезть в ядро, неохота что-то патчить, хочется какого-то "официального" пути. Из моих способов только 3) можно назвать официальным, возможно ему даже админские права не понадобятся. Но как, с какой стороны к этому подойти? Точно нету ничего подобного в самой винде? Точно пайпы - это не то? Может какой-то их аналог есть?
пайп "откроется" как файл, но насчет записи/чтения - то вряд ли выйдет... тут недавно же тема была про кормление ноутпада пайпами...
Если есть деньги, то можешь воспользоваться готовыми решениями вроде тех, что Eldos предлагает. Но это довольно таки дорого. Есть, называется WebDAV. Смысл в том, что ты пишешь HTTP-сервер и поднимаешь его на локалке, через WebDAV создаёшь подключение и мапишь его на букву тома типа N:, после чего в системе появляется сетевой "виртуальный" том. Ну и файлы с этого тома уже можно открывать в приложениях как и любые другие файлы, а их контент отдавать в локальном сервере. Всё это будет работать начиная с Windows XP. Только ты подумай, будет ли это проще, чем reparse-файловый фильтр, который на минифильтрах пишется в несколько десятков строчек? Думаю, что нет, так что дорога тебе к файловым фильтрам, как ни крути. Такие программы, как Блокнот, Word и т.д. обычно работают с файлами через секции. Т.е. даже если тебе удасться подсунуть имя пайпа вместо имени файла, то при попытке создать секцию приложение получит отлуп в NtCreateSection(). Да и как ты себе представляешь рандомный доступ к пайпу, если пайп строго последователен? Короче говоря, это совершенно нерабочий способ.