Page 1 of 3

PELoad

Posted: Tue May 28, 2013 8:23 pm
by 0CodErr
Попробовал запускать в Колибри Win-программы. Сейчас работает только ввод\вывод в консоль, а с файлами пока не получилось. Запускаются некоторые тестовые программки из masm32, например, эти:
  • masm32\tutorial\console\demo1\hello.exe
    masm32\tutorial\console\demo5\numbers.exe
    masm32\examples\exampl10\sptrim\sptrim.exe
    masm32\examples\exampl10\stexp\se.exe
    masm32\examples\exampl10\mntest\mntest.exe
Запускать из командной строки:
peload filepath cmdline
или
peload "file path" cmdline

Если отсутствует импортируемая библиотека или какая-то функция в ней, то программа должна сказать об этом в консоль.

Вот здесь viewtopic.php?f=2&t=684&p=48971#p48960 я уже спрашивал про "unresolved", непонятно из-за чего это возникает?

В архиве исходники и make.bat в папке src.

Re: PELoad

Posted: Tue May 28, 2013 9:14 pm
by Freeman
Unable to load kernel32.dll. :(

Re: PELoad

Posted: Tue May 28, 2013 10:37 pm
by 0CodErr
Unable to load kernel32.dll. :(
А папка "lib" была в папке с программой?

Re: PELoad

Posted: Wed May 29, 2013 12:55 am
by CleverMouse
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.

Re: PELoad

Posted: Fri May 31, 2013 10:17 pm
by ramiil-kun
Прошу простить нуба, но я прав, что в kernel32.dll.asm и msvcrt.dll.asm содержится аналог winapi функций?

Re: PELoad

Posted: Fri May 31, 2013 10:38 pm
by SoUrcerer
Прав.

Re: PELoad

Posted: Sat Jun 01, 2013 5:51 pm
by 0CodErr
Теперь запускаются ещё эти примеры:
  • 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 18532 times
w_console.png
w_console.png (12.3 KiB)
Viewed 18532 times
Кое-какие примеры из fasmlib тоже работают, но не совсем правильно.
И вот ведь проблема, библиотека должна как-то узнавать, загружена или нет другая библиотека(например, консоль), инициализирована она или нет. Пока ещё не решил, как это лучше сделать.
PELoad.7z (10.16 KiB)
Downloaded 480 times

Re: PELoad

Posted: Sat Jun 01, 2013 6:08 pm
by SoUrcerer
Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
Проект очень интересный. Хочу обсудить с тобой пару моментов в контакте.

Re: PELoad

Posted: Sat Jun 01, 2013 7:20 pm
by 0CodErr
Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
Да, всё правильно, она грузится как обычная для Колибри библиотека с помощью SysFn68.19.

Я тут немножко ещё "подхимичил":
Spoiler:Это запуск без параметров:
tasm32_no_param.png
tasm32_no_param.png (39.41 KiB)
Viewed 18510 times
А тут вот он даже ассемблировать пытался(папка include отсутствовала):
tasm32_param.png
tasm32_param.png (27.61 KiB)
Viewed 18510 times

Re: PELoad

Posted: Sat Jun 01, 2013 7:29 pm
by SoUrcerer
У тебя не поддерживаются относительные пути?
Все же, заходи ВК, есть мысли.

Re: PELoad

Posted: Sat Jun 01, 2013 7:50 pm
by 0CodErr
У тебя не поддерживаются относительные пути?
Поддерживаются. И при запуске exe-программы содержащая её папка становится текущей. Тот файл лежал как раз в папке с tasm32.exe, так что можно было указать просто "keygen.asm". А вот папки "include" не было. И ещё надо было заменить обратные слеши.

Re: PELoad

Posted: Sat Jun 01, 2013 8:28 pm
by SoUrcerer
Попробуй поправить слэши, может, он даже скомпилирует тебе что-нибудь. Это будет огромный успех, между прочим.

Re: PELoad

Posted: Sun Jun 02, 2013 8:34 pm
by ramiil-kun
Как только ЭТО сможет запускать консольные программы, написанные на дельфях, я лично проставлю автору выпивку(или безалкогольного, в эквиваленте). Ибо годно.

Re: PELoad

Posted: Wed Oct 05, 2016 12:16 am
by 0CodErr
В связи с
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 351 times

Re: PELoad

Posted: Wed Oct 05, 2016 6:54 pm
by Freeman
0CodErr wrote:По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать.
Ну вот, еще один полуфабрикат. :mrgreen: