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 18522 times
    w_console.png
    w_console.png (12.3 KiB)
    Viewed 18522 times
    Кое-какие примеры из fasmlib тоже работают, но не совсем правильно.
    И вот ведь проблема, библиотека должна как-то узнавать, загружена или нет другая библиотека(например, консоль), инициализирована она или нет. Пока ещё не решил, как это лучше сделать.
    PELoad.7z (10.16 KiB)
    Downloaded 480 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 18500 times
    А тут вот он даже ассемблировать пытался(папка include отсутствовала):
    tasm32_param.png
    tasm32_param.png (27.61 KiB)
    Viewed 18500 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 :)
    Spoiler:В папке с каждым примером находится run.bat, вот его содержимое

    Code: Select all

    "../peload/run.bat" "/hd1/2/DelphiKOS/test2/project1.exe"
    путь к project1.exe надо поменять на свой будет.

    Содержимое peload/run.bat

    Code: Select all

    Set KIW="C:/Path/To/KlbrInWin/KlbrInWin.exe"
    Set PEL="C:/Path/To/PELoad/peload.kex"
    Set EXE=%1
    %KIW% %PEL% %EXE%
    надо тоже задать пути к KlbrInWin и peload.
    В KOS можно запустить с помощью run_in_KOS.sh вот так

    Code: Select all

    #SHS
    ../peload/peload.kex project1.exe
    Сама папка должна быть на tmp, или hd, или rd, а то с cd не запускается(проблема, вероятно с путями в скрипте).

    Первый пример — это просто окно с заголовком "Hello, Delphi7.0!".
    Второй пример — вывод текста. Кусочек кода
    Spoiler:

    Code: Select all

     i := 1;
     While i <= 10 Do Begin
       DrawText( i Shl 1 + 10, i * 12, 'Test DrawText', COLOR_RED, COLOR_GREEN,
                                     DT_CP866_6X9 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
       Inc(i);
     End;
     i := 1;
     While i <= 10 Do Begin
       DrawText( -i Shl 1 + 128, i * 12, 'DrawText test', COLOR_GREEN, COLOR_BLUE,
                                    DT_CP866_8X16 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
       Inc(i);
     End;
    
    Я подумал, что вместо использования DrawText удобнее будет использовать перегруженные функции DrawStr — это вот
    Spoiler:

    Code: Select all

    (* -------------------------------------------------------- *)
    Procedure DrawStr(X, Y: Integer; Text: PChar; ForeColor, BackColor, Flags: Cardinal); Overload;
    Begin
      DrawText(X, Y, Text, ForeColor, BackColor, Flags Or DT_ZSTRING, 0);
    End;
    (* -------------------------------------------------------- *)
    Procedure DrawStr(X, Y: Integer; Text: ShortString; ForeColor, BackColor, Flags: Cardinal); Overload;
    Begin
      DrawText(X, Y, @Text[1], ForeColor, BackColor, Flags And Not DT_ZSTRING, Cardinal(Text[0]));
    End;
    (* -------------------------------------------------------- *)
    Третий пример — чтение файла, создание файла, запуск приложения с параметрами. Кусочки этого кода
    Spoiler:

    Code: Select all

    ...................................................................  
      If CreateFile('/sys/NewFile.txt') = 0 Then
        strCreateResult := 'File created.'
      Else
        strCreateResult := 'CreateFile Error!';
    
      If RunFile('/sys/develop/cobj', '/sys/lib/box_lib.obj') > 0 Then
        strRunResult := 'Program started successfully.'
      Else
        strRunResult := 'RunFile Error!';
    ...................................................................  
     If ReadFile('/sys/file managers/KFM_KEYS.TXT', @Buffer, 60, 0, 0) = 0 Then
        DrawStr(20, 110, @Buffer, COLOR_RED, COLOR_GREEN, DT_CP866_8X16)
     Else
        DrawStr(20, 110, 'ReadFile Error!', COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
    
     DrawStr(20, 127, strCreateResult, COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
     DrawStr(20, 144, strRunResult, COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
    ...................................................................   
    Четвёртый пример — DrawButton и SetWindowCaption. Кусочек кода
    Spoiler:

    Code: Select all

     DrawButton(10, 20, 50, 30, COLOR_BLUE, 0, BLUE_BUTTON);
     DrawButton(70, 20, 50, 30, COLOR_GREEN, 0, GREEN_BUTTON);
     DrawButton(10, 60, 50, 30, COLOR_RED, 0, RED_BUTTON);
     DrawButton(70, 60, 50, 30, COLOR_BLACK, 0, BLACK_BUTTON);
     ....................................................................................
      Case GetButton() Shr 8 Of
      1: 	        ThreadTerminate;
      BLUE_BUTTON:  SetWindowCaption('Blue Button Pressed.');
      GREEN_BUTTON: SetWindowCaption('Green Button Pressed.');
      RED_BUTTON:   SetWindowCaption('Red Button Pressed.');
      BLACK_BUTTON: SetWindowCaption('Black Button Pressed.');
      End;
    Пятый пример — SetEventMask, загрузка библиотеки box_lib, использование Scrollbar. Кусочек кода
    Spoiler:

    Code: Select all

      hBoxLib := LoadLibrary('/sys/lib/box_lib.obj');
      HScrollbarDraw  := GetProcAddress(hBoxLib, 'scrollbar_h_draw');
      HScrollbarMouse := GetProcAddress(hBoxLib, 'scrollbar_h_mouse');
    
      With Scrollbar1 Do Begin
        ar_offset  := 1;
        all_redraw := 1;
        size_x     := 200;
        btn_high   := 16;
        bckg_col   := COLOR_GREEN;
        frnt_col   := COLOR_GREEN Or COLOR_BLUE;
        line_col   := COLOR_BLUE;
        start_y    := 40;
        size_y     := 16;
        start_x    := 35;
        max_area   := 160;
        cur_area   := 40;
        mode       := 1;
      End;
    
      SetEventMask(EM_REDRAW + EM_KEY + EM_BUTTON + EM_MOUSE);
    ......................................................................
     Scrollbar1.all_redraw := 1;
     HScrollbarDraw(@Scrollbar1); 
    ...................................................................... 
    Procedure On_Mouse();
    Begin
      HScrollbarMouse(@Scrollbar1);;
    End;
    И, конечно, я проверил возможность запуска таких приложений в самой KolibriOS.
    Spoiler:ImageДля старта приложения можно запустить run_in_KOS.sh, который в папке с каждым примером. Один нюанс — этот скрипт работает не из всех файловых менеджеров. Но из того, который на скриншоте — работает.
    DelphiKOS.7z (6.37 KiB)
    Downloaded 350 times
  • 0CodErr wrote:По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать.
    Ну вот, еще один полуфабрикат. :mrgreen:
  • Who is online

    Users browsing this forum: No registered users and 4 guests