В файле sysfuncr.txt функции описаны далеко не так, как они действуют на самом деле. Предлагаю здесь выкладывать все найденные неточности.
1. В функции 4 имеет значение только младший байт длины текста, все остальные игнорируются.
2. Функция начала прорисовки автоматически удаляет все кнопки.
3. 64 функцию нельзя вызывать в многопоточных программах.
4. 58 функция в ebx возращает размер файла.
sysfuncr.txt - дополнения.
А почему такие ошибки были внесены в сисфунк? Куда делись примечания?
А потому что sysfunc писал Ville и для него главным было побыстрее написать эту справку. Да и sysfunc этот уже давно не обновлялся.
Дык надо обновить )
Для этого и создана эта тема. Обычно ядерщики держали секреты системных функций при себе. Пора собрать их воедино.
>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
Так это и написано в сисфунк.тхт
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
Действительно, я просто помню, что в старых sysfuncr.txt это не было написано, а на новую версию не посмотрел.
5. Функция 0 на самом деле создает окно на 1 пиксель меньше по вертикали и горизонтали.
5. Функция 0 на самом деле создает окно на 1 пиксель меньше по вертикали и горизонтали.
Работа 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 - сообщение успешно отправлено.
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 - сообщение успешно отправлено.
Комментарии (можете не обращать внимания):
На исследования IPC, Халявина натолкнул Герман, после продолжительного
разговора по Аське
На исследования IPC, Халявина натолкнул Герман, после продолжительного
разговора по Аське
german
Ты скромный малый !
All
Слушайте, надо перенести сетевые функции из Stack.txt в sysfuncr.txt.Тем более, что описания всех АПИ-функций должны быть в одном месте.
Ты скромный малый !
All
Слушайте, надо перенести сетевые функции из Stack.txt в sysfuncr.txt.Тем более, что описания всех АПИ-функций должны быть в одном месте.
Halyavin Молодец! Как всегда =)
Еще один баг был найден благодаря hidnplayr - в 15 функции за неправильную установку размера фонового изображения отвечает только пользователь. Если их установить слишком большими, то начнутся проблемы, поскольку под это изображение отведен 1Mb.
Уточнение - проверка на слишком большое изображение все-таки есть, но она не правильная! А именно сравнивается не с 0x100000-16 (=1Mb), а с 0x160000-16.
По-видимому все-таки можно использовать до 0x160000 памяти под background, хотя с этим еще нужно разобраться. В любом случае ядро не должно разрешать устанавливать размер фона, при котором происходит превышение этого лимита.
Если народ читал историю МеОС, то там упоминается глюк потерянных кнопок. Есть подозрение, что он не до конца убран - из-за этого проблемы с CPUID.
Who is online
Users browsing this forum: No registered users and 11 guests