Создать виртуальный файл.

Тема в разделе "WASM.WIN32", создана пользователем nu10n, 23 ноя 2010.

  1. nu10n

    nu10n New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2010
    Сообщения:
    3
    В общем, задача такая: есть чужое приложение (допустим, Word), ему надо подсунуть какое-нибудь имя файла, которого реально нет на диске, но все обращения к нему перехватывались моей программой и подставлялись нужные данные, "как будто из этого файла". Т.е. что-то типа виртуального диска, но только файл. Нужно на Win32 не ниже Windows XP.

    Из вариантов:

    1) Свой драйвер-перехватчик обращений к диску, по типу как это сделано в filemon. Способ в теории рабочий, но слишком уж геморный - надо отслеживать всю таблицу открытых файлов, проверять каждый раз не к твоему ли это файлу было обращение, бока с быстродействием и т.п. Короче плохой способ. Но рабочий.

    2) CreateNamedPipe или CreateFileA ('\\.\pipe\mypipe') и подсовывание "этого" в качестве имени файла в стандартный диалог File->Open. Способ простой, но у меня не заработало. И не знаю в принципе, может ли работать. В смысле можно ли стороннее приложение, которое работает только с файлами и про пайпы ничего не знает, таким вот образом обмануть. Все-таки пайп - не совсем файл.

    3) Виртуальная шара. Сделать, чтобы в качестве имени файла было что-то типа "\\localhost\myshare\file.txt" и самому как-то обрабатывать обращения к этой шаре из приложения-сервера в терминологии "клиен-серверной архитектуры". Что-то типа сетевого демона в *NIX. Это намного проще, чем перехват обращений к диску, скорее всего не придется лезть на 0-е кольцо, плюс возможно тут не понадобится фильтрация ВСЕХ обращений -> увеличится быстродействие. Но я тут не знаю, в какую сторону копать. На какой уровень сетевого взаимодействия встраиваться, какой стек юзать (по идее, TCP/IP тут совсем не обязательно, может есть проще?).

    4) Свой виртуальный диск, а на нем уже виртуальный файл. Тоже рабочий способ, но тоже очень сложный. Помимо обращений к файлу надо еще как-то эмулировать всю файловую систему, плюс опять же, все это должно происходить на уровне ядра, а дебажить драйвер - развлечение еще то. Хотелось бы как-то попроще.

    Какие есть еще варианты?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    первый способ можно по разному сделать, проще всего наверное апи похукать... вообще можно в ринг3 сделать, допустим инжектом в целевой процесс и сплайсингом функций...
     
  3. nu10n

    nu10n New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2010
    Сообщения:
    3
    Апи хукать плохо тем, что одни процессы будут видеть файл, другие не будут, всякие там OLE вообще начнут глючить, да и сам процесс тоже, если сначала напрямую общался, потом через тебя начал - не известно, как себя поведет. Ну то есть да, способ тоже условно рабочий, но потенциально очень глючный. И уж точно не проще, чем с пайпом. Хотя в принципе простой, да.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Вариант (1) самый правильный, нет необходимости искать что-то ещё.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    nu10n
    Вы забыли добавить что это ваше ИМХО.
    Реально же, это лучший способ из предложенного. А по скорости - как реализуете - так и будет. При грамотной реализации тормозов не увидите. Сложно? ну если вы первый раз с ядром то да.
     
  6. nu10n

    nu10n New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2010
    Сообщения:
    3
    Вообще-то сделать драйвер своего символьного устройства, по типу '\\.\my_driver' намного проще. А пайп - вообще в две строчки. Если б способ 2 заработал - было бы идеально.

    Может в винде есть какой-то стандартный способ это сделать? Ну типа аналог линухового mknode?

    Неохота лезть в ядро, неохота что-то патчить, хочется какого-то "официального" пути. Из моих способов только 3) можно назвать официальным, возможно ему даже админские права не понадобятся. Но как, с какой стороны к этому подойти?

    Точно нету ничего подобного в самой винде? Точно пайпы - это не то? Может какой-то их аналог есть?
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    пайп "откроется" как файл, но насчет записи/чтения - то вряд ли выйдет... тут недавно же тема была про кормление ноутпада пайпами...
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Если есть деньги, то можешь воспользоваться готовыми решениями вроде тех, что Eldos предлагает. Но это довольно таки дорого.

    Есть, называется WebDAV. Смысл в том, что ты пишешь HTTP-сервер и поднимаешь его на локалке, через WebDAV создаёшь подключение и мапишь его на букву тома типа N:, после чего в системе появляется сетевой "виртуальный" том. Ну и файлы с этого тома уже можно открывать в приложениях как и любые другие файлы, а их контент отдавать в локальном сервере. Всё это будет работать начиная с Windows XP. Только ты подумай, будет ли это проще, чем reparse-файловый фильтр, который на минифильтрах пишется в несколько десятков строчек? Думаю, что нет, так что дорога тебе к файловым фильтрам, как ни крути.

    Такие программы, как Блокнот, Word и т.д. обычно работают с файлами через секции. Т.е. даже если тебе удасться подсунуть имя пайпа вместо имени файла, то при попытке создать секцию приложение получит отлуп в NtCreateSection(). Да и как ты себе представляешь рандомный доступ к пайпу, если пайп строго последователен? Короче говоря, это совершенно нерабочий способ.
     
  9. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    в 7ке пайпом прийдется общаться между кольцами, если у вас продукт: driver + win32 app
     
  10. amdf

    amdf New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2011
    Сообщения:
    39
    А что за FILE_ATTRIBUTE_VIRTUAL в Vista? Как такие файлы создаются?