Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Sep 23, 2019 7:35 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 27 posts ]  Go to page 1 2 Next
Author Message
 Post subject: PELoad
PostPosted: Tue May 28, 2013 8:23 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Попробовал запускать в Колибри 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.


Attachments:
PELoad.7z [8.82 KiB]
Downloaded 199 times
Top
   
 Post subject: Re: PELoad
PostPosted: Tue May 28, 2013 9:14 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
Unable to load kernel32.dll. :(

_________________
Разработчик языка программирования Кантор


Top
   
 Post subject: Re: PELoad
PostPosted: Tue May 28, 2013 10:37 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Quote:
Unable to load kernel32.dll. :(
А папка "lib" была в папке с программой?


Top
   
 Post subject: Re: PELoad
PostPosted: Wed May 29, 2013 12:55 am 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1620
0CodErr wrote:
Вот здесь viewtopic.php?f=2&t=684&p=48971#p48960 я уже спрашивал про "unresolved", непонятно из-за чего это возникает?

Code:
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.

_________________
Сделаем мир лучше!


Top
   
 Post subject: Re: PELoad
PostPosted: Fri May 31, 2013 10:17 pm 
Offline
User avatar

Joined: Wed Dec 21, 2011 5:53 pm
Posts: 98
Прошу простить нуба, но я прав, что в kernel32.dll.asm и msvcrt.dll.asm содержится аналог winapi функций?

_________________
Нуб зеленый.


Top
   
 Post subject: Re: PELoad
PostPosted: Fri May 31, 2013 10:38 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Прав.


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 5:51 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Теперь запускаются ещё эти примеры:
    masm32\examples\exampl11\fileio\ppfileio.exe
    masm32\examples\exampl11\tokenise\tokenise.exe
Первый пример создаёт файл "testfile.txt"(а если он существовал, то сперва его удаляет), пишет в этот файл, закрывает, открывает снова, добавляет ещё, потом всё вместе выводит в консоль.
Второй пример читает свой исходник(который в той же папке), обрабатывает его, затем результат выводит в консоль.
Spoiler: Show
Attachment:
K_console.png
K_console.png [ 12.46 KiB | Viewed 5019 times ]
Attachment:
w_console.png
w_console.png [ 12.3 KiB | Viewed 5019 times ]

Кое-какие примеры из fasmlib тоже работают, но не совсем правильно.
И вот ведь проблема, библиотека должна как-то узнавать, загружена или нет другая библиотека(например, консоль), инициализирована она или нет. Пока ещё не решил, как это лучше сделать.
Attachment:
PELoad.7z [10.16 KiB]
Downloaded 180 times


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 6:08 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
Проект очень интересный. Хочу обсудить с тобой пару моментов в контакте.


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 7:20 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Quote:
Как я понимаю, сейчас dll - это на самом деле не dll? Ну, точнее, DLL, но не PE DLL?
Да, всё правильно, она грузится как обычная для Колибри библиотека с помощью SysFn68.19.

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


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 7:29 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
У тебя не поддерживаются относительные пути?
Все же, заходи ВК, есть мысли.


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 7:50 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Quote:
У тебя не поддерживаются относительные пути?
Поддерживаются. И при запуске exe-программы содержащая её папка становится текущей. Тот файл лежал как раз в папке с tasm32.exe, так что можно было указать просто "keygen.asm". А вот папки "include" не было. И ещё надо было заменить обратные слеши.


Top
   
 Post subject: Re: PELoad
PostPosted: Sat Jun 01, 2013 8:28 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Попробуй поправить слэши, может, он даже скомпилирует тебе что-нибудь. Это будет огромный успех, между прочим.


Top
   
 Post subject: Re: PELoad
PostPosted: Sun Jun 02, 2013 8:34 pm 
Offline
User avatar

Joined: Wed Dec 21, 2011 5:53 pm
Posts: 98
Как только ЭТО сможет запускать консольные программы, написанные на дельфях, я лично проставлю автору выпивку(или безалкогольного, в эквиваленте). Ибо годно.

_________________
Нуб зеленый.


Top
   
 Post subject: Re: PELoad
PostPosted: Wed Oct 05, 2016 12:16 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
В связи с
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:
Program Project1;
Procedure Main(); Begin End;
Begin Main; end.
то в начале происходит вызов InitExe из SysInit
Code:
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:
MAGIC_OFFSET                   equ  16 ; Hack For Delphi7 {$APPTYPE GUI}
; MAGIC_OFFSET                   equ  24 ; Hack For Delphi7 {$APPTYPE CONSOLE}
и потом ниже вот так он используется
Code:
; 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: Show
В папке с каждым примером находится run.bat, вот его содержимое
Code:
"../peload/run.bat" "/hd1/2/DelphiKOS/test2/project1.exe"
путь к project1.exe надо поменять на свой будет.

Содержимое peload/run.bat
Code:
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:
#SHS
../peload/peload.kex project1.exe
Сама папка должна быть на tmp, или hd, или rd, а то с cd не запускается(проблема, вероятно с путями в скрипте).

Первый пример — это просто окно с заголовком "Hello, Delphi7.0!".
Второй пример — вывод текста. Кусочек кода
Spoiler: Show
Code:
 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: Show
Code:
(* -------------------------------------------------------- *)
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: Show
Code:
...................................................................  
  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: Show
Code:
 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: Show
Code:
  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: Show
ImageДля старта приложения можно запустить run_in_KOS.sh, который в папке с каждым примером. Один нюанс — этот скрипт работает не из всех файловых менеджеров. Но из того, который на скриншоте — работает.
Attachment:
DelphiKOS.7z [6.37 KiB]
Downloaded 84 times


Top
   
 Post subject: Re: PELoad
PostPosted: Wed Oct 05, 2016 6:54 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
0CodErr wrote:
По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать.

Ну вот, еще один полуфабрикат. :mrgreen:

_________________
Разработчик языка программирования Кантор


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 27 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited