Здравствуйте, maks1180, Вы писали:
M>Нужно создать динамически ресурс (диалог), и передать его функции DialogBoxParam. Ресурс не должен быть записан в exe. M>Как можно это реализовать ?
Здравствуйте, FR, Вы писали:
FR>DialogBoxIndirectParam не поможет?
Она поможет.
Но тут основная сложность в формировании шаблона диалога в памяти для передачи этой функции.
Надо правильно посчитать размер буфера, который содержит заголовок ресурса (DLGTEMPLATE или DLGTEMPLATEEX),
меню, класс, текст заголовка, шрифт (при DS_SETFONT) и далее — контролы.
Муторно, но все описано в MSDN.
С контролами также: заголовок (DLGITEMTEMPLATE), класс, текст и данные, зависящие от типа.
Когда посчитали размер, то выделяем буфер и складываем в него все данные.
После вызываем DialogBoxIndirectParam.
Можно объединить расчет размера и заполнение буфера в одной функции.
Если передан нулевой указатель на буфер, то только считаем размер, иначе пишем данные в буфер.
В моём случаи нет, так как для этого код нужно менять. Я хочу взять exe запаковать его в новый exe, при запуске которого распокавать старый exe в память и запустить его в текущем процессе.
Поэтому код не получиться поменять в exe.
Здравствуйте, maks1180, Вы писали:
FR>>DialogBoxIndirectParam не поможет?
M>В моём случаи нет, так как для этого код нужно менять. Я хочу взять exe запаковать его в новый exe, при запуске которого распокавать старый exe в память и запустить его в текущем процессе. M>Поэтому код не получиться поменять в exe.
Это другой случай, понятно.
В исходном вопросе не стояло таких ограничений.
Самый простой путь кмк — это поставить хук на функцию DialogBoxParam.
Для этого надо подменить адрес в таблице импорта модуля exe из user32.dll вызовом WriteProcessMemory.
В своей функции DialogBoxParamHook смотреть на параметр lpTemplateName и вызывать, когда это тот диалог, который хотим заменить,
создавать шаблон в памяти и вызывать DialogBoxIndirectParam (вместо родной DialogBoxParam).
Q>Это другой случай, понятно. Q>В исходном вопросе не стояло таких ограничений.
Q>Самый простой путь кмк — это поставить хук на функцию DialogBoxParam. Q>Для этого надо подменить адрес в таблице импорта модуля exe из user32.dll вызовом WriteProcessMemory.
Q>В своей функции DialogBoxParamHook смотреть на параметр lpTemplateName и вызывать, когда это тот диалог, который хотим заменить, Q>создавать шаблон в памяти и вызывать DialogBoxIndirectParam (вместо родной DialogBoxParam).
Это сложный путь. Есть опен сорт утилита UPX, она как то сжимает exe с ресурсами.
Причём далает она по другому так как в исходниках её я не нашёл DialogBoxParam, WriteProcessMemory, DialogBoxIndirectParam.
Как она это делает ?
Здравствуйте, maks1180, Вы писали:
M>Это сложный путь. Есть опен сорт утилита UPX, она как то сжимает exe с ресурсами. M>Причём далает она по другому так как в исходниках её я не нашёл DialogBoxParam, WriteProcessMemory, DialogBoxIndirectParam. M>Как она это делает ?
Если exe можно курочить, то есть стандартный путь:
BeginUpdateResource — UpdateResource — EndUpdateResource.
Здравствуйте, maks1180, Вы писали:
M>Нужно создать динамически ресурс (диалог), и передать его функции DialogBoxParam. Ресурс не должен быть записан в exe. M>Как можно это реализовать ?
Внешняя .dll с ресурсами и динамической перезагрузкой?
Здравствуйте, maks1180, Вы писали:
M>Это сложный путь. Есть опен сорт утилита UPX, она как то сжимает exe с ресурсами. M>Причём далает она по другому так как в исходниках её я не нашёл DialogBoxParam, WriteProcessMemory, DialogBoxIndirectParam. M>Как она это делает ?
В подобных упаковщиках все просто, exe сжимается целиком, и добавляется как ресурс
или просто к концу специального загрузчика. Этот загрузчик загружает сжатый файл
разжимает его полностью в памяти и запускает.
FR>В подобных упаковщиках все просто, exe сжимается целиком, и добавляется как ресурс FR>или просто к концу специального загрузчика. Этот загрузчик загружает сжатый файл FR>разжимает его полностью в памяти и запускает.
Здравствуйте, maks1180, Вы писали:
M>Как он ресурсы создаёт в памяти ?
Никак, он тупо восстанавливает, то есть разжимает образ exe в памяти, и потом используя
свой PE Loader запускает его. Упрощенное описание всего процесса есть например здесь.