. Вечер добрый и спасибо Всем, Кто попытался помочь. немного поэксперементировав и поразмыслив попытаюсь сформулировать вопросы более конкретно. прошу не судить строго, если буду говорить откровенно глупые вещи — я только начинаю свое путешествие к нижним уровням программирования (за спиной только год консольного c/c++, начальная стадия изучения Win32Api). Итак, имеем: — Win32 приложение на c++(vc++2008 Express) (НАША система и НАШЕ приложение); — произвольный файл любого типа(.exe, .avi и т.д.(ресурсы, определяемые программистом)), загруженный в файл ресурсов(.rc); — во время выполнения приложения мы из файла ресурсов получаем указатель на первый байт искомого файла с помощью функций FindResource(), LoadResource(), LockResource(); Задача: — открыть файл(или запустить на выполнение) прямо из файла ресурсов(без копирования на винт); Эксперимент (ВСЕ В КОНТЕКСТЕ WIN32): 1) загружаю .txt файл в файл ресурсов(.rc); 2) с помощью FindResource(), LoadResource(), LockResource() получаю указатель на первый байт блока памяти .txt файла, который хранится в скомпилированном файле ресурсов; 3) методом "научного тыка" прихожу к выводу, что этот блок памяти идентичен обычному .txt файлу, только без строкового имени (есть возможность спокойно извлекать из него строки и работать с ними); Предположения: 1) строковой идентификатор файла — это одно из полей какой-нибудь структуры-описания блока данных, которая вдобавок содержит еще и ID сегмента памяти, адрес начала блока данных в этом сегменте, размер блока данных и тип блока данных (чтобы знать как его обрабатывать); 2) при создании файла ось где-то в своих недрах создает и инициализирует такую структуру, связывая ее с блоком данных на диске; Если где-то не попал, пожалуйста поправте. Вопросы: 1) можно ли как-то присвоить неименованному блоку данных строковой идентификатор или зарегистрировать его в системе? (мы знаем сегмент памяти(тот же, что и у нашего процесса), адрес начала блока данных, его размер и тип); 2) с помощью ShellExecute() мы можем открыть файл, сообщив функции его строковой идентификатор. а есть ли подобная функция, которой для выполнения блока данных можно передать сегмент памяти, адрес блока данных, их размер и тип? 3) как в ОС происходит процесс открытия файла и что нужно для того, чтобы написать его самостоятельно? 4) как реализована функция PlaySound() (она воспроизводит .wav файл прямо из файла ресурсов); Просьба: если не сложно, попытайтесь объяснять как совсем деревянному, либо дайте ссылку, где эти вопросы подробно описаны (желательно с указанием главы). Заранее благодарен всем за ответы.
alexandersson выделаяешь память, копируешь хидер, секции, настраиваешь импорт, релоки, ещё peb поправить нужно и прыгаешь на точку входа )
alexandersson Ну если это - исполняемый файл, то можно выполнить действия аналогичные действиям CreateProcess с соответствующими изменениями. А произвольный файл любого типа - не получится, т.к. все остальные файлы открываются другими программами, в качастве параметра к которым передаётся имя файла. Например при открытии файла "C:\qwe.txt" выполняется следующая команда: "notepad.exe C:\qwe.txt". Поэтому не исполняемые файлы придётся копировать на винт.
Можно попробовать написать перехватчик запросов чтения определенного имени фала и возвращать данные из ресурсов типа виртуальный файл. Но хочу Вас разочаровать что файл все равно будет кусками писаться на диск в подкачке...
Можно попробовать написать перехватчик запросов чтения определенного имени фала и возвращать данные из ресурсов типа виртуальный файл. Но хочу Вас разочаровать что файл все равно будет кусками писаться на диск в подкачке...
yurza Воин дзена спасибо. expert Воин дзена спасибо. qwe8013 Воин дзена 1) PlaySound() как-то воспроизводит .wav файл; 2) а если как-нибудь присвоить блоку данных строковой ID;