Как создать виртуальный файл?

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

Я сначала пытался использовать именованные каналы в соответствии с Windows, чтобы сделать это. Это допускало бы путь как \\.\pipe\mymemoryfile, но я не могу сделать его работами, и я не уверен, что dll поддерживал бы путь как это.

Во-вторых, я нашел CreateFileMapping и GetMappedFileName. Они могут использоваться для моделирования файла во фрагменте другого? Я не уверен, что это - то, что делает этот API.

То, что я пытаюсь сделать, кажется подобным boxedapp. Какие-либо идеи о том, как они делают это? Я предполагаю, что это - что-то как перехват вызовов API (Как Обход), но это было бы большой работой. Там другой путь состоит в том, чтобы сделать это?

Почему? Я интересуюсь этим определенным решением, потому что я хотел бы скрыть данные и в пользу распределения только одного файла, но также и по гиковским причинам создания его прокладывает себе путь ;) Я соглашаюсь, что копирование данных во временный файл работало бы и было бы намного более легким решением.

14
задан Emmanuel Caradec 19 January 2010 в 16:57
поделиться

11 ответов

просто отключите JTabbedPane:

pane.setEnabled(false);

и включите его, если все поля правильно установлены (или какое-либо условие)

-121--4780305-

Сделайте li за исключением навигационных дисплеев: встроенный блок и, возможно, переместите навигационный li в конец списка?

-121--4716541-

Данные можно хранить в потоке NTFS. Таким образом, вы можете получить реальный путь, указывающий на ваши данные, которые вы можете дать в вашей DLL в виде

x:\myfile.exe:mystreamname

Это работает точно как обычный файл, однако он работает только если используется файловая система NTFS. Это стандартный под Windows в настоящее время, но, конечно, не вариант, если вы хотите поддерживать старые системы или хотели бы иметь возможность запустить это с USB-палки или тому подобное. Обратите внимание, что любые потоки, присутствующие в файле, будут потеряны, если файл будет отправлен в виде вложения по почте или просто скопирован из раздела NTFS в раздел FAT32.

Я бы сказал, что наиболее совместимым способом было бы записать ваши данные в реальный файл, но вы, конечно, можете сделать это одним способом в системах NTFS, а другим - в системах FAT. Я рекомендую не делать этого из-за добавленной сложности. Подходящим способом было бы раздать ваши файлы отдельно, конечно, но так как вы указали, что вы не хотите этого, вы должны в таком случае записать его во временный файл и дать dll путь к этому файлу. Убедитесь, что временный файл записан во временную папку пользователя (путь можно найти с помощью GetTempPath в C/C + +).

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

Также, если для распространения требуется только один файл, как насчет использования застежки -молнии или программы установки?

5
ответ дан 1 December 2019 в 12:52
поделиться

Я бы предложил следующую метотологию:

template <typename T>
class MyExample
{
  private:
    vector<shared_ptr<T> > data;

  public:
    shared_ptr<const T> get(int idx) const
    {
      return data[idx];
    }
    shared_ptr<T> get(int idx)
    {
      return data[idx];
    }
    void add(shared_ptr<T> value)
    {
      data.push_back(value);
    }
};

Это обеспечивает конст-верность. Как видно, метод add () использует не < const T >, а < T >, так как класс должен хранить не const Ts. Но при доступе к нему const возвращается < const T >, что не представляет проблем, так как shared_ptr можно легко преобразовать в shared_ptr. И поскольку оба метода get () возвращают копии shared_ptr's во внутреннем месте хранения, вызывающая сторона не может случайно изменить объект, на который указывают внутренние указатели. Это все сравнимо с вариантом неумного указателя:

template <typename T>
class MyExamplePtr
{
  private:
    vector<T *> data;

  public:
    const T *get(int idx) const
    {
      return data[idx];
    }
    T *get(int idx)
    {
      return data[idx];
    }
    void add(T *value)
    {
      data.push_back(value);
    }
};
-121--1178773-

Просто не используйте UTF-8 в LaTex, если вы хотите использовать пакеты объявлений . Использование latin1 в документах будет отображать немецкий Umlauts просто прекрасно.

Я пишу диссертацию на немецком языке, используя следующую настройку:

% Your language, here German
\usepackage[ngerman]{babel} 
% Will work with Umlauts
\usepackage[latin1]{inputenc}
% Euro characters etc.
\usepackage{textcomp}
% Works perfectly with latin1
\usepackage{listings}
-121--918468-

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

Если вы придерживаетесь файлообразного поведения, ваша ставка всегда будет заключаться в использовании файла. В Windows можно передать FILE _ ATTRIBUTE _ TEMPORARY в CreateFile в качестве подсказки для системы, чтобы избежать сброса данных на диск при наличии достаточного объема памяти.

Если вы беспокоитесь о производительности записи на диск, вышеперечисленного должно быть достаточно, чтобы избежать влияния на производительность в большинстве случаев. (Если в системе недостаточно памяти для того, чтобы принудительно выводить файловые данные на диск, это, вероятно, также сильно поменяется местами - у вас уже есть проблема с производительностью.)

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

5
ответ дан 1 December 2019 в 12:52
поделиться

Чтение вашего вопроса заставило меня думать: если вы можете притвориться, что область памяти является файлом и иметь своего рода «виртуальный путь» к нему, то это позволит загрузить DLL непосредственно из памяти, что LoadLibrary запрещает по проекту, спросив имя пути. И вот почему люди пишут свой PE погрузчик, когда они хотят достичь этого.

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

Использование Detours подразумевает, что вам придется реплицировать все, что делает перехваченная функция DLL, за исключением получения данных из реального файла; следовательно, он не является общим. Или, что еще сложнее, представим, что DLL использует fopen ; затем вы предоставляете свой собственный fopen , который обнаруживает специальный образец в пути и вы имитируете C runtime internals... Хмм это действительно стоит всей боли?: D

1
ответ дан 1 December 2019 в 12:52
поделиться

Как насчет использования своего рода Ramdisk и написание файла на этот диск? Я сам попробовал каких-то Рамдиска, хотя никогда не нашел хорошего, скажи мне, если вы успешны.

0
ответ дан 1 December 2019 в 12:52
поделиться

Ну, если вам нужно иметь виртуальный файл, выделенный в своем exe, вам нужно будет создать вектор, поток или массив Char Big достаточно большой, чтобы держать все виртуальные данные, которые вы хотите написать Отказ

Это единственное решение, которое я могу подумать, не делая ввода-вывода на диск (даже если вы не пишете в файл).

Если вам нужно сохранить файл, такой как Syntax Path, просто напишите класс, который имитирует это поведение и вместо того, чтобы писать в файл, напишите на буфер памяти. Это так же просто, как он получает. Помню поцелуй.

ура

0
ответ дан 1 December 2019 в 12:52
поделиться

Так как у вас нет контроля над DLL, вы должны предположить, что DLL ожидает фактического файла. Это, вероятно, в какой-то момент делает это предположение, почему именованные трубы не могут в вас.

Самое простое решение состоит в том, чтобы создать временный файл в каталоге Temp, напишите данные из EXE в файл Temp, а затем удалите временный файл.

Есть ли причина, по которой вы встраиваете этот «псевдо-файл» в конце вашего EXE вместо того, чтобы просто распространять его с нашим приложением? Вы, очевидно, уже уже распространяете эту третью сторону DLL с вашим приложением, поэтому еще один файл, похоже, это не повсюжет?

Другой вопрос, будет ли эти данные меняться? То есть вы ожидаете записать данные в этот «псевдо-файл» в вашем EXE? Я не думаю, что это будет работать хорошо. Стандартные пользователи могут не иметь доступа записи к EXE, и это, вероятно, будет вести антивирусные гайки.

И нет CreateFileMapping и GetMappedFileName определенно не будут работать, так как они не дают вам имя файла, которое может быть передано в CreateFile. Если вы могли бы как-то получить эту DLL, чтобы принять ручку, то это будет работать.

И я бы даже не буду беспокоиться с перехватом API. Просто рушите DLL путь к aCutal файл.

3
ответ дан 1 December 2019 в 12:52
поделиться

Откройте файл под названием «Nul:» для записи. Он пишется, но данные молча выброшены. Вроде как / dev / null of * nix славы.

Вы не можете карта памяти, хотя. Отображение памяти подразумевает доступ для чтения / записи, а Nul - только для записи.

0
ответ дан 1 December 2019 в 12:52
поделиться

Пожалуйста, объясните, почему вы не можете извлечь данные из EXE и запишите его во временный файл. Многие приложения делают это - это классическое решение этой проблемы.

Если вы действительно должны предоставить «виртуальный файл», самое чистое решение, вероятно, является драйвером фильтра файловой системы. «Чистый» не означает «хороший» - фильтр является полностью задокументированным и поддерживаемым решением, поэтому он является более чистым, чем подключение API, инъекция и т. Д. Однако фильтры файловых систем не просты.

OSR онлайн - лучшее место для поиска информации о файловой системе Windows. Почтовый список NTFSD NTFSD - это где разработчики файловых систем тусуются.

1
ответ дан 1 December 2019 в 12:52
поделиться

Я предполагаю, что этот DLL не может взять поток? Это почти для простого спросить, но если бы он мог просто использовать это.

0
ответ дан 1 December 2019 в 12:52
поделиться

Вы пытались использовать \? \ Prefix при использовании именованных труб? Многие API поддерживают использование \? \, Чтобы пройти оставшуюся часть пути непосредственно без какого-либо анализа / модификации.

http://msdn.microsoft.com/en-us/library/aaa365247 (vs.85, легкий) .aspx

0
ответ дан 1 December 2019 в 12:52
поделиться

Почему не просто добавить его как ресурс - http://msdn.microsoft.com/en-us/library/7k989cfy (vs.80) .aspx - так же, как вы добавили значок.

0
ответ дан 1 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: