запуск файла из файла ресурсов Win32 приложения

Тема в разделе "WASM.WIN32", создана пользователем alexandersson, 12 апр 2011.

  1. alexandersson

    alexandersson New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2011
    Сообщения:
    3
    . Вечер добрый и спасибо Всем, Кто попытался помочь.
    немного поэксперементировав и поразмыслив попытаюсь сформулировать вопросы более конкретно.
    прошу не судить строго, если буду говорить откровенно глупые вещи — я только начинаю свое путешествие к
    нижним уровням программирования (за спиной только год консольного 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 файл прямо из файла ресурсов);

    Просьба:
    если не сложно, попытайтесь объяснять как совсем деревянному, либо дайте ссылку, где эти вопросы подробно
    описаны (желательно с указанием главы).

    Заранее благодарен всем за ответы.
     
  2. yurza

    yurza New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2008
    Сообщения:
    69
    Windows NT/2000 Native API Reference by Gary Nebbett
    Там помоуму даже пример был
     
  3. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    alexandersson
    выделаяешь память, копируешь хидер, секции, настраиваешь импорт, релоки, ещё peb поправить нужно и прыгаешь на точку входа )
     
  4. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
  5. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    alexandersson
    Ну если это - исполняемый файл, то можно выполнить действия аналогичные действиям CreateProcess с соответствующими изменениями.
    А произвольный файл любого типа - не получится, т.к. все остальные файлы открываются другими программами, в качастве параметра к которым передаётся имя файла.
    Например при открытии файла "C:\qwe.txt" выполняется следующая команда:
    "notepad.exe C:\qwe.txt".
    Поэтому не исполняемые файлы придётся копировать на винт.
     
  6. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Можно попробовать написать перехватчик запросов чтения определенного имени фала и возвращать данные из ресурсов типа виртуальный файл. Но хочу Вас разочаровать что файл все равно будет кусками писаться на диск в подкачке...
     
  7. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Можно попробовать написать перехватчик запросов чтения определенного имени фала и возвращать данные из ресурсов типа виртуальный файл. Но хочу Вас разочаровать что файл все равно будет кусками писаться на диск в подкачке...
     
  8. alexandersson

    alexandersson New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2011
    Сообщения:
    3
    тема еще открыта, еще раз спасибо всем за помощь!
     
  9. alexandersson

    alexandersson New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2011
    Сообщения:
    3
    yurza
    Воин дзена
    спасибо.


    expert
    Воин дзена
    спасибо.

    qwe8013
    Воин дзена
    1) PlaySound() как-то воспроизводит .wav файл;
    2) а если как-нибудь присвоить блоку данных строковой ID;
     
  10. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    alexandersson
    Если PlaySound воспроизводит звук из памяти, то она не использует CreateFile.
    Нет.