Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср окт 18, 2017 8:51 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: PELoad
СообщениеДобавлено: Вт май 28, 2013 8:23 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Попробовал запускать в Колибри 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.


Вложения:
PELoad.7z [8.82 КБ]
128 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Вт май 28, 2013 9:14 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
Unable to load kernel32.dll. :(

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Вт май 28, 2013 10:37 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Цитата:
Unable to load kernel32.dll. :(
А папка "lib" была в папке с программой?


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Ср май 29, 2013 12:55 am 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Чт сен 03, 2009 1:52 pm
Сообщения: 1599
0CodErr писал(а):
Вот здесь viewtopic.php?f=2&t=684&p=48971#p48960 я уже спрашивал про "unresolved", непонятно из-за чего это возникает?

Код:
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
СообщениеДобавлено: Пт май 31, 2013 10:17 pm 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Пт май 31, 2013 10:38 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
Прав.


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 5:51 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
Теперь запускаются ещё эти примеры:
    masm32\examples\exampl11\fileio\ppfileio.exe
    masm32\examples\exampl11\tokenise\tokenise.exe
Первый пример создаёт файл "testfile.txt"(а если он существовал, то сперва его удаляет), пишет в этот файл, закрывает, открывает снова, добавляет ещё, потом всё вместе выводит в консоль.
Второй пример читает свой исходник(который в той же папке), обрабатывает его, затем результат выводит в консоль.
Спойлер: Показать
Вложение:
K_console.png
K_console.png [ 12.46 КБ | 3106 просмотров ]
Вложение:
w_console.png
w_console.png [ 12.3 КБ | 3106 просмотров ]

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 6:08 pm 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 7:20 pm 
Не в сети

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

Я тут немножко ещё "подхимичил":
Спойлер: Показать
Это запуск без параметров:
Вложение:
tasm32_no_param.png
tasm32_no_param.png [ 39.41 КБ | 3084 просмотра ]
А тут вот он даже ассемблировать пытался(папка include отсутствовала):
Вложение:
tasm32_param.png
tasm32_param.png [ 27.61 КБ | 3084 просмотра ]


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 7:29 pm 
Не в сети

Зарегистрирован: Пн сен 24, 2007 11:11 am
Сообщения: 2814
У тебя не поддерживаются относительные пути?
Все же, заходи ВК, есть мысли.


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 7:50 pm 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Сб июн 01, 2013 8:28 pm 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Вс июн 02, 2013 8:34 pm 
Не в сети
Аватара пользователя

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

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


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Ср окт 05, 2016 12:16 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1069
В связи с
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, ... . Но мне лень это всё делать.

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

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

Первый пример — это просто окно с заголовком "Hello, Delphi7.0!".
Второй пример — вывод текста. Кусочек кода
Спойлер: Показать
Код:
 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 — это вот
Спойлер: Показать
Код:
(* -------------------------------------------------------- *)
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;
(* -------------------------------------------------------- *)

Третий пример — чтение файла, создание файла, запуск приложения с параметрами. Кусочки этого кода
Спойлер: Показать
Код:
...................................................................  
  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. Кусочек кода
Спойлер: Показать
Код:
 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. Кусочек кода
Спойлер: Показать
Код:
  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.
Спойлер: Показать
ИзображениеДля старта приложения можно запустить run_in_KOS.sh, который в папке с каждым примером. Один нюанс — этот скрипт работает не из всех файловых менеджеров. Но из того, который на скриншоте — работает.
Вложение:
DelphiKOS.7z [6.37 КБ]
13 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: PELoad
СообщениеДобавлено: Ср окт 05, 2016 6:54 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
0CodErr писал(а):
По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать.

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

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 27 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB