Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт сен 20, 2018 8:14 am

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




Начать новую тему  Ответить на тему  [ 2 сообщения ] 
Автор Сообщение
 Заголовок сообщения: SysFn18.13:GetKernelVersion
СообщениеДобавлено: Сб дек 31, 2016 8:25 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1375
Цитата:
Siemargl « Сб дек 31, 2016 4:14 pm » где взять номер сборки системы? хочу в шелл добавить,а то путаю педали
Pathoswithin « Сб дек 31, 2016 4:42 pm » Сисфункция 18.13 для ядра. Для всей системы вроде нигде не хранится.
Нашёл такой пример на паскале
Спойлер: Показать
Вложение:
0.PNG
0.PNG [ 12.5 КБ | 995 просмотров ]
Вложение:
Unit1.kex [544 байт]
67 скачиваний
Код:
Unit Unit1;
(* -------------------------------------------------------- *)
Interface
(* -------------------------------------------------------- *)
Type

  Dword = Cardinal;

  TKernelVersion = Packed Record
    A, B, C, D: Byte;
    reserved:   Byte;
    Revision:   Dword;
  End;
 
Var
  hConsole: Pointer;
  ConsoleInit:       Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
  ConsoleExit:       Procedure(bCloseWindow: Cardinal); StdCall;
  printf:            Function(Const Format: PChar): Integer; CDecl VarArgs;
(* -------------------------------------------------------- *)
  Procedure Main; Forward;
  Procedure ThreadTerminate; Forward;
  Function  LoadLibrary(Path: PChar): Pointer; StdCall; Forward;
  Function  GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer; StdCall; Forward;
  Procedure GetKernelVersion(Var Buffer: TKernelVersion); StdCall;Forward;
(* -------------------------------------------------------- *)
Implementation
(* -------------------------------------------------------- *)
Procedure Main();
Var
   KernelVersion: TKernelVersion;
Begin

   hConsole          := LoadLibrary('/sys/lib/console.obj');
   ConsoleInit       := GetProcAddress(hConsole, 'con_init');
   ConsoleExit       := GetProcAddress(hConsole, 'con_exit');
   printf            := GetProcAddress(hConsole, 'con_printf');

   ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');

   GetKernelVersion(KernelVersion);
   With KernelVersion Do Begin
     printf('Version  = %d.%d.%d.%d'#10, A, B, C, D);
     printf('Revision = %d'#10, Revision);
   End;
   
   ConsoleExit(0);
   ThreadTerminate;
End;
(* -------------------------------------------------------- *)
{18.13}   Procedure GetKernelVersion(Var Buffer: TKernelVersion); StdCall;
          Asm
                  push   ebx
                  mov    eax, 18
                  mov    ebx, 13
                  mov    ecx, Buffer
                  int    64
                  pop    ebx
          End;
(* -------------------------------------------------------- *)
Procedure ThreadTerminate();
Asm
        mov    eax, $FFFFFFFF
        int    64
End;
(* -------------------------------------------------------- *)
Function GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer;
Asm
        push   esi
        push   edi
        push   ebx
        mov    edx, hLib
        xor    eax, eax
        test   edx, edx
        jz     @end
        mov    edi, ProcName
        mov    ecx, $FFFFFFFF
        repne scasb
        mov    ebx, ecx
        not    ebx
@next:
        mov    esi, [edx]
        test   esi, esi
        jz     @end
        mov    ecx, ebx
        mov    edi, ProcName
        add    edx, 8
        repe cmpsb
        jne    @next
        mov    eax, [edx - 4]
@end:
        pop    ebx
        pop    edi
        pop    esi
End;
(* -------------------------------------------------------- *)
Function LoadLibrary(Path: PChar): Pointer;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 19
        mov    ecx, Path
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
End.


Вернуться к началу
 Заголовок сообщения: Re: SysFn18.13:GetKernelVersion
СообщениеДобавлено: Чт фев 22, 2018 11:51 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1375
Сейчас формат структуры такой:
Код:
db a,b,c,d for version a.b.c.d
db 0: reserved
dd REV - kernel SVN revision number
For Kolibri 0.7.7.0+ kernel:
db 0,7,7,0
db 0
dd 1675
А когда-то раньше был
Код:
db a,b,c,d for version a.b.c.d
db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
db 'name',0 - ASCIIZ-string with the name
For Kolibri 0.5.8.1 kernel:
db 0,5,8,1
db 2
db 'Kolibri',0
Потом в редакции 540 он стал таким
Код:
db a,b,c,d for version a.b.c.d
db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
dd REV - kernel SVN revision number
For Kolibri 0.7.0.0 kernel:
db 0,7,0,0
db 2
dd 533
Кстати, эмулятор KlbrInWin возвращает UID_KlbrInWin = 3. viewtopic.php?p=12431#p12431
Но в эмуляторе MeOSEmul такая функция отсутствует, хотя тоже можно было бы возвращать какой-нибудь UID_xxx.
А затем в редакции 1675 5-ый байт был зарезервирован и формат принял нынешний вид.
viewtopic.php?f=1&t=153&start=15#p29902
А по-моему идея с UID_xxx была хорошей, почему всё же было решено отказаться от этого?


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

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


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

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


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

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