PELoad

Your KolibriOS applications go here
  • Unable to load kernel32.dll. :(
  • Unable to load kernel32.dll. :(
    А папка "lib" была в папке с программой?
  • 0CodErr wrote:Вот здесь viewtopic.php?f=2&t=684&p=48971#p48960 я уже спрашивал про "unresolved", непонятно из-за чего это возникает?

    Code: Select all

    COFF SYMBOL TABLE
    000 00000000 SECT1  notype       Static       | '.exprt'
        Section length  1C4, #relocs   2A, #linenums    0, checksum        0
    002 00000000 SECT2  notype       Static       | '.code'
        Section length  3F8, #relocs   18, #linenums    0, checksum        0
    004 00000000 SECT3  notype       Static       | '.data'
        Section length   A0, #relocs    0, #linenums    0, checksum        0
    006 00000000 ABS    notype       Static       | .absolut
    007 000000AC SECT1  notype       Static       | sz_ExitProcess
    008 000000B8 SECT1  notype       Static       | sz_GetStdHandle
    009 000000C5 SECT1  notype       Static       | sz_SetConsoleMode
    ...
    
    Загрузчик COFF в ядре недоделанный. После каждого символа, описывающего секцию, nasm помещает вспомогательный символ, описывающий длину и число перемещаемых элементов в секции. Загрузчик игнорирует тот факт, что они вспомогательные, и смотрит на них как на внешние ссылки - получаются три штуки "имён" \xC4\x01, \xF8\x03, \xA0.
    Сделаем мир лучше!
  • Прошу простить нуба, но я прав, что в kernel32.dll.asm и msvcrt.dll.asm содержится аналог winapi функций?
    Нуб зеленый.
  • Прав.
  • Теперь запускаются ещё эти примеры:
    • masm32\examples\exampl11\fileio\ppfileio.exe
      masm32\examples\exampl11\tokenise\tokenise.exe
    Первый пример создаёт файл "testfile.txt"(а если он существовал, то сперва его удаляет), пишет в этот файл, закрывает, открывает снова, добавляет ещё, потом всё вместе выводит в консоль.
    Второй пример читает свой исходник(который в той же папке), обрабатывает его, затем результат выводит в консоль.
    Spoiler:
    K_console.png
    K_console.png (12.46 KiB)
    Viewed 19195 times
    w_console.png
    w_console.png (12.3 KiB)
    Viewed 19195 times
    Кое-какие примеры из fasmlib тоже работают, но не совсем правильно.
    И вот ведь проблема, библиотека должна как-то узнавать, загружена или нет другая библиотека(например, консоль), инициализирована она или нет. Пока ещё не решил, как это лучше сделать.
    PELoad.7z (10.16 KiB)
    Downloaded 489 times
  • Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
    Проект очень интересный. Хочу обсудить с тобой пару моментов в контакте.
  • Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
    Да, всё правильно, она грузится как обычная для Колибри библиотека с помощью SysFn68.19.

    Я тут немножко ещё "подхимичил":
    Spoiler:Это запуск без параметров:
    tasm32_no_param.png
    tasm32_no_param.png (39.41 KiB)
    Viewed 19173 times
    А тут вот он даже ассемблировать пытался(папка include отсутствовала):
    tasm32_param.png
    tasm32_param.png (27.61 KiB)
    Viewed 19173 times
  • У тебя не поддерживаются относительные пути?
    Все же, заходи ВК, есть мысли.
  • У тебя не поддерживаются относительные пути?
    Поддерживаются. И при запуске exe-программы содержащая её папка становится текущей. Тот файл лежал как раз в папке с tasm32.exe, так что можно было указать просто "keygen.asm". А вот папки "include" не было. И ещё надо было заменить обратные слеши.
  • Попробуй поправить слэши, может, он даже скомпилирует тебе что-нибудь. Это будет огромный успех, между прочим.
  • Как только ЭТО сможет запускать консольные программы, написанные на дельфях, я лично проставлю автору выпивку(или безалкогольного, в эквиваленте). Ибо годно.
    Нуб зеленый.
  • В связи с
    viewtopic.php?f=10&t=370&start=195#p63430
    viewtopic.php?f=33&t=3388#p66177
    viewtopic.php?f=33&t=735&start=15#p49131
    мне тоже стало интересно поизвращаться запустить в KolibriOS через PELoad приложение, использующее KolibriOS API, созданное в Delphi7.

    Пришлось сначала подредактировать PELoad.
    Теперь этот PELoad не обрабатывает импорт, он только грузит PE.
    По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать.

    Если скомпилировать такой проект

    Code: Select all

    Program Project1;
    Procedure Main(); Begin End;
    Begin Main; end.
    то в начале происходит вызов InitExe из SysInit

    Code: Select all

    55                   push   ebp
    8bec                 mov    ebp, esp
    83c4f0               add    esp, -10h
    b870334000           mov    eax, 00403370h
    e828ffffff           call   @InitExe
    e89fffffff           call   Main
    e852faffff           call   @Halt0
    
    Так как разбираться с SysInit мне было лень, то я просто прыгну на вызов Main.
    Если посчитать от точки входа, то до вызова Main 16 байт. Для $APPTYPE CONSOLE немного по-другому, там смещение 24.
    В PELoad это MAGIC_OFFSET

    Code: Select all

    MAGIC_OFFSET                   equ  16 ; Hack For Delphi7 {$APPTYPE GUI}
    ; MAGIC_OFFSET                   equ  24 ; Hack For Delphi7 {$APPTYPE CONSOLE}
    и потом ниже вот так он используется

    Code: Select all

    ; Go To EntryPoint
            mov    eax, [EntryPoint]
            add    eax, IMAGE_BASE + MAGIC_OFFSET
            jmp    eax
    Чтобы это смещение не приходилось пересчитывать каждый раз, не нужно писать ничего перед вызовом Main.

    Чтобы скомпилировать какой-нибудь пример, можно даже открыть Project1.dpr в Delphi IDE и нажать Ctrl+F9 :)

    Для тех, кому всё же ещё хочется использовать KlbrInWin — это тоже можно сделать.
    Запускаем KlbrInWin, запускаем в нём PELoad, в котором запускаем Project1.exe