Эмуляция KolibriOS API

Running Kolibri and its programs in other OSes
  • Жду продолжения этой детективной стории :)
    Из хаоса в космос
  • Leency wrote:Жду продолжения этой детективной стории :)
    В качестве продолжения.

    В конце прошлого года я наткнулся на тему "Простой загрузчик ELF для Колибри" и там была ссылка на тему "Эмулятор под Linux", на которую я 10 лет назад не обратил внимание. А поскольку пару лет назад я пересел на Linux, то с интересом посмотрел на изыскания diamond-а и Ghost-а. Посмотрев на примеры и добившись их работы на 64-битной Ubuntu, мне показалось, что сделать эмулятор будет несложно. На деле же я столкнулся с массой проблем, так что разработка эмулятора растянулась на несколько месяцев (свободного от работы времени).

    На данный момент большинство программ с образа флоппи-диска уже запускается и работает, однако есть достаточное количество багов, поэтому я пока не решился выкладывать свои наработки. Но я обещаю, что в скором времени выложу свой проект на GitHub.
  • Сейчас приложения действительно грузятся по нулевому смещению, вот в Borland debugger
    Spoiler:
    KexInBORdbg.PNG
    KexInBORdbg.PNG (68.29 KiB)
    Viewed 16586 times
    а вот в Olly debugger
    Spoiler:
    KexInOllydbg.PNG
    KexInOllydbg.PNG (54.43 KiB)
    Viewed 16586 times
    При включенном DEBUG_OUTPUT(раскомментированном {$DEFINE DEBUG_OUTPUT}) в исходнике, происходит отладочный вывод в консоль: это значения регистров на момент вызова, а также названия вызываемых функций и переданные параметры, это преобразуется в такой вид, как если бы была вызвана соответствующая функция из KolibriOS.lib(её можно найти в теме Delphi7 examples http://board.kolibrios.org/viewtopic.php?f=33&t=3469):
    Spoiler:
    test_console.PNG
    test_console.PNG (41.02 KiB)
    Viewed 16586 times
    Внутри сами эти функции имеют такой же интерфейс, например вот вызов DrawRectangle, параметры извлекаются из регистров:

    Code: Select all

    13: DrawRectangle(Ebx Shr 16, Ecx Shr 16, Ebx And $0000FFFF, Ecx And $0000FFFF, Edx);
    Вот так выглядят вызовы программы Pipet(http://board.kolibrios.org/viewtopic.ph ... 926#p68926):
    Spoiler:
    pipet_console.PNG
    pipet_console.PNG (47.56 KiB)
    Viewed 16586 times
    После того, как вызов функции KolibriOS отработал, нужно увеличить адрес на длину соответствующей инструкции:

    Code: Select all

    Inc(Eip, SizeOf(Word($40CD)));
    Так как я с загрузкой скинов ещё не работал, то в данный момент они не поддерживаются, я знаю, что скины могут быть сжаты kpack-ом, но распаковка таких файлов уже поддерживается для самих приложений, можно будет сделать это и для скинов.

    Сейчас программа при запуске грузит файл, переданный в качестве параметра командной строки(например, можно перетащить мышкой значок kex на значок эмулятора)

    Code: Select all

      If ParamCount > 0 Then
        FileName := PChar(ParamStr(1))
    Также можно загрузить файл, выбранный из OpenDialog(на самом деле приложение перезапускается, в качестве параметра командной строки передаётся путь из OpenDialog(а всё из-за того, что OpenDialog не завершает свои потоки и не освобождает ресурсы)):

    Code: Select all

    If CommDlg.GetOpenFileName(OpenFile) Then
  • Для теста сейчас я взял пример SetPixel из темы Delphi7 examples http://board.kolibrios.org/viewtopic.php?f=33&t=3469

    Сейчас скины не поддерживаются, также не учитываются клиентские координаты окна,
    но таскать окно за заголовок можно, можно использовать двойной щелчок по заголовку,
    ещё можно изменять размеры окна с помощью мыши(хотя это и не очевидно в отсутствие скинов).

    Вот для сравнения с KlbrInWin
    Spoiler:
    KEm_KIW(SetPixel).PNG
    KEm_KIW(SetPixel).PNG (10.76 KiB)
    Viewed 16523 times
    Было бы интересно узнать, как это работает на разных версиях Windows(и работает ли вообще).

    Некоторые демо программы работают(bcdclk, cslide);
    Spoiler:
    bcdclk+setpixel+cslide.PNG
    bcdclk+setpixel+cslide.PNG (18 KiB)
    Viewed 16523 times
    Вот magnify и iconedit:
    Spoiler:
    magnify+iconedit.PNG
    magnify+iconedit.PNG (33.45 KiB)
    Viewed 16523 times
    В подавляющем большинстве приложения KolibriOS имеют сигнатуру MENUET01, но некоторые старые — MENUET00, некоторые новые — MENUET02, так вот, на текущий момент они не поддерживаются.

    В папке Tests есть некоторые примеры, их исходники или на svn, или на форуме(SetPixel http://board.kolibrios.org/viewtopic.ph ... 469#p68384, GetScreenImage http://board.kolibrios.org/viewtopic.ph ... 469#p69039), поэтому не стал их туда включать.
    KEm.7z (35.4 KiB)
    Downloaded 447 times
  • 0CodErr wrote:Было бы интересно узнать, как это работает на разных версиях Windows(и работает ли вообще).
    В XP работает. Попробовал запустить Tetris. Запустился, но управления от клавиш нет.
    В Win8.1 при попытке загрузить программу в консоле пишет "Read File error"

    P.S. В принципе - работает. :)
  • Kopa, я писал в первом сообщении про EMET.
    Не в курсе просто, как оно там в Win8.1 устроено, может на уровне системы заблокировано, а может быть можно в настройках регулировать.
    "Read File error" — значит, что не загружен файл куда надо(по смещению 0).
  • Проверил ещё в ReactOS,тоже принципиально работает.

    P.S. Какие то файлы не проходят верификацию загрузки.
  • Kopa wrote:Какие то файлы не проходят верификацию загрузки.
    0CodErr wrote:В подавляющем большинстве приложения KolibriOS имеют сигнатуру MENUET01, но некоторые старые — MENUET00, некоторые новые — MENUET02, так вот, на текущий момент они не поддерживаются.
  • Из игрушек запустилась и играбельна marblematch.
    Pong3 запустилась, но без управления.

    P.S. Чаще всего происходит крэш программы, как с возможностью сохранить дамп так и без каких либо сообщений.
  • Kopa wrote:Из игрушек запустилась и играбельна marblematch.
    Эта игра почему-то создаёт окно с заголовком Heliothryx :?:

    Code: Select all

    EIP    = $0000007B; EAX    = $00000000; EBX    = $00640209; ECX    = $00640213
    EDX    = $74DDDDFF; ESI    = $34DDDDFF; EDI    = $00005C18; EBP    = $0412FE60
    ESP    = $0412FE10; EFLAGS = $00010202
    DrawWindow(Left:100, Top:100, Width:521, Height:531, Caption:"Heliothryx", BackC
    olor:$ddddff, Style:$74000000, CapStyle:$34ddddff)
    Наверное, они просто друг у друга код скопировали :lol:
    Kopa wrote:Pong3 запустилась, но без управления.
    Ввод с клавиатуры сейчас не поддерживается(вообще, думаю, по исходнику это заметно).
    Kopa wrote:Чаще всего происходит крэш программы
    Многие приложения используют библиотеки(соответственно, пытаются вызвать функции из них), их загрузка сейчас не поддерживается.
    Некоторые приложения пишут\читают изображения "directly to\from LFB" — это тоже не поддерживается.

    Сделал DLL-версию.
    "Загрузчик", резервирующий 64 мегабайта памяти(константа MEM_SIZE в исходнике), загружается по адресу 64K.
    С помощью VirtualProtect устанавливаются атрибуты PAGE_EXECUTE_READWRITE. После чего управление передаётся в Main, которая находится в DLL.
    В дальнейшем "загрузчик" можно затереть кодом или данными загруженного KolibriOS приложения.

    Теперь поддерживаемых приложений стало чуть больше, например, работает FREE3D04(Fisheye Raycasting Engine Etc. by Dieter Marfurt).
    Загружается стартовый экран игры INVADERS, если бы системная функция SysFn2:GetKey поддерживалась, то можно было бы и поиграть :)
    Работают демки 3DWAV, TRANTEST, TUBE.
    KEm.7z (57.04 KiB)
    Downloaded 411 times
  • Здесь какое то видео.
    Using EMET to Disable EMET

    P.S. Да, поддерживаемых приложений стало гораздо больше. :)
    Можно начать перечислять.
    Под ReactOS эти тесты не заработaли. Выводит ошибку доступа к памяти Write only.
    Можно, наверное, разработчмикам ReаctOS сделать баг-репорт. :)
    Где то на Read память ругается.
    Last edited by Kopa on Sun Mar 11, 2018 3:13 pm, edited 7 times in total.
  • Из-за чего с windows 7 и выше не запускается? Это возможно из-за защиты windows?
    Технологии меняют мир, а я - меняю технологии.
  • JFYI: KlbrInWin x64, не тестировал.
    http://kolibriosandfasm.mybb.ru/viewtopic.php?id=11
    Из хаоса в космос
  • Leency wrote:KlbrInWin x64
    В каком месте там x64? Обычный же :)
    ALEXS1983 wrote:Проверка работоспособности и настройки KlbrInWin и использование проводились в Windows XP.
    Есть такой эмулятор Cxbx.
    Cxbx is an emulator for the Xbox video game console that allows users to enjoy Xbox games from their home PCs.
    Там использовалось SetLDTEntries(то же, что использовал diamond).
    Но там решалась задача с регистром FS.
    Потом на 64 bit возникли проблемы с этой функцией(она там просто как заглушка, ничего не делает). У KlbrInWin тоже проблемы с x64.
    Трудно сказать, как именно они их решили. Вот тут http://qpdownload.com/cxbx/ написано, что, под все Windows.
    Раньше был такой файлик https://github.com/ILOVEPIE/Cxbx-Reload ... 4).cpp#L51
    Кому интересно, вот тут функция EmuAllocateLDT https://github.com/ILOVEPIE/Cxbx-Reload ... DT.cpp#L84
    Сейчас вот поновее(форк вроде) https://github.com/Cxbx-Reloaded/Cxbx-R ... c/CxbxKrnl
    :) Там в шапке каждого файла: Dear PVS-Studio, please check it :)
  • Who is online

    Users browsing this forum: No registered users and 0 guests