Page 1 of 2
sysfuncr.txt - дополнения.
Posted: Wed Jun 01, 2005 9:42 am
by halyavin
В файле sysfuncr.txt функции описаны далеко не так, как они действуют на самом деле. Предлагаю здесь выкладывать все найденные неточности.
1. В функции 4 имеет значение только младший байт длины текста, все остальные игнорируются.
2. Функция начала прорисовки автоматически удаляет все кнопки.
3. 64 функцию нельзя вызывать в многопоточных программах.
4. 58 функция в ebx возращает размер файла.
Posted: Wed Jun 01, 2005 10:01 am
by ipr
А почему такие ошибки были внесены в сисфунк? Куда делись примечания?
Posted: Wed Jun 01, 2005 11:16 am
by halyavin
А потому что sysfunc писал Ville и для него главным было побыстрее написать эту справку. Да и sysfunc этот уже давно не обновлялся.
Posted: Wed Jun 01, 2005 11:28 am
by ipr
Дык надо обновить

)
Posted: Wed Jun 01, 2005 11:50 am
by halyavin
Для этого и создана эта тема. Обычно ядерщики держали секреты системных функций при себе. Пора собрать их воедино.

Posted: Wed Jun 01, 2005 5:32 pm
by Wildwest
>4. 58 функция в ebx возращает размер файла.
Так это и написано в сисфунк.тхт
ebx указатель на блок fileinfo
примеры путей к файлам:
'/RAMDISK/FIRST/KERNEL.ASM',0
'/RD/1/KERNEL.ASM',0
'/HARDDISK/FIRST/KERNEL.ASM',0
'/HD/1/KERNEL.ASM',0
'/HARDDISK/FIRST/MENUET/PICS/TANZANIA.BMP',0
fileinfo:
dd 0 ; 0 = ЧТЕНИЕ ФАЙЛА
dd 0x0 ; номер блока файла (512 байт, нумерация начинается с нуля)
dd 0x1 ; сколько блоков считывать
dd 0x20000 ; куда считывать
dd 0x10000 ; память для работы ОС - 4096 байт
db '/RAMDISK/FIRST/KERNEL.ASM',0
; строка с путем к файлу, заканчивается нулем (ASCIIZ)
результат: в eax код ошибки (0 или 5 - успешно)
в ebx размер файла
Другое дело, что финн поменял код ошибки на 5
file_system:
; IN:
;
; eax = 0 ; read file /RamDisk/First 6 /HardDisk/First 30
; eax = 1 ; write file /RamDisk/First 33 /HardDisk/First 56
; eax = 2 ; delete file /RamDisk/First 32 /HardDisk/First 57
; eax = 3 ; append to a file /RamDisk/First ?? /HardDisk/First ??
; eax = 4 ; makedir
; eax = 5 ; rename file/directory
; eax = 8 ; lba read
; eax = 12 ; get_filesize
; eax = 13 ; get_fileattr
; eax = 14 ; get_filedate
; eax = 15 ; get_disk_info
; eax = 16 ; start application
;
; OUT:
;
; eax = 0 : read ok
; eax = 1 : no fd base and/or partition defined
; eax = 2 : yet unsupported FS
; eax = 3 : unknown FS
; eax = 4 : partition not defined at hd
; eax = 5 : file not found
; eax = 6 : end of file
; eax = 7 : memory pointer not in application area
; eax = 8 : disk full
; eax = 9 : fat table corrupted
; eax = 10 : access denied
;
; ebx = size
Posted: Wed Jun 01, 2005 7:32 pm
by halyavin
Действительно, я просто помню, что в старых sysfuncr.txt это не было написано, а на новую версию не посмотрел.
5. Функция 0 на самом деле создает окно на 1 пиксель меньше по вертикали и горизонтали.
Posted: Fri Jun 17, 2005 2:49 pm
by halyavin
Работа IPC.
1. (eax=60,ebx=1) Формат данных региона для приема сообщений:
+00h dword 0 - разрешен прием сообщений,
<>0 - запрещен прием сообщений. (этот флаг устнавливается исключительно приложением)
+04h dword x - смещение по которому будет записано первое сообщение (разумно взять x=8 ).
После приема нескольких сообщений формат имеет следующий вид:
+00h dword 0 - разрешен прием сообщений,
<>0 - запрещен прием сообщений. (этот флаг устнавливается исключительно приложением)
+04h dword y - адрес по которому будет записано следующее сообщение.
+x-4 dword PID процесса, пославшего первое сообщение.
+x dword x_1 - размер сообщения.
+x+4 rb x_1 - сообщение
+x+x_1+4 dword PID процесса, пославшего второе сообщение.
...
+x+x_1+...+x_{n-1}-4+8*(n-1) rb x_n - последнее сообщение.
+x+x_1+...+x_n-4+8*n=y
если изначально указать x=0, то получим
+00h dword PID процесса, пославшего сообщение. (PID не равен нулю, поэтому дальнейшие сообщения будут заблокированы)
+04h dword x - размер сообщения.
+08h rb x - сообщение.
Учтите, что менует не дает послать сообщение, если оно ровно помещается в буфер - буфер должен быть хотя бы на один байт больше.
2. (eax=60,ebx=2) Посылка сообщения.
В eax возращается код ошибки:
4 - процесс не найден (неверный PID).
1 - процесс не определил область для приема сообщений.
2 - прием сообщений запрещен приложением (первое двойное слово не ноль).
3 - не хватает буфера для приема сообщения (или сообщение вместилось бы в буфер точно).
0 - сообщение успешно отправлено.
Posted: Fri Jun 17, 2005 3:27 pm
by german
Комментарии (можете не обращать внимания):
На исследования IPC, Халявина натолкнул Герман, после продолжительного
разговора по Аське
Posted: Fri Jun 17, 2005 8:54 pm
by Hex
german
Ты скромный малый

!
All
Слушайте, надо перенести сетевые функции из Stack.txt в sysfuncr.txt.Тем более, что описания всех АПИ-функций должны быть в одном месте.

Posted: Sat Jun 18, 2005 6:25 pm
by EXIS
Halyavin Молодец! Как всегда =)
Posted: Thu Jun 23, 2005 1:56 pm
by halyavin
Еще один баг был найден благодаря hidnplayr - в 15 функции за неправильную установку размера фонового изображения отвечает только пользователь. Если их установить слишком большими, то начнутся проблемы, поскольку под это изображение отведен 1Mb.
Posted: Thu Jun 23, 2005 2:23 pm
by halyavin
Уточнение - проверка на слишком большое изображение все-таки есть, но она не правильная! А именно сравнивается не с 0x100000-16 (=1Mb), а с 0x160000-16.
Posted: Thu Jun 23, 2005 3:37 pm
by halyavin
По-видимому все-таки можно использовать до 0x160000 памяти под background, хотя с этим еще нужно разобраться. В любом случае ядро не должно разрешать устанавливать размер фона, при котором происходит превышение этого лимита.
Posted: Fri Jun 24, 2005 12:13 am
by Wildwest
Если народ читал историю МеОС, то там упоминается глюк потерянных кнопок. Есть подозрение, что он не до конца убран - из-за этого проблемы с CPUID.