PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » PurePortable - портабелизация программ


PurePortable - портабелизация программ

Сообщений 1 страница 22 из 22

1

Проект PurePortable был создан для разработки средств для портабелизации программ с использованием прокси-dll.

Портирование программ осуществляется в основном через перехват вызовов WinApi - перехват обращений к реестру позволяет сохранять настройки не в реестре, а в файле рядом с программой, перехват вызовов для определения системных папок позволяет переместить AppData в папку программы и т.п.

Прокси dll, это dll перехватывающая вызовы WinApi от программы и либо изменяющая их поведение либо перенаправляющая вызовы в оригинальную dll без изменения.

Dll различаются способом внедрения:

1. Подмена системной dll в папке с программой. Для использования данного метода необходимо, чтобы программа имела в таблице импорта (прямого, не отложенного!) вызовы данной dll, либо такие вызовы имели другие dll, вызовы которых импортирует программа и находящиеся в одной папке с программой.
Типичный пример это version.dll. Сама version.dll не имеет экспортируемых функций интересных с точки зрения портабелизации, но из неё отлично устанавливаются хуки. Простой пример такой портабелизации - InnoSetup (выкладывал на ru-board).
Другой пример это winmm.dll, а пример портабелизации сам PureBasic. Да, Пурик имеет ключ /portable, но этот ключ надо ещё и не забыть указать, а случайно забыв Пурик тут же ассоциирует себя с файлами pb ломая нужные ассоциации. Кроме того, Пурик в своих prefs хранит абсолютные пути, что мало вяжется с "портабельностью". Dll решает эти проблемы корректирую пути к Tools в tools.prefs, к компиляторам в PureBasic.prefs, по возможности к файлам RecentFiles и некоторые другие пути. Dll я выкладывал на ru-board и в телеграмме.
А ещё winmm используется фреймворком QT. Даже если сама программа не имеет ничего полезного из импорта, если она использует QT то обычно легко портируется.
Таки способом нельзя подменить dll из списка KnownDLLs и в некоторых других случаях.

2. Подмена системной dll путём замены имени dll непосредственно в коде программы (речь о замене не в исходном коде, а непосредственно в exe, например, каким-нибудь hex-редактором).
Пример - портабелизация утилит SysInternals. Там подменяется comdlg32.dll. Выкладывал на ru-board.
Метод не обязательно применять только для dll из списка KnownDLLs, подходит для любых dll. Например, через прокси winmm, переименовании dll и соответствующем изменении имён в exe-файлах, в одной папке на флешке уживаются HWiNFO32 и HWiNFO64 (разной разрядности).
Метод не работает на сжатых файлах (потребуется разжатие), накрытых протектором, проверяющих свою целостность и т.п.
Кроме того, здесь мы становимся на скользкий путь возможного нарушения "авторских прав" и прочей копирайтной хреномудрии. Так что может не всем подойти по "религиозным" мотивам.

3. Добавление своей dll в импорт. Правкой таблицы импорта непосредственно в exe-файле или в одной из используемых им dll можно добавить dll в список. Программа такую dll загрузит, хотя ничего в ней на прямую не использует.
Метод так же, как и предыдущий, не работает на сжатых файлах, накрытых протектором, проверяющих свою целостность и т.п.
Здесь мы так же вмешиваемся непосредственно в код и возможны "копирайтные" ограничения.
Свой алгоритм правки пока не реализован, для внедрения используется утилита setdll из Microsoft (sic!) Detours.

4. Использование внешнего запускателя - создаётся "замороженный" процесс, внедряется dll и процесс размораживается. К сожалению, у меня пока нет рабочих примеров данного метода.
Как пример есть утилита withdll из того же Detours.

В dll используются следующие способы перехвата:

1. Сплайсинг на базе библиотеки MinHook.
2. Перехват IAT.
3. Прямая подмена вызовов. Это вроде даже и не метод, но для полноты должен быть упомянут - при подмене, например, advapi32.dll (метод 2 - правка кода) хуки могут быть вообще не нужны, так как программа напрямую вызывает функции из "подменной" dll.

Ссылки:
Смежная тема тема на ru-board
Википедия - перехват

Правовые моменты.
Сам по себе перехват не является чем-то незаконным и даже используется в самой ОС Windows, например, для обеспечения совместимости приложений с ОС, а слайсинг предусмотрен практически "из коробки".
Тем не менее, в некоторых случаях, например при правке кода для внедрения dll может быт что-нибудь нарушено. Обсуждение в таких "тонких" случаях лучше перенести на ru-board.

Отредактировано Smitis (26.08.2023 20:11:02)

0

2

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

0

3

Продублирую здесь

useful

useful написал(а):

Для диалога, если обходной путь всё таки нужен, важно не абстрактное "массивы PureBasic", а описание задачи:

какие данные, в каком объёме, кем создаваемые и насколько часто модифицируемые, с какой целью требуется совместно использовать какому количеству процессов, кем и с какой интенсивностью порождаемых.

Сложный вопрос. Программы то разные. Одни много пишут в реестр, другие почти ничего.

В настоящий момент настройки из реестра хранятся в текстовом файле с определённой структурой записей (правда, встречаются специальные служебные символы и некоторые очень "умные" текстовые редакторы испытывают когнитивный диссонанс).
При старте программы файл читается и в памяти создаются два динамических массива (точнее, массивы обычные, размер меняется через Redim.) - один для хранения путей из реестра, к которым обращается программа и на основе которого потом формируются виртуальные хендлы для функций работы с реестром. Второй массив - непосредственно хранимые в реестре данные.
При завершении программы всё пишется обратно.
Отлично работает для одного процесса. Собственно, попадалась только одна программа (сейчас, к сожалению, сходу не скажу какая), которая создавала ОЧЕНЬ много разделов в реестре (десятки тысяч) и всё это начинало тормозить.

Если же процессов несколько, возникает проблема.
Откуда берётся несколько процессов - некоторые программы запускают сами себя. Зачем, не знаю. Видимо так надо. Например последняя 10-я версия TheBat!.
Некоторые имеют в своём составе несколько исполняемых файлов - целый пакет программ, использующих одни и те разделы в реестре для данных.

Один из вариантов, который сейчас рассматриваю, это использование RegLoadAppKey - там перехватываются запросы к реестру, но данные будут не в памяти (а потом в файле), а в отдельном улье реестра. Но там какая то беда с доступом. Из под админа всё работает, а из под пользователя нет прав. Хотя вроде как права как раз не нужны, это не RegLoadKey. Либо я что-то недопонимаю. Инфы, увы, очень мало.

Другой вариант - приспособить под это дело другую базу данных.

И, наконец, самый трудоёмкий вариант - самому что-то придумать, шарить память, мапить файлы и пр., свою структуру, совместный доступ, транзакции...

Отредактировано Smitis (26.08.2023 15:58:56)

0

4

Т.е. речь идёт о чужих программах.
Как это связано с совместным использованием данных несколькими процессами?
Я естественно предполагал что мы точно заем кто создаёт и какие данные, а также кому их нужно предоставить потому, что всё это сами разрабатываем.

p.s. главный вопрос: цель какая? Кто с кем, что должен  делить?

Отредактировано useful (26.08.2023 16:05:05)

0

5

useful

useful написал(а):

Как это связано с совместным использованием данных несколькими процессами?

Один процесс записал данные в реестр. Например, банальное, какие-нибудь сделанные пользователем настройки. Затем им был запущен другой процесс (другой exe), который эти данные прочитал.
Типичный пример - WinCatalog. Запускает вспомогательные программы. Те тоже лезут в реестр, за теми же самыми данными, которые WinCatalog вот только что сам поменял. Там ещё и dotnet в этих вспомогательных прогах, к дотнету я ещё не подступился, так что с портабелизацией WinCatalog у меня облом (надеюсь, пока). Но я пытаюсь на его примере описать проблему.

Я уже подумываю, в основном процессе открыть, например, канал и через него фигачить данные.

И да, ещё раз подтверждаю, все процессы чужие. Что они там вытворяют с данными непонятно.

Как вариант ещё рассматривал такой, если другой процесс фоновый, что-то там обработал и завершил работу, а данные ему нужны просто для информации, например, как у WinCatalog чисто путь к каталогу (это не точно, просто предположение), то перехватывать CreateProcess, в этот момент скидывать данные на диск, запущенный процесс подцепит прокси-dll, заново прочитает данные и нормально отработает. Это если он в данных ничего существенного не меняет. Если основной процесс ждёт завершения вспомогательного, тут даже может быть проще, вспомогательный сохраняет, основной потом перечитывает.
В каждом конкретном случае надо разбираться отдельно поэтому хочется простого универсального решения. Ну как с реестром - одна прога пишет, другая это читает и меняет или не меняет и обратно не пишет, не важно, главное что всё имитирует реестр и работает ассинхронно, бесконфликтно, заботу берёт на себя это стороннее решение (пусть даже тот самый sqlite).

Ещё пример, Nitro PDF. Кроме основного exe куча мелких. Подозреваю, по больше части их можно вообще выкинуть, например, прожки, судя по всему просто отправляющие разработчику информацию о сбоях, а другие просто получают команды из командной строки, но фиг его знает. Разбираться муторно.

Ешё пример из таких "многоэкзешных" - Acrobat Reader.

Отредактировано Smitis (26.08.2023 17:34:45)

0

6

Smitis написал(а):

В каждом конкретном случае надо разбираться отдельно поэтому хочется простого универсального решения. Ну как с реестром - одна прога пишет, другая это читает и меняет или не меняет и обратно не пишет, не важно, главное что всё имитирует реестр и работает асинхронно, бесконфликтно, заботу берёт на себя это стороннее решение

Реестр это по сути СУБД

А абсолютно любая многопользовательская СУБД умеет

Smitis написал(а):

... асинхронно, бесконфликтно ...

Я всё равно не понимаю ЦЕЛЬ. Подменить для чужих программ обращения к реестру?

Это совсем не может быть связано с началом обсуждения

Smitis написал(а):

Но расшарить массивы PureBasic между несколькими процессами не получается. Вот и ищу обходной путь.

Для меня это просто ещё одно подтверждение, что проблемы ответов на форумах в самих вопросах.

Останусь ка я "капитаном очевидность"

Отредактировано useful (26.08.2023 18:32:16)

0

7

Если речь о том, что фактически одновременно один и тот же код вызывается разными процессами, то тут нужно внимательно смотреть в сторону реентерабельности.
Т.е. код должен понимать, что все данные с которыми он работает рождаются при вызове и перестают существовать при выходе.
В самом коде никаких констант и переменных. Должна быть область памяти указатель(привязанный например к ID процесса) на которую оживает при обращении, через этот указатель на память накладывается структура и вся работа с переменными только в ней.
Сейчас это конечно автоматом пытаются обеспечить параметром threadsafe, но я ещё с времён когда машины были большие а памяти у них мало, для многопользовательской работы стараюсь в ручную это обеспечивать.

0

8

useful написал(а):

Я всё равно не понимаю ЦЕЛЬ. Подменить для чужих программ обращения к реестру?

Да. Цель - в заголовке темы - портабелизация программ.
Один из аспектов портабелизации - перехват обращение к реестру и сохранение данных, которые программа хранит в реестре, в папке программы, в том или ином виде.

useful написал(а):

Реестр это по сути СУБД
А абсолютно любая многопользовательская СУБД умеет

Вот. Имитация реестра через СУБД как вариант. Пока не знаю, как приспособить. Надо разбираться. Надеюсь, штатная в PureBasic sqlite подойдёт.
И мне кажется, тут главное скорость работы, чтобы не было задержек. Собствено, sql тут и не нужен. Тут даже дерева не нужно, хватило бы табличной СУБД.
Отсюда и был вопрос после упоминания minim.

Это совсем не может быть связано с началом обсуждения

В другой теме обсуждались массивы. У меня сейчас "СУБД" это два массива в памяти. Размеры массивов динамически меняются - нельзя заранее узнать, сколько данных решит хранить программа.
Для многих случаев это достаточно. Но не всегда.

Отредактировано Smitis (26.08.2023 19:31:18)

0

9

Исходный код 4.08.02 https://disk.yandex.ru/d/rVH3x1dJw_rZHA

Структура папок:

.lib - основная библиотека, в том числе и MinHook и основной включаемый файл PurePortable.pbi
Здесь же шаблон _PurePortableTemplate.pb для создания новых прокси-dll.
С точки я начинаю имена папок с библиотечными файлами. Здесь такая папка одна, это последняя версия, в реальности к меня папок больше - старые версии, промежуточные экспериментальные...

_All - Здесь готовые PB-файлы для компиляции прокси-dll для некоторых уже портированных программ. Не всех, многие программы не интересны широкой общественности и не выкладываются.
_Games - Здесь для некоторых игрушек.
С символа подчёркивания я начинаю общие папки где лежат исходники по принципу один файл - одна программа или группа сходных программ одной фирмы.

Некоторым программам отведено по целой папке, здесь таких всего две (FAR и PureBasic), в каждой по одному исходнику, достаточному для компиляции dll (всё ненужное исключил).

Исходники рассчитаны на использование PureBasic Pre/Post Processor (PurePProcessor) поэтому там в начале каждого файла есть для него директивы. Некоторые dll без него
не сделать работоспособными, например, msimg32.dll из-за конфликта имён с PureBasic (функция AlphaBlend), но для компиляции большинства можно обойтись и без.

Большинство моментов стандартизировано и не требует особых изменений. Берётся шаблон _PurePortableTemplate.pb и правится под конкретную программу. Полного описания, естественно, нет. Руки не доходят :(
Но на вопросы готов ответить.

Отредактировано Smitis (26.08.2023 20:46:46)

0

10

В догонку
Версия 4.08.03 https://disk.yandex.ru/d/dG0sQWhvo8UXuA
Пара важных исправлений:
- Возвращены функции iif и iifs
- Исправлена константа в модуле EnvironmentVariables
Ошибки чисто синтаксические (компилятор будет ругаться).
Ну и изменения, которые успели появиться:
- Убраны макросы-заглушки InitRegistryHooks, InitCBTHook и прочие подобные.
- Имена некоторых констант изменены, приведены "к общему знаменателю".
  #DBGX_FILEOPERATIONS -> #DBGX_FILE_OPERATIONS
  #DBGX_LOADLIBRARY -> #DBGX_LOAD_LIBRARY
- Добавлена трассировка для функций WinApi, работающими с ini. Включается через константу #DBGX_PROFILE_STRINGS
- Исправления в модуле Исправления в DBGX_FileOperations. Добавлены функции CreateFile.
- В модуле MinHook кое-где убрана ненужная условная компиляция.
- Добавлена глобальная переменная WinDir.
- Инициализация CfgFile перенесена в модуль Registry.
- Доделан модуль ProfileStrings (но ещё не протестирован).

0

11

А на какой версии пурика исходники?скачал а 5.31 ругается на код.

0

12

Sergeihik написал(а):

А на какой версии пурика исходники?скачал а 5.31 ругается на ко

5.72 и выше. Ниже не проверял.

0

13

Sergeihik написал(а):

А на какой версии пурика исходники?скачал а 5.31 ругается на код.

А ещё лайфхак - если открыть исходник PB простым текстовым редактором, в конце будет текст из которого, кроме всего прочего, можно узнать, в какой версии среды PureBasic производились последние изменения.

0

14

Обновление, 4.08.04
https://disk.yandex.ru/d/nxUmL9gg_xYPCw
Изменения:
* Переименованы библиотеки MinHook.
! Исправлены макросы в модуле Debug.
! Исправления и доработки модуля ProfileStrings.
! Исправлен SplitArray.
+ Добавлены прокси для msi.dll, ktmw32.dll.
* Константа #CONFIG_FILENAME2 заменена на #CONFIG_PERMANENT.
* ReadCfg - проверка и чтение второго файла конфигурации независимо от #CONFIG_PERMANENT.
+ Ещё один вариант с файлом конфигурации, если задана константа #CONFIG_INITIAL и нет основного файла, конфиг будет инициализирован из этого файла.
* Разделитель полей (CONFIG_SEPARATOR) по умолчанию теперь символ $E800.
- #CFG_SPEC_CHARS больше не используется. После отказа от компиляции в режиме ASCII и с момента, когда управляющие символы стали хранится как символы из «Области для специального использования», управление режимом хранения специальных символов потеряло особый смысл.
- #CFG_TRIM_NUL больше не используется - оказался не нужен, а баги программ можно решить другим способом.
* Переменная CfgFile переименована в ConfigFile, переменная CfgFile2 в PermanentFile.
+ Добавлены макросы DeclareExportFunc32, DeclareExportFunc64.
+ Добавлены макросы DeclareExportFuncIndirect32, DeclareExportFuncIndirect64.
* Переделка части функций на WinApi (CharLower, StrTrim).
* Убрана часть условной компиляции для дополнительных процедур.
+ Добавлена процедура GetFileBitness.
+ Добавлена процедура CorrectCheckSumAdr для замены CorrectCheckSum.
+ Добавлен макрос Макрос MH_HookExeEntry для установки хука на entry point исполняемого файла.
! Исправлен SplitArray.
+ AddArrayS возвращает размер массива.
* Изменена логика проверки валидности программы.

Расшифровка: ! исправление; * изменения; + добавлено; - удалено.

Минимальная версия PureBasic на которой проверялось - 5.62.
Всё компилируется только с Backend FASM.

0

15

На ру-боард выложил портабельные PureBasic + PurePortable с простым примером портабелизации программы.
https://forum.ru-board.com/topic.cgi?fo … tart=380#5

0

16

Smitis - спасибо, будем изучать!
п.с. там IceDesign стремительно обновляется и демок-триалов не предоставляют. В наше время 20$ не деньги, но как-то непривычно покупать проги, не особенно и нужен этот IceDesign и для большего удовлетворения хочется немного затрофеить и портабелизировать) Непонятно, что у него с лицензией - новые обновления бесплатно или каждый раз по 20$ готовить.  Может, скинемся втроём-четвером ради небольшого подарка к НГ?

0

17

bizdon написал(а):

Может, скинемся втроём-четвером ради небольшого подарка к НГ?

В принципе, с получки можно.

0

18

PurePortable 4.09.00/4.08.06
https://disk.yandex.ru/d/vmg3dhQBLA6ycw
Есть некоторая неуверенность, стоит ли новой версии менять номер с 4.08 на 4.09. По сути, это та же 4.08.06...

Changelog:
(! исправлено; * изменено; + добавлено; - удалено)
! Кажется, удалось найти и исправить причину неправильного поиска конфликтных экспортируемых функций (типа CreateThread). Для этого был изменён алгоритм обработки экспорта в PurePProcessor и добавлен макрос DeclareProxyConflictFunc. Изменены прокси msimg32, user32, kernel32. К сожалению, PurePProcessor выкидывает ошибку при удалении мусора директивой PP_CLEAN для этих прокси, почему-то файл остаётся заблокированным после MapViewOfFile. Естественно, UnmapViewOfFile и закрытие дескрипторов выполняется, даже FlushViewOfFile добавлен, но файл остаётся заблокированным до закрытия программы. Придётся переделывать.
* В связи с тем, что список прокси-dll сильно разросся, упрощён выбор включаемого файла. Теперь константа #PROXY_DLL это просто имя файла без расширения в папке .lib\proxy (у самого файла расширение должно быть .pbi). От регистра символов теперь не зависит.
+ #PROXY_DLL_TEST для тестирования прокси-dll. Алтернатива #PROXY_DLL, файлы берутся из папки .lib\proxytest.
* Константа #PROXY_EXPORT изменена на #PROXY_DLL_ADDITIONAL.
* Переменная CfgChanged изменена на ConfigChanged.
! Исправлен макрос DeclareProxyFuncDelay.
+ Прокси uxtheme
* Немного изменений в трассировке/логировании Registry
- Удалена функция SHRegGetBoolUSValue. Все подобные, практически не используемые функции, будут вынесены в отдельный файл.
* Возвращены константы #PROC_CORRECTCHECKSUM и #PROC_REMOVECERTIFICATES
! Исправлена RegDeleteKeyValue
* Изменены имена параметров функций для работы с реестров (для удобства)
+ Добавлена проверка на ненулевой *lpData в SetDataA/W.
* В DetachProcess добавлен вызов MH_Uninitialize()

Для 4.09.00
+ Увеличено количество байт возвращаемых при запросе программой размера данных. Вроде, так должно быть лучше и больше походить на стандартное поведение системных функций в некоторых случаях. Хуже точно не будет. Если себя оправдает, останется и переедет в 4.08, если нет, может быть удалено.
+ Для #PORTABLE_REGISTRY добавлена обработка константы $101. В этом случае вместо текстового pport-файла для реестра будет использован подключаемый функцией RegLoadAppKey куст реестра. Функция доступна начиная с Windows Vista. Эта новая фича никак не влияет на предыдущий функционал, но либо pport, либо это. Фича экспериментальная, возможны ошибки. К сожалению, там какие-то проблемы с доступом, из-под админа работает, из-под пользователя нет, хотя, по идеи, никаких ограничений в описании функции нет. Надо разбираться.

Также обновил PurePortableTraining https://disk.yandex.ru/d/GHho3UEzMqlgSQ
Новая версия библиотеки, новый PurePProcessor.

0

19

PurePortable 4.09.02
https://disk.yandex.ru/d/Py81kkR9FsMfKw
Предыдущее обновление буду считать 4.09.01 чтобы не было путаницы

Изменения (! исправлено; * изменено; + добавлено; - удалено):
(-) Удалена функция GetBitness.
(-) Удалены макросы-заглушки GlobalInitialization и InitAllExportFuncs.
(*) Два режима #DBGX_EXECUTE
(+) Макросы для работы с Cfg по индексу (недоделано)
(*) Некоторые изменения в обработке CBT-хуков
(+) прокси glu32, netapi32
(+) Константа #PROXY_DLL_COMPATIBILITY для обеспечения совместимости с разными версиями Windows.
Пока предполагается три числовых значения 5 (для XP), 7 (по умолчанию) и 10.
Пока сделано:
- Отключение перехвата функций, отсутствующих в XP (Registry, Special Folders).
- Пока единственная прокси-dll, учитывающая это - winspool.
- Под это дело переработан макрос DeclareProxyFuncExt.
А вообще, надо доделать отложенную инициализацию прокси функций, так даже проще будет.
(!) Исправления в модуле Registry2
(*) Сломано поведение константы #PORTABLE_REGISTRY (значения).
Для #PORTABLE_REGISTRY=1 всё остаётся по прежнему.
#PORTABLE_REGISTRY=2 - для использования модуля Registry2, как и было задумано изначально.
Для перехвата kernelbase будет использоваться дополнительный флаг $100.
Таких программ у меня всего 1 (одна) штука, у других не знаю (а есть ли?), не думаю, что это серьёзная поломка.

Использования модуля Registry2 получается довольно интересным. Там задействована функция RegLoadAppKey (в будущем предполагается ещё, как вариант, задействовать RegLoadKey). Вместо текстового файла и виртуального реестра в памяти, подключается куст реестра, куда и перенаправляются вызовы WinApi. Механизм фильтрации такой же - в процедуре CheckKey принимается решение, перенаправлять вызов или нет.
Преимущества такого подхода:
- Не надо эмулировать реестр, с неизбежными неточностями.
- Для работы с данными программы используются те же функции WinApi, просто они перенаправляются в другой раздел.
- Меньше функций надо перехватывать.
- Не надо беспокоится о сохранении данных при завершении программы.
- Вроде как несколько процессов могут обращаться к кусту одновременно.
Недостатки:
- Какая-то непонятка с правами. Из-под админа при выключенном UAC проблем нет, а вот с включенным UAC или ограниченными правами не работает. Хотя, в отличие от RegLoadKey, для RegLoadAppKey про ограничения ничего не написано. Может я что-то не так делаю?
- В отличие от текстового файла, в куст реестра обычным текстовым редактором не заглянуть.
- Под XP работать не будет.

0

20

PurePortable 4.09.03
https://disk.yandex.ru/d/8MI1KN3j5R6kyQ
Изменения (! исправлено; * изменено; + добавлено; - удалено):
(+) Прокси msvbvm60
(*) Доработки макросов для работы с Cfg по индексу.
(+) Добавлен инклюд PurePortableCustom.pbi (необязательный). В него буду помещать константы для удобства конфигурации PurePortable (т.е. до включения основного файла PurePortable.pbi). Подобный уже был. Вещь, как мне показалась, не совсем удобная, но попробую ещё раз.
(*) Доработки модуля Registry2.
(*) TerminateProcess вместо RaiseError в случае ошибки. В случае контроля ошибок установки хуков, загрузки dll, инициализации прокси-функций выдаётся окно с соответствующим сообщением, далее следовал RaiseError, который приходил в программу и вызывал исключение уже там с выводом сообщения и записью в событиях Windows. А иногда исключение не вызывалось и вообще чёрте что происходило, в зависимости от того, что там в программе навертели с обработкой исключений. Поэтому попробую просто грохать процесс после вывода сообщения. В события ничего не пишется, но думаю, какую-нибудь запись в будущем сделать.

0

21

PurePortable 4.09.04
https://disk.yandex.ru/d/-nra2hfnWzsKIQ
Изменения (! исправлено; * изменено; + добавлено; - удалено):
(!) Для нестроковых данных возвращается правильная длина.
(*) Доработки макросов для работы с Cfg по индексу.
(*) Упрощения в макросах для прокси-функций.
(+) Макрос DeclareExportFuncDetour.
(*) Доработки модуля Registry2.
(*) Переменная PrefsFile изменена на PreferenceFile.
(+) Процедуры FindCfgS и FindCfgD.
(!) Небольшое уточнение в LoadDll.
(-) Удалены макросы DeclareExportFuncIndirect, DeclareExportFuncIndirect32, DeclareExportFuncIndirect64.
(+) Прокси dinput.
(*) Прокси advapi32 - удалены некоторые функции (не работают в Win11).
(+) Использование констант #PORTABLE_REG_SHLWAPI и #PORTABLE_REG_TRANSACTED параллельно с битами в #PORTABLE_REGISTRY.

0

22

Версия 4.10
Работает git https://github.com/PurePortable/PurePortable/ (ну должен работать).
Есть канал в телеграмм. Пока частный, но желающим пригласительная ссылка https://t.me/+GLmXqZQl3uFkNDNi
Чат тоже пока приватный, но для своих https://t.me/+aeujFWwNwXA1YTgy

Основное новшество в версии 4.10 - меня убедили сделать "универсальную dll". Точнее пару dll (dual proxy dll). Одна, как обычно, типа version.dll или winmm.dll подхватывается программой их своей папки. Это "чистая прокси", всё, что она делает, это перенаправляет экспортируемые функции в оригинальную dll в system32 и грузит "движок" портабелизации PurePort.dll. Это "движок" та же самая dll, что и раньше, но использует файл конфигурации PurePort.ini для настроек. Для несложных программ теперь можно просто взять такую пару dll и отредактировать ini не вникая в тонкости программирования.

0


Вы здесь » PureBasic - форум » OpenSource » PurePortable - портабелизация программ