Эмуляция 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 16522 times
    а вот в Olly debugger
    Spoiler:
    KexInOllydbg.PNG
    KexInOllydbg.PNG (54.43 KiB)
    Viewed 16522 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 16522 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 16522 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 16459 times
    Было бы интересно узнать, как это работает на разных версиях Windows(и работает ли вообще).

    Некоторые демо программы работают(bcdclk, cslide);
    Spoiler:
    bcdclk+setpixel+cslide.PNG
    bcdclk+setpixel+cslide.PNG (18 KiB)
    Viewed 16459 times
    Вот magnify и iconedit:
    Spoiler:
    magnify+iconedit.PNG
    magnify+iconedit.PNG (33.45 KiB)
    Viewed 16459 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 446 times
  • 0CodErr wrote:Было бы интересно узнать, как это работает на разных версиях Windows(и работает ли вообще).
    В XP работает. Попробовал запустить Tetris. Запустился, но управления от клавиш нет.
    В Win8.1 при попытке загрузить программу в консоле пишет "Read File error"

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

    P.S. Какие то файлы не проходят верификацию загрузки.