/kernel/branches/Kolibri-acpi/blkdev/bd_drv.inc |
---|
178,7 → 178,7 |
ja .notread |
sub eax, [bios_cur_sector] |
shl eax, 9 |
add eax, (OS_BASE+0x9A000) |
add eax, (OS_BASE+0x99000) |
push ecx esi |
mov esi, eax |
mov ecx, 512/4 |
207,12 → 207,14 |
jmp bd_read |
.readerr: |
.v86err: |
pop edx |
pop eax |
mov [hd_error], 1 |
jmp hd_read_error |
;----------------------------------------------------------------- |
bd_write_cache_chain: |
pusha |
mov edi, OS_BASE + 0x9A000 |
mov edi, OS_BASE + 0x99000 |
movzx ecx, [cache_chain_size] |
push ecx |
shl ecx, 9-2 |
240,7 → 242,7 |
; In current implementation it is protected by common mutex 'ide_status' |
mov word [OS_BASE + 510h], 10h ; packet length |
mov word [OS_BASE + 512h], cx ; number of sectors |
mov dword [OS_BASE + 514h], 9A000000h ; buffer 9A00:0000 |
mov dword [OS_BASE + 514h], 99000000h ; buffer 9900:0000 |
mov dword [OS_BASE + 518h], eax |
and dword [OS_BASE + 51Ch], 0 |
push ebx ecx esi edi |
267,7 → 269,7 |
@@: |
mov word [ebx+v86_regs.esi], 510h |
mov word [ebx+v86_regs.ss], 9000h |
mov word [ebx+v86_regs.esp], 0A000h |
mov word [ebx+v86_regs.esp], 09000h |
mov word [ebx+v86_regs.eip], 500h |
mov [ebx+v86_regs.eflags], 20200h |
mov esi, [sys_v86_machine] |
/kernel/branches/Kolibri-acpi/blkdev/hd_drv.inc |
---|
504,30 → 504,60 |
IDE_irq_14_handler: |
IDE_irq_15_handler: |
IDE_common_irq_handler: |
; Most of the time, we are here because we have requested |
; a DMA transfer for the corresponding drive. |
; However, |
; a) we can be here because IDE IRQ is shared with some other device, |
; that device has actually raised IRQ, |
; it has nothing to do with IDE; |
; b) we can be here because IDE controller just does not want |
; to be silent and reacts to something even though |
; we have, in theory, disabled IRQs. |
; If the interrupt corresponds to our current request, |
; remove the interrupt request and raise the event for the waiting code. |
; In the case a), just return zero - not our interrupt. |
; In the case b), remove the interrupt request and hope for the best. |
; DEBUGF 1, 'K : IDE_irq_handler %x\n', [IDE_common_irq_param]:2 |
cmp [IDE_common_irq_param], 0 |
jz .exit |
pushfd |
cli |
pushad |
mov ecx, [IDE_controller_pointer] |
mov ecx, [esp+4] |
mov dx, [ecx+IDE_DATA.RegsBaseAddres] |
cmp [IDE_common_irq_param], 14 |
jz @f |
add dx, 8 |
@@: |
add edx, 2 ; Bus Master IDE Status register |
in al, dx |
test al, 4 |
jz @f |
mov [IDE_common_irq_param], 0 |
jnz .interrupt_from_primary |
add edx, 8 |
in al, dx |
test al, 4 |
jnz .interrupt_from_secondary |
.exit_notour: |
xor eax, eax ; not our interrupt |
ret |
.interrupt_from_primary: |
out dx, al ; clear Interrupt bit |
sub edx, 2 |
xor eax, eax |
out dx, al ; clear Bus Master IDE Command register |
mov edx, [hdbase] |
mov dx, [ecx+IDE_DATA.BAR0_val] |
add edx, 7 |
in al, dx ; read status register |
in al, dx ; read status register |
cmp [IDE_common_irq_param], 14 |
jz .raise |
.exit_our: |
mov al, 1 |
ret |
.interrupt_from_secondary: |
out dx, al ; clear Interrupt bit |
sub edx, 2 |
xor eax, eax |
out dx, al ; clear Bus Master IDE Command register |
mov dx, [ecx+IDE_DATA.BAR2_val] |
add edx, 7 |
in al, dx ; read status register |
cmp [IDE_common_irq_param], 15 |
jnz .exit_our |
.raise: |
cmp ecx, [IDE_controller_pointer] |
jnz .exit_our |
pushad |
mov eax, [eventPointer] |
mov ebx, [eventID] |
xor edx, edx |
534,51 → 564,6 |
xor esi, esi |
call raise_event |
popad |
popfd |
mov al, 1 ; remove the interrupt request |
ret |
@@: |
popad |
popfd |
.exit: |
xor eax, eax ; not our interrupt |
ret |
;----------------------------------------------------------------- |
proc clear_pci_ide_interrupts |
mov esi, pcidev_list |
align 4 |
.loop: |
mov esi, [esi+PCIDEV.fd] |
cmp esi, pcidev_list |
jz .done |
; cmp [esi+PCIDEV.class], 0x01018F |
mov eax, [esi+PCIDEV.class] |
shr eax, 4 |
cmp eax, 0x01018 |
jnz .loop |
mov ah, [esi+PCIDEV.bus] |
mov al, 2 |
mov bh, [esi+PCIDEV.devfn] |
mov bl, 0x20 |
call pci_read_reg |
and eax, 0FFFCh |
mov edx, eax |
add edx, 2 |
in al, dx |
DEBUGF 1,'K : clear_pci_ide_interrupts: port[%x] = %x ',dx,al |
out dx, al |
in al, dx |
DEBUGF 1,'-> %x; ',al |
add edx, 8 |
in al, dx |
DEBUGF 1,'port[%x] = %x ',dx,al |
out dx, al |
in al, dx |
DEBUGF 1,'-> %x\n',al |
jmp .loop |
.done: |
ret |
endp |
/kernel/branches/Kolibri-acpi/core/dll.inc |
---|
747,12 → 747,13 |
test eax, eax |
jnz @F |
mov esi, msg_unresolved |
call sys_msg_board_str |
mov esi, edi |
call sys_msg_board_str |
mov esi, msg_CR |
call sys_msg_board_str |
; disable debug msg |
;mov esi, msg_unresolved |
;call sys_msg_board_str |
;mov esi, edi |
;call sys_msg_board_str |
;mov esi, msg_CR |
;call sys_msg_board_str |
mov [retval], 0 |
@@: |
/kernel/branches/Kolibri-acpi/core/exports.inc |
---|
119,13 → 119,13 |
usb_get_param, 'USBGetParam', \ |
usb_hc_func, 'USBHCFunc', \ |
\ |
NET_add_device, 'NetRegDev', \ |
NET_remove_device, 'NetUnRegDev', \ |
NET_ptr_to_num, 'NetPtrToNum', \ |
NET_link_changed, 'NetLinkChanged', \ |
ETH_input, 'EthInput', \ |
NET_BUFF_alloc, 'NetAlloc', \ |
NET_BUFF_free, 'NetFree', \ |
net_add_device, 'NetRegDev', \ |
net_remove_device, 'NetUnRegDev', \ |
net_ptr_to_num, 'NetPtrToNum', \ |
net_link_changed, 'NetLinkChanged', \ |
eth_input, 'EthInput', \ |
net_buff_alloc, 'NetAlloc', \ |
net_buff_free, 'NetFree', \ |
\ |
get_pcidev_list, 'GetPCIList', \ |
\ |
/kernel/branches/Kolibri-acpi/core/irq.inc |
---|
203,6 → 203,8 |
; Note: this still isn't 100% correct, because two IRQs can fire simultaneously, |
; the better way would be to find the correct IRQ, but I don't know how to do |
; this in that case. |
cmp ebp, 1 |
jz .fail |
push ebp |
xor ebp, ebp |
.try_other_irqs: |
/kernel/branches/Kolibri-acpi/core/sync.inc |
---|
144,7 → 144,6 |
sub esp, sizeof.MUTEX_WAITER |
mov ebx, [TASK_BASE] |
mov [ebx+TASKDATA.state], 1 |
mov [esp+MUTEX_WAITER.task], ebx |
lea esi, [ebp+FUTEX.wait_list] |
151,6 → 150,7 |
list_add_tail esp, esi ;esp= new waiter, esi= list head |
.again: |
mov [ebx+TASKDATA.state], 1 |
call change_task |
lock cmpxchg [ecx], edx |
199,7 → 199,7 |
mov eax, [TASK_BASE] |
mov [eax+TASKDATA.state], 5 |
mov [esp+MUTEX_WAITER.task], ebx |
mov [esp+MUTEX_WAITER.task], eax |
lea esi, [ebp+FUTEX.wait_list] |
list_add_tail esp, esi ;esp= new waiter, esi= list head |
/kernel/branches/Kolibri-acpi/core/v86.inc |
---|
89,10 → 89,10 |
mov byte [0x504], 0x10 |
mov byte [0x505], 0xF4 |
mov eax, 0x99000+PG_UWR |
mov edi, page_tabs+0x99*4 |
mov eax, 0x98000+PG_UWR |
mov edi, page_tabs+0x98*4 |
mov edx, 0x1000 |
mov ecx, 7 |
mov ecx, 8 |
@@: |
stosd |
add eax, edx |
/kernel/branches/Kolibri-acpi/detect/init_ata.inc |
---|
378,9 → 378,11 |
je .end_set_interrupts |
push ecx |
stdcall attach_int_handler, 14, IDE_irq_14_handler, 0 |
stdcall attach_int_handler, 14, IDE_irq_14_handler, ecx |
pop ecx |
DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax |
stdcall attach_int_handler, 15, IDE_irq_15_handler, 0 |
push ecx |
stdcall attach_int_handler, 15, IDE_irq_15_handler, ecx |
DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax |
pop ecx |
400,20 → 402,18 |
; the IDE controller 01018f. For this reason, the interrupt handler |
; does not need to be installed if both channel IDE controller |
; running in PIO mode. |
; ...unfortunately, PCI interrupt can be shared with other devices |
; which could enable it without consulting IDE code. |
; So install the handler anyways and try to process |
; even those interrupts which we are not expecting. |
cmp [ecx+IDE_DATA.RegsBaseAddres], 0 |
je .end_set_interrupts |
cmp [ecx+IDE_DATA.dma_hdd_channel_1], 0 |
jne @f |
cmp [ecx+IDE_DATA.dma_hdd_channel_2], 0 |
je .end_set_interrupts |
;-------------------------------------- |
@@: |
mov ax, [ecx+IDE_DATA.Interrupt] |
movzx eax, al |
push ecx |
stdcall attach_int_handler, eax, IDE_common_irq_handler, 0 |
stdcall attach_int_handler, eax, IDE_common_irq_handler, ecx |
pop ecx |
DEBUGF 1, "K : Set IDE IRQ%d return code %x\n", [ecx+IDE_DATA.Interrupt]:1, eax |
;-------------------------------------- |
/kernel/branches/Kolibri-acpi/docs/sysfuncr.txt |
---|
129,6 → 129,8 |
* Значение переменной _skinh доступно как результат вызова |
подфункции 4 функции 48 |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CREATE_WINDOW (0) |
====================================================================== |
================= Функция 1 - поставить точку в окне. ================ |
====================================================================== |
142,6 → 144,8 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PUT_PIXEL (1) |
====================================================================== |
============== Функция 2 - получить код нажатой клавиши. ============= |
====================================================================== |
178,6 → 182,8 |
* Поступает информация только о тех горячих клавишах, которые были |
определены этим потоком подфункцией 4 функции 66. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_KEY (2) |
====================================================================== |
================ Функция 3 - получить системное время. =============== |
====================================================================== |
193,6 → 199,8 |
поскольку возвращает просто DWORD-значение счетчика времени. |
* Системное время можно установить функцией 22. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_SYS_TIME (3) |
====================================================================== |
================ Функция 4 - нарисовать строку текста. =============== |
====================================================================== |
229,6 → 237,8 |
Ysize dd |
picture rb Xsize*Ysize*4 ; 32 бита |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DRAW_TEXT (4) |
====================================================================== |
========================= Функция 5 - пауза. ========================= |
====================================================================== |
245,6 → 255,8 |
(закончить текущий квант времени), используйте подфункцию 1 |
функции 68. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SLEEP (5) |
====================================================================== |
=============== Функция 7 - вывести изображение в окно. ============== |
====================================================================== |
260,6 → 272,8 |
изображения относительно окна. |
* Размер изображения в байтах есть 3*xsize*ysize. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PUT_IMAGE (7) |
====================================================================== |
=============== Функция 8 - определить/удалить кнопку. =============== |
====================================================================== |
293,6 → 307,8 |
* Общее количество кнопок для всех приложений ограничено |
числом 4095. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEFINE_BUTTON (8) |
====================================================================== |
============= Функция 9 - информация о потоке выполнения. ============ |
====================================================================== |
393,6 → 409,8 |
размером 1 Кб для будущей совместимости, в будущем могут быть |
добавлены некоторые поля. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_THREAD_INFO (9) |
====================================================================== |
==================== Функция 10 - ожидать события. =================== |
====================================================================== |
412,6 → 430,8 |
Чтобы ждать не более определенного времени, используйте |
функцию 23. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_WAIT_EVENT (10) |
====================================================================== |
======= Функция 11 - проверить, есть ли событие, без ожидания. ======= |
====================================================================== |
430,6 → 450,8 |
Чтобы ждать не более определенного времени, используйте |
функцию 23. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CHECK_EVENT (11) |
====================================================================== |
=========== Функция 12 - начать/закончить перерисовку окна. ========== |
====================================================================== |
451,6 → 473,9 |
* Функция начала перерисовки удаляет все определённые |
функцией 8 кнопки, их следует определить повторно. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_REDRAW (12) |
ebx - SSF_BEGIN_DRAW (1), SSF_END_DRAW (2) |
====================================================================== |
============ Функция 13 - нарисовать прямоугольник в окне. =========== |
====================================================================== |
465,6 → 490,8 |
* Под координатами понимаются координаты левого верхнего угла |
прямоугольника относительно окна. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DRAW_RECT (13) |
====================================================================== |
================ Функция 14 - получить размеры экрана. =============== |
====================================================================== |
480,6 → 507,8 |
* Смотри также подфункцию 5 функции 48 - получить размеры рабочей |
области экрана. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_SCREEN_SIZE (14) |
====================================================================== |
= Функция 15, подфункция 1 - установить размер фонового изображения. = |
====================================================================== |
497,6 → 526,9 |
* Есть парная функция получения размеров фонового изображения - |
подфункция 1 функции 39. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_SIZE_BG (1) |
====================================================================== |
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. = |
====================================================================== |
517,6 → 549,9 |
* Есть парная функция получения точки с фонового изображения - |
подфункция 2 функции 39. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_PIXEL_BG (2) |
====================================================================== |
============ Функция 15, подфункция 3 - перерисовать фон. ============ |
====================================================================== |
526,6 → 561,9 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_REDRAW_BG (3) |
====================================================================== |
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ==== |
====================================================================== |
543,6 → 581,9 |
* Есть парная команда получения режима отрисовки фона - |
подфункция 4 функции 39. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_MODE_BG (4) |
====================================================================== |
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. ===== |
====================================================================== |
563,6 → 604,9 |
* Для обновления экрана (после завершения серии команд, работающих с |
фоном) вызывайте подфункцию 3 перерисовки фона. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_IMAGE_BG (5) |
====================================================================== |
====================== Функция 15, подфункция 6 ====================== |
==== Спроецировать данные фона на адресное пространство процесса. ==== |
580,6 → 624,9 |
* Пиксели фонового изображения записываются последовательно |
слева направо, сверху вниз. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_MAP_BG (6) |
====================================================================== |
====================== Функция 15, подфункция 7 ====================== |
=== Закрыть проекцию данных фона на адресное пространство процесса. == |
591,6 → 638,9 |
Возвращаемое значение: |
* eax = 1 при успехе, 0 при ошибке |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_UNMAP_BG (7) |
====================================================================== |
====================== Функция 15, подфункция 8 ====================== |
=========== Получить координаты последней отрисовки фона. ============ |
608,6 → 658,9 |
функцию сразу после получения события: |
5 = завершилась перерисовка фона рабочего стола |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_LAST_DRAW (8) |
====================================================================== |
====================== Функция 15, подфункция 9 ====================== |
=============== Перерисовать прямоугольную часть фона. =============== |
624,6 → 677,9 |
(right,bottom) - координаты правого нижнего. |
* Если параметры установлены некорректно - фон не перерисовывается. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_REDRAW_RECT (9) |
====================================================================== |
============= Функция 16 - сохранить рамдиск на дискету. ============= |
====================================================================== |
634,6 → 690,8 |
* eax = 0 - успешно |
* eax = 1 - ошибка |
---------------------- Константы для регистров: ---------------------- |
eax - SF_RD_TO_FLOPPY (16) |
====================================================================== |
============== Функция 17 - получить код нажатой кнопки. ============= |
====================================================================== |
658,6 → 716,9 |
в формате подфункции 2 функции 37 в момент начала нажатия |
на кнопку, за исключением младшего бита (соответствующего левой |
кнопке мыши), который сбрасывается. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_BUTTON (17) |
====================================================================== |
= Функция 18, подфункция 1 - сделать самым нижним окно потока. ======= |
====================================================================== |
668,6 → 729,9 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_UNFOCUS_WINDOW (1) |
====================================================================== |
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ==== |
====================================================================== |
683,6 → 747,9 |
* Смотри также подфункцию 18 - завершение |
процесса/потока с заданным идентификатором. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_TERMINATE_THREAD (2) |
====================================================================== |
= Функция 18, подфункция 3 - сделать активным окно заданного потока. = |
====================================================================== |
697,6 → 764,9 |
какое-то окно. |
* Узнать, какое окно является активным, можно вызовом подфункции 7. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_FOCUS_WINDOW (3) |
====================================================================== |
Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. |
====================================================================== |
709,6 → 779,9 |
Возвращаемое значение: |
* eax = значение счётчика пустых тактов в секунду |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_IDLE_COUNT (4) |
====================================================================== |
======== Функция 18, подфункция 5 - получить тактовую частоту. ======= |
====================================================================== |
718,6 → 791,9 |
Возвращаемое значение: |
* eax = тактовая частота (по модулю 2^32 тактов = 4ГГц) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_CPU_REQUENCY (5) |
====================================================================== |
Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. |
====================================================================== |
733,6 → 809,9 |
* Все папки в указанном пути должны существовать, иначе вернётся |
значение 5, "файл не найден". |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_RD_TO_HDD (6) |
====================================================================== |
====== Функция 18, подфункция 7 - получить номер активного окна. ===== |
====================================================================== |
747,6 → 826,9 |
сообщения обо всём вводе с клавиатуры. |
* Сделать окно активным можно вызовом подфункции 3. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_ACTIVE_WINDOW (7) |
====================================================================== |
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ==== |
====================================================================== |
770,6 → 852,10 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SPEAKER (8) |
ecx - SSSF_GET_STATE (1), SSSF_TOGGLE (2) |
====================================================================== |
= Функция 18, подфункция 9 - завершение работы системы с параметром. = |
====================================================================== |
787,6 → 873,9 |
* Не следует полагаться на возвращаемое значение при неверном |
вызове, оно может измениться в последующих версиях ядра. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SHUTDOWN (9) |
====================================================================== |
========= Функция 18, подфункция 10 - свернуть активное окно. ======== |
====================================================================== |
807,6 → 896,9 |
функцией 0, для окон без скина её можно определить функцией 8), |
восстановление - приложением @taskbar. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MINIMIZE_WINDOW (10) |
====================================================================== |
====================== Функция 18, подфункция 11 ===================== |
============= Получить информацию о дисковой подсистеме. ============= |
874,6 → 966,9 |
* Таблица может быть использована для получения информации |
об имеющихся устройствах. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_INFO_DISC_SYS (11) |
====================================================================== |
========== Функция 18, подфункция 13 - получить версию ядра. ========= |
====================================================================== |
893,6 → 988,9 |
db 0 |
dd 1675 |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_KERNEL_VERSION (13) |
====================================================================== |
====================== Функция 18, подфункция 14 ===================== |
======= Ожидать начала обратного хода луча развёртки монитора. ======= |
907,6 → 1005,9 |
высокопроизводительных графических приложений; используется для |
плавного вывода графики. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_WAIT_RETRACE (14) |
====================================================================== |
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. = |
====================================================================== |
916,6 → 1017,9 |
Возвращаемое значение: |
* eax = 0 как признак успеха |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_CURSOR_CENTER (15) |
====================================================================== |
====================== Функция 18, подфункция 16 ===================== |
============ Получить размер свободной оперативной памяти. =========== |
926,6 → 1030,9 |
Возвращаемое значение: |
* eax = размер свободной памяти в килобайтах |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_FREE_RAM (16) |
====================================================================== |
====================== Функция 18, подфункция 17 ===================== |
============ Получить размер имеющейся оперативной памяти. =========== |
936,6 → 1043,9 |
Возвращаемое значение: |
* eax = общий размер имеющейся памяти в килобайтах |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_TOTAL_RAM (17) |
====================================================================== |
====================== Функция 18, подфункция 18 ===================== |
============= Завершить процесс/поток по идентификатору. ============= |
953,6 → 1063,9 |
* Смотри также подфункцию 2 - завершение |
процесса/потока по заданному слоту. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_TERMINATE_THREAD_ID (18) |
====================================================================== |
=== Функция 18, подфункция 19 - получить/установить настройки мыши. == |
====================================================================== |
1036,6 → 1149,12 |
Замечание: настройки мыши можно регулировать в приложении mouse_cfg. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MOUSE_SETTINGS (19) |
ecx - SSSF_GET_SPEED (0), SSSF_SET_SPEED (1), SSSF_GET_SPEEDUP (2), |
SSSF_SET_SPEEDUP (3), SSSF_SET_POS (4), SSSF_SET_BUTTON (5), |
SSSF_GET_DOUBLE_CLICK_DELAY (6), SSSF_SET_DOUBLE_CLICK_DELAY (7) |
====================================================================== |
====================== Функция 18, подфункция 20 ===================== |
============= Получить информацию об оперативной памяти. ============= |
1061,6 → 1180,9 |
* +32: dword: размер наибольшего выделенного блока в куче ядра |
(зарезервировано) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_RAM_INFO (20) |
====================================================================== |
====================== Функция 18, подфункция 21 ===================== |
======= Получить номер слота процесса/потока по идентификатору. ====== |
1073,6 → 1195,9 |
* eax = 0 - ошибка (неверный идентификатор) |
* иначе eax = номер слота |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_THREAD_SLOT (21) |
====================================================================== |
Функция 18, подфункция 22 - операции с окном другого процесса/потока. |
====================================================================== |
1093,6 → 1218,11 |
* Восстановление окна с одновременной активизацией осуществляется |
подфункции 3 (принимающей номер слота). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_FOREIGN_WINDOW (22) |
ecx - SSSF_MINIMIZE (0), SSSF_MINIMIZE_ID (1), SSSF_RESTORE (2), |
SSSF_RESTORE_ID (3) |
====================================================================== |
======= Функция 18, подфункция 23 - минимизировать все окна. ========= |
====================================================================== |
1105,6 → 1235,9 |
Замечания: |
* Окна спец. потоков (имя начинается с символа @) не сворачиваются. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MINIMIZE_ALL (23) |
====================================================================== |
===== Функция 18, подфункция 24 - установить пределы отрисовки. ====== |
====================================================================== |
1121,6 → 1254,9 |
* Размеры указываемые в функции не должны превышать размеры текущего |
видеорежима, иначе функция ничего не изменит. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SET_SCREEN_LIMITS (24) |
====================================================================== |
===================== Функция 18, подфункция 25 ====================== |
======== Управление положением окна относительно других окон. ======== |
1152,6 → 1288,10 |
ZPOS_NORMAL = 0 - обычное |
ZPOS_ALWAYS_TOP = 1 - поверх всех окон |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_WINDOW_BEHAVIOR (25) |
ecx - SSSF_GET_WB (1), SSSF_SET_WB (2) |
====================================================================== |
==================== Функция 20 - интерфейс MIDI. ==================== |
====================================================================== |
1173,6 → 1313,9 |
* Предварительно должен быть определён базовый порт вызовом |
подфункции 1 функции 21. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_MIDI (20) |
ebx - SSF_RESET (1), SSF_OUTPUT (2) |
====================================================================== |
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ==== |
====================================================================== |
1189,6 → 1332,9 |
* Получить установленный базовый порт можно вызовом |
подфункции 1 функции 26. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_MPU_MIDI_BASE (1) |
====================================================================== |
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ==== |
====================================================================== |
1223,6 → 1369,9 |
соответствующую текущей стране иконку. |
* Приложение @taskbar переключает раскладки по запросу пользователя. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_KEYBOARD_LAYOUT (2) |
====================================================================== |
========= Функция 21, подфункция 5 - установить язык системы. ======== |
====================================================================== |
1240,6 → 1389,9 |
переменную не использует. |
* Получить язык системы можно вызовом подфункции 5 функции 26. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_SYS_LANG (5) |
====================================================================== |
====================== Функция 21, подфункция 11 ===================== |
=========== Разрешить/запретить низкоуровневый доступ к HD. ========== |
1255,6 → 1407,9 |
* Текущая реализация использует только младший бит ecx. |
* Получить текущее состояние можно вызовом подфункции 11 функции 26. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_ACCESS_HD_LBA (11) |
====================================================================== |
====================== Функция 21, подфункция 12 ===================== |
========== Разрешить/запретить низкоуровневый доступ к PCI. ========== |
1270,6 → 1425,9 |
* Текущая реализация использует только младший бит ecx. |
* Получить текущее состояние можно вызовом подфункции 12 функции 26. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_ACCESS_PCI (12) |
====================================================================== |
============ Функция 22 - установить системную дату/время. =========== |
====================================================================== |
1309,6 → 1467,8 |
автоматически отменяет предыдущую установку. Впрочем, на данный |
момент ни одна программа его не использует. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SET_TIME_DATE (22) |
====================================================================== |
============== Функция 23 - ожидать события с таймаутом. ============= |
====================================================================== |
1332,6 → 1492,8 |
с eax=0, если сложение ebx с текущим значением счётчика времени |
вызовет 32-битное переполнение. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_WAIT_EVENT_TIMEOUT (23) |
====================================================================== |
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ====== |
====================================================================== |
1352,6 → 1514,9 |
устройства. |
* Примером использования функции является приложение CD_tray. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CD (24) |
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5) |
====================================================================== |
====== Функция 24, подфункция 5 - загрузить лоток привода диска. ===== |
====================================================================== |
1368,6 → 1533,9 |
* Функция поддерживается только для ATAPI-устройств (CD и DVD). |
* Примером использования функции является приложение CD_tray. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CD (24) |
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5) |
====================================================================== |
========== Функция 25 - записать область на слой фона. =============== |
====================================================================== |
1388,6 → 1556,8 |
* Функция размещает изображение не на фоновое изображение (ф.15), |
а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SCREEN_PUT_IMAGE (25) |
====================================================================== |
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. ===== |
====================================================================== |
1400,6 → 1570,9 |
* Установить базовый порт можно вызовом |
подфункции 1 функции 21. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_MPU_MIDI_BASE (1) |
====================================================================== |
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. ===== |
====================================================================== |
1438,6 → 1611,9 |
(используя описываемую функцию). |
* Приложение @taskbar переключает раскладки по запросу пользователя. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_KEYBOARD_LAYOUT (2) |
====================================================================== |
========== Функция 26, подфункция 5 - получить язык системы. ========= |
====================================================================== |
1452,6 → 1628,9 |
соответствующую иконку (используя описываемую функцию). |
* Установить язык системы можно вызовом подфункции 5 функции 21. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_SYS_LANG (5) |
====================================================================== |
=== Функция 26, подфункция 9 - получить значение счётчика времени. === |
====================================================================== |
1466,6 → 1645,9 |
497 суток. |
* Системное время можно получить функцией 3. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_TIME_COUNT (9) |
====================================================================== |
===================== Функция 26, подфункция 10 ====================== |
========== Получить значение высокоточного счётчика времени. ========= |
1482,6 → 1664,9 |
счётчик PIT. В этом случае точность будет уменьшена до 10 000 000 |
наносекунд. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_TIME_COUNT_PRO (10) |
====================================================================== |
====================== Функция 26, подфункция 11 ===================== |
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ========== |
1496,6 → 1681,9 |
* Установить текущее состояние можно вызовом |
подфункции 11 функции 21. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_ACCESS_HD_LBA (11) |
====================================================================== |
====================== Функция 26, подфункция 12 ===================== |
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ========== |
1511,6 → 1699,9 |
* Установить текущее состояние можно вызовом |
подфункции 12 функции 21. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_ACCESS_PCI (12) |
====================================================================== |
================ Функция 29 - получить системную дату. =============== |
====================================================================== |
1525,6 → 1716,8 |
Замечания: |
* Системную дату можно установить функцией 22. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_SYS_DATE (29) |
====================================================================== |
================ Функция 30 - работа с текущей папкой. =============== |
====================================================================== |
1570,6 → 1763,9 |
Замечания: |
* Функция может быть вызвана только 1 раз за 1 сессию работы ОС. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CURRENT_FOLDER (30) |
ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3) |
====================================================================== |
========= Функция 34 - узнать кому принадлежит точка экрана. ========= |
====================================================================== |
1583,6 → 1779,8 |
При некорректных значениях ebx и ecx функция возвращает 0 |
* Функция берет значения из области [_WinMapAddress] |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_PIXEL_OWNER (34) |
====================================================================== |
============ Функция 35 - прочитать цвет точки на экране. ============ |
====================================================================== |
1600,6 → 1798,8 |
функций) через селектор gs. Параметры текущего видеорежима |
можно получить функцией 61. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_PIXEL (35) |
====================================================================== |
=============== Функция 36 - прочитать область экрана. =============== |
====================================================================== |
1616,6 → 1816,8 |
области относительно экрана. |
* Размер изображения в байтах есть 3*xsize*ysize. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_IMAGE (36) |
====================================================================== |
==================== Функция 37 - работа с мышью. ==================== |
====================================================================== |
1738,6 → 1940,11 |
* После прочтения значения обнуляются. |
* Данные имеют знаковые значения. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_MOUSE_GET (37) |
ebx - SSF_SCREEN_POSITION (0), SSF_WINDOW_POSITION (1), |
SSF_BUTTON (2), SSF_BUTTON_EXT (3), SSF_LOAD_CURSOR (4), |
SSF_SET_CURSOR (5), SSF_DEL_CURSOR (6), SSF_SCROLL_DATA (7) |
====================================================================== |
================== Функция 38 - нарисовать отрезок. ================== |
====================================================================== |
1756,6 → 1963,8 |
* Координаты берутся относительно окна. |
* Конечная точка также рисуется. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DRAW_LINE (38) |
====================================================================== |
== Функция 39, подфункция 1 - получить размер фонового изображения. == |
====================================================================== |
1769,6 → 1978,8 |
подфункция 1 функции 15. После которой, разумеется, следует |
заново определить само изображение. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. = |
====================================================================== |
1787,6 → 1998,8 |
* Есть парная функция установки точки на фоновом изображении - |
подфункция 2 функции 15. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
====== Функция 39, подфункция 4 - получить режим отрисовки фона. ===== |
====================================================================== |
1800,6 → 2013,8 |
* Есть парная функция установки режима отрисовки фона - |
подфункция 4 функции 15. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
======== Функция 40 - установить маску для ожидаемых событий. ======== |
====================================================================== |
1828,7 → 2043,8 |
* Функции работы с событиями учитывают маску на момент |
вызова функции, а не на момент поступления сообщения. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SET_EVENTS_MASK (40) |
====================================================================== |
=================== Функция 43 - ввод/вывод в порт. ================== |
====================================================================== |
1858,7 → 2074,8 |
быстрее и несколько короче и проще. Из незарезервированных |
портов читать всё равно нельзя. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PORT_IN_OUT (43) |
====================================================================== |
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода. |
====================================================================== |
1893,6 → 2110,8 |
* При завершении потока автоматически освобождаются все |
зарезервированные им порты. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SET_PORTS (46) |
====================================================================== |
================= Функция 47 - вывести число в окно. ================= |
====================================================================== |
1927,6 → 2146,8 |
таким количеством цифр, "лишние" ведущие цифры обрезаются. |
* Параметры шрифтов указаны в описании функции 4 (вывода текста). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DRAW_NUMBER (47) |
====================================================================== |
======= Функция 48, подфункция 0 - применить настройки экрана. ======= |
====================================================================== |
1943,6 → 2164,9 |
игнорируется. |
* Вызов функции с ненулевым ecx игнорируется. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_APPLY (0) |
====================================================================== |
========= Функция 48, подфункция 1 - установить стиль кнопок. ======== |
====================================================================== |
1959,6 → 2183,9 |
подфункцией 0. |
* Тип кнопок влияет только на их прорисовку функцией 8. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_BUTTON_STYLE (1) |
====================================================================== |
==== Функция 48, подфункция 2 - установить стандартные цвета окон. === |
====================================================================== |
1982,6 → 2209,9 |
* Таблицу цветов можно просматривать/изменять интерактивно с помощью |
приложения desktop. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_COLORS (2) |
====================================================================== |
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ==== |
====================================================================== |
2026,6 → 2256,9 |
* Стандартные цвета можно просматривать/изменять интерактивно |
с помощью приложения desktop. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_COLORS (3) |
====================================================================== |
========== Функция 48, подфункция 4 - получить высоту скина. ========= |
====================================================================== |
2039,6 → 2272,9 |
использующих скин. |
* Смотри также общую структуру окна в описании функции 0. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SKIN_HEIGHT (4) |
====================================================================== |
===== Функция 48, подфункция 5 - получить рабочую область экрана. ==== |
====================================================================== |
2061,6 → 2297,9 |
позволяющую определить размеры всего экрана. |
* Есть парная функция установки рабочей области - подфункция 6. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SCREEN_AREA (5) |
====================================================================== |
==== Функция 48, подфункция 6 - установить рабочую область экрана. === |
====================================================================== |
2092,6 → 2331,9 |
обновляет координаты и размеры максимизированных окон. |
Все окна извещаются о необходимости перерисовки (событие 1). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_SCREEN_AREA (6) |
====================================================================== |
====================== Функция 48, подфункция 7 ====================== |
============ Получить область скина для текста заголовка. ============ |
2112,6 → 2354,9 |
какого-нибудь заменителя текста заголовка |
(по усмотрению приложения). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SKIN_MARGINS (7) |
====================================================================== |
==== Функция 48, подфункция 8 - установить используемый скин окон. === |
====================================================================== |
2131,6 → 2376,9 |
* Пользователь может изменять скин статически, создав свой |
default.skn, или динамически с помощью приложения desktop. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_SKIN (8) |
====================================================================== |
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. = |
====================================================================== |
2140,6 → 2388,9 |
Возвращаемое значение: |
* eax = 2 - субпиксельное, 1 - обычное, 0 - выключить |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_FONT_SMOOTH (9) |
====================================================================== |
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. ===== |
====================================================================== |
2148,6 → 2399,9 |
* ebx = 10 - номер подфункции |
* cl = 2 - субпиксельное, 1 - обычное, 0 - выключить |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_FONT_SMOOTH (10) |
====================================================================== |
======== Функция 48, подфункция 11 - получить размер шрифтов. ======== |
====================================================================== |
2157,6 → 2411,9 |
Возвращаемое значение: |
* eax = текущая высота шрифта в пикселях |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_FONT_SIZE (11) |
====================================================================== |
======= Функция 48, подфункция 12 - установить размер шрифтов. ======= |
====================================================================== |
2165,6 → 2422,9 |
* ebx = 10 - номер подфункции |
* cl = новая высота шрифта в пикселях |
---------------------- Константы для регистров: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_FONT_SIZE (12) |
====================================================================== |
============ Функция 49 - Advanced Power Management (APM). =========== |
====================================================================== |
2186,6 → 2446,8 |
(http://www.pobox.com/~ralf/files.html, |
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_APM (49) |
====================================================================== |
================= Функция 50 - установка формы окна. ================= |
====================================================================== |
2231,6 → 2493,8 |
* Вызов подфункции 0 с нулевым указателем приводит к возврату |
к прямоугольной форме. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SET_WINDOW_SHAPE (50) |
====================================================================== |
===================== Функция 51 - создать поток. ==================== |
====================================================================== |
2243,6 → 2507,8 |
* eax = -1 - ошибка (в системе слишком много потоков) |
* иначе eax = TID - идентификатор потока |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CREATE_THREAD (51) |
====================================================================== |
====================== Функция 54, подфункция 0 ====================== |
============== Узнать количество слотов в буфере обмена. ============= |
2254,6 → 2520,9 |
* eax = количество слотов в буфере |
* eax = -1 - отсутствует область главного списка |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_GET_SLOT_COUNT (0) |
====================================================================== |
====================== Функция 54, подфункция 1 ====================== |
================== Считать данные из буфера обмена. ================== |
2267,6 → 2536,9 |
* eax = 1 - ошибка |
* eax = -1 - отсутствует область главного списка |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_READ_CB (1) |
====================================================================== |
====================== Функция 54, подфункция 2 ====================== |
================== Записать данные в буфер обмена. =================== |
2281,6 → 2553,9 |
* eax = 1 - ошибка |
* eax = -1 - отсутствует область главного списка |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_WRITE_CB (2) |
====================================================================== |
====================== Функция 54, подфункция 3 ====================== |
========= Удалить последний слот с данными в буфере обмена =========== |
2293,6 → 2568,9 |
* eax = 1 - ошибка |
* eax = -1 - отсутствует область главного списка |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_DEL_SLOT (3) |
====================================================================== |
====================== Функция 54, подфункция 4 ====================== |
=================== Аварийный сброс блокировки буфера ================ |
2307,6 → 2585,9 |
* Используется в исключительных случаях, когда зависшее или убитое |
приложение заблокировало работу с буфером обмена. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_UNLOCK_BUFFER (4) |
====================================================================== |
====================== Функция 55, подфункция 55 ===================== |
========== Начать проигрывать данные на встроенном спикере. ========== |
2340,6 → 2621,8 |
* Данные должны сохраняться в памяти по крайней мере |
до конца проигрывания. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SPEAKER_PLAY (55) |
====================================================================== |
======================= Функция 57 - PCI BIOS. ======================= |
====================================================================== |
2358,6 → 2641,8 |
* Если BIOS не поддерживает это расширение, поведение функции |
эмулируется (через аналоги подфункций функции 62 режима ядра). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI_BIOS (57) |
====================================================================== |
=========== Функция 60 - Inter Process Communication (IPC). ========== |
====================================================================== |
2409,6 → 2694,9 |
* Система сразу после записи IPC-сообщения в буфер посылает |
потоку-приёмнику событие с кодом 7 (см. коды событий). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_IPC (60) |
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2) |
====================================================================== |
=== Функция 61 - получить параметры для прямого доступа к графике. === |
====================================================================== |
2471,6 → 2759,10 |
* eax = число байт, которое занимает одна строка развёртки |
(горизонтальная линия на экране) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_GET_GRAPHICAL_PARAMS (61) |
ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2), |
SSF_BYTES_PER_LINE (3) |
====================================================================== |
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. ===== |
====================================================================== |
2486,6 → 2778,9 |
для приложений подфункцией 12 функции 21. |
* Если PCI BIOS не поддерживается, то значение ax неопределено. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_VERSION (0) |
====================================================================== |
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. === |
====================================================================== |
2500,6 → 2795,9 |
для приложений подфункцией 12 функции 21. |
* Если PCI BIOS не поддерживается, то значение al неопределено. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_LAST_BUS (1) |
====================================================================== |
====================== Функция 62, подфункция 2 ====================== |
== Получить механизм обращения к конфигурационному пространству PCI. = |
2518,6 → 2816,9 |
* Подфункции чтения и записи автоматически работают |
с выбранным механизмом. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_ADRR_MODE (2) |
====================================================================== |
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. ======= |
====================================================================== |
2549,6 → 2850,9 |
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/); |
список вторых должен быть указан в документации по устройству. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6) |
====================================================================== |
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ====== |
====================================================================== |
2579,6 → 2883,9 |
входит, например, в известный Interrupt List by Ralf Brown; |
список вторых должен быть указан в документации по устройству. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10) |
====================================================================== |
================ Функция 63 - работа с доской отладки. =============== |
====================================================================== |
2625,6 → 2932,9 |
* eax = ebx = 0 - буфер пуст |
* eax = байт, ebx = 1 - байт успешно прочитан |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BOARD (63) |
ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2) |
====================================================================== |
========== Функция 64 - перераспределить память приложения. ========== |
====================================================================== |
2642,6 → 2952,8 |
Вызов функции будет игнорироваться, если приложение создаст |
локальную кучу вызовом 68.11. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_MEMORY_RESIZE (64) |
====================================================================== |
========= Функция 65 - вывести изображение с палитрой в окно. ======== |
====================================================================== |
2690,6 → 3002,8 |
* Вызов функции 7 эквивалентен вызову этой функции с параметрами |
esi=24, ebp=0. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_PUT_IMAGE_EXT (65) |
====================================================================== |
================= Функция 66 - работа с клавиатурой. ================= |
====================================================================== |
2799,6 → 3113,11 |
* Разблокирование результатов ф. 66.6 |
* Для эмуляции мыши через клавиатуру, приложение MOUSEMUL |
---------------------- Константы для регистров: ---------------------- |
eax - SF_KEYBOARD (66) |
ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2), |
SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4), |
SSF_DEL_SYS_HOTKEY (5), SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7) |
====================================================================== |
============ Функция 67 - изменить положение/размеры окна. =========== |
====================================================================== |
2823,6 → 3142,8 |
получены вызовом функции 9. |
* Функция посылает окну событие перерисовки (с кодом 1). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_CHANGE_WINDOW (67) |
====================================================================== |
=== Функция 68, подфункция 0 - получить счётчик переключений задач. == |
====================================================================== |
2833,6 → 3154,9 |
* eax = число переключений задач с момента загрузки системы |
(по модулю 2^32) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_GET_TASK_SWITCH_COUNT (0) |
====================================================================== |
====================== Функция 68, подфункция 1 ====================== |
============ Переключиться на следующий поток выполнения. ============ |
2848,6 → 3172,9 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SWITCH_TASK (1) |
====================================================================== |
=============== Функция 68, подфункция 2 - кэш + rdpmc. ============== |
====================================================================== |
2870,6 → 3197,11 |
* для ecx=2 и ecx=3: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_PERFORMANCE (2) |
ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1), |
SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3) |
====================================================================== |
========== Функция 68, подфункция 3 - прочитать MSR-регистр. ========= |
====================================================================== |
2891,6 → 3223,9 |
командой cpuid. Иначе возникнет уже другое исключение в ядре, |
которое всё равно прибьёт поток. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_READ_MSR (3) |
====================================================================== |
========= Функция 68, подфункция 4 - записать в MSR-регистр. ========= |
====================================================================== |
2913,6 → 3248,9 |
командой cpuid. Иначе возникнет уже другое исключение в ядре, |
которое всё равно прибьёт поток. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_WRITE_MSR (4) |
====================================================================== |
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ==== |
====================================================================== |
2930,6 → 3268,9 |
размер существующей кучи. |
* После создания кучи вызовы функции 64 игнорируются. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_HEAP_INIT (11) |
====================================================================== |
========== Функция 68, подфункция 12 - выделить блок памяти. ========= |
====================================================================== |
2945,6 → 3286,9 |
* Функция выделяет целое число страниц (4 Кб) так, что фактический |
размер выделенного блока больше или равен запрошенному. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_ALLOC (12) |
====================================================================== |
========= Функция 68, подфункция 13 - освободить блок памяти. ======== |
====================================================================== |
2959,6 → 3303,9 |
* Блок памяти должен быть ранее выделен подфункцией 12 |
или подфункцией 20. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_FREE (13) |
====================================================================== |
====================== Функция 68, подфункция 14 ===================== |
====== Ожидать получения сигнала от других приложений/драйверов. ===== |
2974,6 → 3321,9 |
* +4: данные принятого сигнала (20 байт), формат которых |
определяется первым dword-ом |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_WAIT_SIGNAL (14) |
====================================================================== |
=========== Функция 68, подфункция 16 - загрузить драйвер. =========== |
====================================================================== |
2992,6 → 3342,9 |
нулевой символ, остальные символы игнорируются. |
* Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DRIVER (16) |
====================================================================== |
========== Функция 68, подфункция 17 - управление драйвером. ========= |
====================================================================== |
3012,6 → 3365,9 |
определяются драйвером. |
* Предварительно должен быть получен хэндл драйвера подфункцией 16. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_CONTROL_DRIVER (17) |
====================================================================== |
============= Функция 68, подфункция 19 - загрузить DLL. ============= |
====================================================================== |
3027,6 → 3383,9 |
заканчивающийся нулём. Первый dword в структуре является |
указателем на имя функции, второй содержит адрес функции. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DLL (19) |
====================================================================== |
====== Функция 68, подфункция 20 - перераспределить блок памяти. ===== |
====================================================================== |
3051,6 → 3410,9 |
* Содержимое памяти вплоть до наименьшего из старого и нового |
размеров сохраняется. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_REALLOC (20) |
====================================================================== |
========= Функция 68, подфункция 21 - загрузить драйвер PE. ========== |
====================================================================== |
3066,6 → 3428,9 |
* Если драйвер ещё не загружен, он загружается; |
если драйвер уже загружен, ничего не меняется. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DRIVER_PE (21) |
====================================================================== |
=== Функция 68, подфункция 22 - открыть именованную область памяти. == |
====================================================================== |
3105,6 → 3470,9 |
с кодом ошибки E_ACCESS. |
* Процесс, создавший область, всегда имеет доступ на запись. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_OPEN (22) |
====================================================================== |
=== Функция 68, подфункция 23 - закрыть именованную область памяти. == |
====================================================================== |
3121,6 → 3489,9 |
* При завершении потока освобождаются все открытые им |
области памяти. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_CLOSE (23) |
====================================================================== |
==== Функция 68, подфункция 24 - установить обработчик исключений. === |
====================================================================== |
3151,6 → 3522,9 |
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также |
возлагается на обработчик пользователя. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SET_EXCEPTION_HANDLER (24) |
====================================================================== |
= Функция 68, подфункция 25 - изменить состояние активности сигнала. = |
====================================================================== |
3167,6 → 3541,9 |
обработчика исключений, установленного подфункцией 24. При этом |
номер сигнала соответствует номеру исключения. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SET_EXCEPTION_STATE (25) |
====================================================================== |
= Функция 68, подфункция 26 - освободить страницы памяти ============ |
====================================================================== |
3180,6 → 3557,9 |
* функция освобождает страницы с ecx+edx по ecx+edx+esi |
и устанавливает виртуальную память в зарезервированное состояние. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_FREE_EXT (26) |
====================================================================== |
= Функция 68, подфункция 27 - загрузить файл =================== |
====================================================================== |
3193,6 → 3573,9 |
Примечания: |
* функция загружает и, при необходимости, распаковывает файл (kunpack) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_FILE (27) |
====================================================================== |
======================== Функция 69 - отладка. ======================= |
====================================================================== |
3241,6 → 3624,12 |
* подфункция 8 - завершить отлаживаемый поток |
* подфункция 9 - установить/снять аппаратную точку останова |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1), |
SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4), |
SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7), |
SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9) |
====================================================================== |
====================== Функция 69, подфункция 0 ====================== |
========= Определить область данных для отладочных сообщений. ======== |
3264,6 → 3653,9 |
* Данные в буфере трактуются как массив элементов переменной длины - |
сообщений. Формат сообщения указан в общем описании. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_MESSAGE_AREA (0) |
====================================================================== |
====================== Функция 69, подфункция 1 ====================== |
========= Получить состояние регистров отлаживаемого потока. ========= |
3293,6 → 3685,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_GET_REGISTERS (1) |
====================================================================== |
====================== Функция 69, подфункция 2 ====================== |
======== Установить состояние регистров отлаживаемого потока. ======== |
3312,6 → 3707,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_REGISTERS (2) |
====================================================================== |
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. = |
====================================================================== |
3324,6 → 3722,9 |
Замечания: |
* Если процесс был приостановлен, он возобновляет выполнение. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_DETACH (3) |
====================================================================== |
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ==== |
====================================================================== |
3337,6 → 3738,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SUSPEND (4) |
====================================================================== |
====================== Функция 69, подфункция 5 ====================== |
============ Возобновить выполнение отлаживаемого потока. ============ |
3351,6 → 3755,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_RESUME (5) |
====================================================================== |
====================== Функция 69, подфункция 6 ====================== |
============= Прочитать из памяти отлаживаемого процесса. ============ |
3370,6 → 3777,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_READ_MEMORY (6) |
====================================================================== |
Функция 69, подфункция 7 - записать в память отлаживаемого процесса. |
====================================================================== |
3388,6 → 3798,9 |
* Процесс должен быть загружен для отладки (как указано в |
общем описании). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_WRITE_MEMORY (7) |
====================================================================== |
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ====== |
====================================================================== |
3404,6 → 3817,9 |
требуется выполнение первого замечания и принимается PID, |
а не номер слота. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_TERMINATE (8) |
====================================================================== |
====================== Функция 69, подфункция 9 ====================== |
============= Установить/снять аппаратную точку останова. ============ |
3447,6 → 3863,9 |
* Точка останова на запись и чтение/запись срабатывает после |
выполнения вызвавшей её инструкции. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_DEFINE_BREAKPOINT (9) |
====================================================================== |
= Функция 70 - работа с файловой системой с поддержкой длинных имён. = |
====================================================================== |
3517,6 → 3936,12 |
Разблокировка осуществляется при обращении подфункции 4 функции 24 |
к соответствующему устройству. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2), |
SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5), |
SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8), |
SSF_CREATE_FOLDER (9) |
====================================================================== |
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. = |
====================================================================== |
3545,6 → 3970,9 |
* Функция не позволяет читать папки |
(вернётся eax=10, access denied). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FILE (0) |
====================================================================== |
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. = |
====================================================================== |
3644,6 → 4072,9 |
0x10, а времена и даты обнулены. Альтернативный способ получения |
информации об оборудовании - подфункция 11 функции 18. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FOLDER (1) |
====================================================================== |
====================== Функция 70, подфункция 2 ====================== |
======== Создание/перезапись файла с поддержкой длинных имён. ======== |
3672,6 → 4103,9 |
сколько сможет, после чего вернёт код ошибки 8. |
* Функция не поддерживается для CD (вернётся код ошибки 2). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_CREATE_FILE (2) |
====================================================================== |
====================== Функция 70, подфункция 3 ====================== |
======== Запись в существующий файл с поддержкой длинных имён. ======= |
3702,6 → 4136,9 |
необходимого размера нулевыми символами. |
* Функция не поддерживается для CD (вернётся код ошибки 2). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_WRITE_FILE (3) |
====================================================================== |
========= Функция 70, подфункция 4 - установка размера файла. ======== |
====================================================================== |
3733,6 → 4170,9 |
код ошибки 8. |
* Функция не поддерживается для CD (вернётся код ошибки 2). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_SET_END (4) |
====================================================================== |
=== Функция 70, подфункция 5 - получение информации о файле/папке. === |
====================================================================== |
3762,6 → 4202,9 |
* Функция не поддерживает виртуальные папки типа /, /rd и |
корневые папки типа /rd/1. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_GET_INFO (5) |
====================================================================== |
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ==== |
====================================================================== |
3792,6 → 4235,9 |
корневые папки типа /rd/1. |
* Функция не поддерживается для CD (вернётся код ошибки 2). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_SET_INFO (6) |
====================================================================== |
============ Функция 70, подфункция 7 - запуск программы. ============ |
====================================================================== |
3825,6 → 4271,9 |
в замороженном состоянии; для запуска используйте |
подфункцию 5 функции 69. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_START_APP (7) |
====================================================================== |
========== Функция 70, подфункция 8 - удаление файла/папки. ========== |
====================================================================== |
3850,6 → 4299,9 |
* Можно удалять только пустые папки (попытка удаления непустой папки |
приведёт к ошибке с кодом 10, "доступ запрещён"). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_DELETE (8) |
====================================================================== |
============= Функция 70, подфункция 9 - создание папки. ============= |
====================================================================== |
3875,6 → 4327,9 |
* Родительская папка должна уже существовать. |
* Если папка уже существует, функция завершится успешно (eax=0). |
---------------------- Константы для регистров: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_CREATE_FOLDER (9) |
====================================================================== |
=== Функция 71, подфункция 1 - установить заголовок окна программы. == |
====================================================================== |
3894,6 → 4349,8 |
иначе будет использоваться cp866. |
* Чтобы убрать заголовок, передайте NULL в ecx. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SET_CAPTION (71) |
====================================================================== |
================ Функция 72 - послать сообщение окну. ================ |
====================================================================== |
3908,6 → 4365,8 |
* eax = 0 - успешно |
* eax = 1 - буфер заполнен |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SEND_MESSAGE (72) |
====================================================================== |
===================== Функция 73 - blit bitmap ===================== |
====================================================================== |
3948,6 → 4407,8 |
Возвращаемое значение: |
* функция не возвращает значения |
---------------------- Константы для регистров: ---------------------- |
eax - SF_BLITTER (73) |
====================================================================== |
=================== Функция 74, подфункция -1 ======================== |
=========== Получить количество активных сетевых устройств. ========== |
3958,6 → 4419,9 |
Возвращаемое значение: |
* eax = количество активных сетевых устройств |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_COUNT (255) |
====================================================================== |
==== Функция 74, подфункция 0, Получить тип сетевого устройства. ===== |
====================================================================== |
3968,6 → 4432,9 |
Возвращаемое значение: |
* eax = тип устройства |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_TYPE (0) |
====================================================================== |
==== Функция 74, подфункция 1, Получить имя сетевого устройства. ===== |
====================================================================== |
3980,6 → 4447,9 |
* eax = -1 для ошибки |
* В случае успеха в буфер записывается имя сетевого устройства |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_NAME (1) |
====================================================================== |
======= Функция 74, подфункция 2, Сброс сетевого устройства. ========= |
====================================================================== |
3990,6 → 4460,9 |
Возвращаемое значение: |
* eax = -1 для ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RESET_DEVICE (2) |
====================================================================== |
====== Функция 74, подфункция 3, Остановить сетевое устройство. ====== |
====================================================================== |
4000,6 → 4473,9 |
Возвращаемое значение: |
* eax = -1 для ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_STOP_DEVICE (3) |
====================================================================== |
===== Функция 74, подфункция 4, Получить указатель на устройство ===== |
====================================================================== |
4010,6 → 4486,9 |
Возвращаемое значение: |
* eax = указатель, -1 для ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_POINER (4) |
====================================================================== |
=== Функция 74, подфункция 6, Получить количество посланых пакетов === |
====================================================================== |
4020,6 → 4499,9 |
Возвращаемое значение: |
* eax = количество с момента старта устройства, -1 для ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_TX_PACKET_COUNT (6) |
====================================================================== |
=== Функция 74, подфункция 7, Получить количество принятых пакетов === |
====================================================================== |
4030,6 → 4512,9 |
Возвращаемое значение: |
* eax = количество с момента старта устройства, -1 для ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RX_PACKET_COUNT (7) |
====================================================================== |
==== Функция 74, подфункция 8, Получить количество посланых байт. ==== |
====================================================================== |
4041,6 → 4526,9 |
* eax = количество с момента старта устройства, -1 для ошибки |
* ebx = старшая часть |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_TX_BYTE_COUNT (8) |
====================================================================== |
==== Функция 74, подфункция 9, Получить количество принятых байт. ==== |
====================================================================== |
4052,6 → 4540,9 |
* eax = количество с момента старта устройства, -1 для ошибки |
* ebx = старшая часть |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RX_BYTE_COUNT (9) |
====================================================================== |
======= Функция 74, подфункция 10, Получить статус соединения. ======= |
====================================================================== |
4070,6 → 4561,9 |
12 = 1 Гбит |
10b = флаг полного дуплекса |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_LINK_STATUS (10) |
====================================================================== |
======= Функция 75, подфункция 0, Open socket (Открыть сокет). ======= |
====================================================================== |
4083,6 → 4577,9 |
* eax = номер сокета, -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_OPEN (0) |
====================================================================== |
======= Функция 75, подфункция 1, Close socket (Закрыть сокет). ====== |
====================================================================== |
4094,6 → 4591,9 |
* eax = -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_CLOSE (1) |
====================================================================== |
============= Функция 75, подфункция 2, Bind (Привязка). ============= |
====================================================================== |
4107,6 → 4607,9 |
* eax = -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_BIND (2) |
====================================================================== |
============ Функция 75, подфункция 3, Listen (Слушать). ============= |
====================================================================== |
4119,6 → 4622,9 |
* eax = -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_LISTEN (3) |
====================================================================== |
========== Функция 75, подфункция 4, Connect (Соединение). =========== |
====================================================================== |
4132,6 → 4638,9 |
* eax = -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_CONNECT (4) |
====================================================================== |
=========== Функция 75, подфункция 5, Accept (Соглашение). =========== |
====================================================================== |
4145,6 → 4654,9 |
* eax = номер сокета из принятого сокета, -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_ACCEPT (5) |
====================================================================== |
============= Функция 75, подфункция 6, Send (Послать). ============== |
====================================================================== |
4159,6 → 4671,9 |
* eax = количество скопированных байтов, -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_SEND (6) |
====================================================================== |
============ Функция 75, подфункция 7, Receive (Получить). =========== |
====================================================================== |
4173,6 → 4688,9 |
* eax = количество скопированных байтов, -1 для ошибки |
* ebx = код ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_RECEIVE (7) |
====================================================================== |
= Функция 75, подфункция 8, Set socket options (Задать опции сокета) = |
====================================================================== |
4191,6 → 4709,9 |
dd optlength |
db options... |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_SET_OPTIONS (8) |
====================================================================== |
= Функция 75, подфункция 9, Get socket options(Получить опции сокета) |
====================================================================== |
4209,6 → 4730,9 |
dd optlength |
db options... |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_GET_OPTIONS (9) |
====================================================================== |
= Функция 75, подфункция 10, Get socketpair (Получить парный сокет). = |
====================================================================== |
4219,7 → 4743,59 |
* eax = socketnum1, -1 для ошибки |
* ebx = socketnum2, код ошибки в случае ошибки |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_GET_PAIR (10) |
====================================================================== |
=============== Функция 76, Сетевые опции и статистика. ============== |
====================================================================== |
Параметры: |
* eax = 76 - номер функции |
* верхняя часть ebx = номер протокола |
* bh = номер устройства |
* bl = номер подфункции |
Ethernet (0) |
0 - Read MAC |
IPv4 (1) |
0 - Read # IP packets sent |
1 - Read # IP packets received |
2 - Read IP |
3 - Write IP |
4 - Read DNS |
5 - Write DNS |
6 - Read subnet |
7 - Write subnet |
8 - Read gateway |
9 - Write gateway |
ICMP (2) |
0 - Read # ICMP packets sent |
1 - Read # ICMP packets received |
3 - enable/disable ICMP echo reply |
UDP (3) |
0 - Read # UDP packets sent |
1 - Read # UDP packets received |
TCP (4) |
0 - Read # TCP packets sent |
1 - Read # TCP packets received |
ARP (5) |
0 - Read # ARP packets sent |
1 - Read # ARP packets received |
2 - Read # ARP entry's |
3 - Read ARP entry |
4 - Add static ARP entry |
5 - Remove ARP entry (-1 = remove all) |
6 - Send ARP announce on specified interface |
7 - Read # ARP conflicts (IP address conflicts) |
---------------------- Константы для регистров: ---------------------- |
eax - SF_NETWORK_PROTOCOL (76) |
====================================================================== |
========== Функция -1 - завершить выполнение потока/процесса ========= |
====================================================================== |
Параметры: |
4234,6 → 4810,8 |
* Эта функция завершает текущий поток. Другой поток можно прибить |
вызовом подфункции 2 функции 18. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_TERMINATE_PROCESS (-1) |
====================================================================== |
=========================== Список событий =========================== |
====================================================================== |
/kernel/branches/Kolibri-acpi/docs/sysfuncs.txt |
---|
126,6 → 126,8 |
* value _skinh is accessible as the result of call |
subfunction 4 of function 48 |
---------------------- Constants for registers: ---------------------- |
eax - SF_CREATE_WINDOW (0) |
====================================================================== |
================ Function 1 - put pixel in the window. =============== |
====================================================================== |
139,6 → 141,8 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_PUT_PIXEL (1) |
====================================================================== |
============ Function 2 - get the code of the pressed key. =========== |
====================================================================== |
176,6 → 180,8 |
* This function notifies only about those hotkeys, which were |
defined by this thread by subfunction 4 of function 66. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_KEY (2) |
====================================================================== |
==================== Function 3 - get system time. =================== |
====================================================================== |
191,6 → 197,8 |
returns simply DWORD-value of the time counter. |
* System time can be set by function 22. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_SYS_TIME (3) |
====================================================================== |
=================== Function 4 - draw text string. =================== |
====================================================================== |
225,6 → 233,8 |
Ysize dd |
picture rb Xsize*Ysize*4 ; 32 bpp |
---------------------- Constants for registers: ---------------------- |
eax - SF_DRAW_TEXT (4) |
====================================================================== |
========================= Function 5 - delay. ======================== |
====================================================================== |
240,6 → 250,8 |
to transfer control to the next process (to complete a current |
time slice), use subfunction 1 of function 68. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SLEEP (5) |
====================================================================== |
=============== Function 7 - draw image in the window. =============== |
====================================================================== |
255,6 → 267,8 |
of the image relative to the window. |
* Size of the image in bytes is 3*xsize*ysize. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PUT_IMAGE (7) |
====================================================================== |
=============== Function 8 - define/delete the button. =============== |
====================================================================== |
287,6 → 301,8 |
In rest it is usual button. |
* Total number of buttons for all applications is limited to 4095. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEFINE_BUTTON (8) |
====================================================================== |
============ Function 9 - information on execution thread. =========== |
====================================================================== |
385,6 → 401,8 |
1-Kb buffer for the future compatibility, in the future |
some fields can be added. |
---------------------- Constants for registers: ---------------------- |
eax - SF_THREAD_INFO (9) |
====================================================================== |
==================== Function 10 - wait for event. =================== |
====================================================================== |
403,6 → 421,8 |
* To check, whether there is a message in queue, use function 11. |
To wait for no more than given time, use function 23. |
---------------------- Constants for registers: ---------------------- |
eax - SF_WAIT_EVENT (10) |
====================================================================== |
=============== Function 11 - check for event, no wait. ============== |
====================================================================== |
420,6 → 440,8 |
* To wait for event, use function 10. |
To wait for no more than given time, use function 23. |
---------------------- Constants for registers: ---------------------- |
eax - SF_CHECK_EVENT (11) |
====================================================================== |
=============== Function 12 - begin/end window redraw. =============== |
====================================================================== |
441,6 → 463,9 |
* Subfunction 1 deletes all buttons defined with |
function 8, they must be defined again. |
---------------------- Constants for registers: ---------------------- |
eax - SF_REDRAW (12) |
ebx - SSF_BEGIN_DRAW (1), SSF_END_DRAW (2) |
====================================================================== |
============ Function 13 - draw a rectangle in the window. =========== |
====================================================================== |
455,6 → 480,8 |
* Coordinates are understood as coordinates of the left upper corner |
of a rectangle relative to the window. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DRAW_RECT (13) |
====================================================================== |
=================== Function 14 - get screen size. =================== |
====================================================================== |
470,6 → 497,8 |
* See also subfunction 5 of function 48 - get sizes of |
working area of the screen. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_SCREEN_SIZE (14) |
====================================================================== |
== Function 15, subfunction 1 - set a size of the background image. == |
====================================================================== |
488,6 → 517,9 |
* There is a pair function for get size of the background image - |
subfunction 1 of function 39. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_SIZE_BG (1) |
====================================================================== |
=== Function 15, subfunction 2 - put pixel on the background image. == |
====================================================================== |
508,6 → 540,9 |
* There is a pair function for get pixel on the background image - |
subfunction 2 of function 39. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_PIXEL_BG (2) |
====================================================================== |
=========== Function 15, subfunction 3 - redraw background. ========== |
====================================================================== |
517,6 → 552,9 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_REDRAW_BG (3) |
====================================================================== |
== Function 15, subfunction 4 - set drawing mode for the background. = |
====================================================================== |
534,6 → 572,9 |
* There is a pair function for get drawing mode of the background - |
subfunction 4 of function 39. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_MODE_BG (4) |
====================================================================== |
===================== Function 15, subfunction 5 ===================== |
============ Put block of pixels on the background image. ============ |
555,6 → 596,9 |
* For update of the screen (after completion of a series of commands |
working with a background) call subfunction 3. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_IMAGE_BG (5) |
====================================================================== |
===================== Function 15, subfunction 6 ===================== |
======== Map background data to the address space of process. ======== |
572,6 → 616,9 |
* Pixels of the background image are written sequentially |
from left to right, from up to down. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_MAP_BG (6) |
====================================================================== |
===== Function 15, subfunction 7 - close mapped background data. ===== |
====================================================================== |
582,6 → 629,9 |
Returned value: |
* eax = 1 - success, 0 - error |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_UNMAP_BG (7) |
====================================================================== |
===================== Function 15, subfunction 8 ===================== |
============= Get coordinates of last draw the background ============ |
599,6 → 649,9 |
immediately after the event: |
5 = kernel finished redrawing of the desktop background |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_LAST_DRAW (8) |
====================================================================== |
===================== Function 15, subfunction 9 ===================== |
============= Redraws a rectangular part of the background =========== |
615,6 → 668,9 |
(right,bottom) are coordinates of the right lower one. |
* If parameters are set incorrectly then background is not redrawn. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_SET (15) |
ebx - SSF_REDRAW_RECT (9) |
====================================================================== |
=============== Function 16 - save ramdisk on a floppy. ============== |
====================================================================== |
625,6 → 681,8 |
* eax = 0 - success |
* eax = 1 - error |
---------------------- Constants for registers: ---------------------- |
eax - SF_RD_TO_FLOPPY (16) |
====================================================================== |
======= Function 17 - get the identifier of the pressed button. ====== |
====================================================================== |
648,6 → 706,8 |
as in subfunction 2 of function 37 at the beginning |
of button press, excluding lower bit, which is cleared. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_BUTTON (17) |
====================================================================== |
===================== Function 18, subfunction 1 ===================== |
============= Make deactive the window of the given thread. ========== |
659,6 → 719,9 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_UNFOCUS_WINDOW (1) |
====================================================================== |
= Function 18, subfunction 2 - terminate process/thread by the slot. = |
====================================================================== |
675,6 → 738,9 |
* See also subfunction 18 - terminate |
process/thread by the identifier. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_TERMINATE_THREAD (2) |
====================================================================== |
===================== Function 18, subfunction 3 ===================== |
============= Make active the window of the given thread. ============ |
690,6 → 756,9 |
some window is made active. |
* To find out, which window is active, use subfunction 7. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_FOCUS_WINDOW (3) |
====================================================================== |
===================== Function 18, subfunction 4 ===================== |
=========== Get counter of idle time units per one second. =========== |
703,6 → 772,9 |
Returned value: |
* eax = value of the counter of idle time units per one second |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_IDLE_COUNT (4) |
====================================================================== |
========== Function 18, subfunction 5 - get CPU clock rate. ========== |
====================================================================== |
712,6 → 784,9 |
Returned value: |
* eax = clock rate (modulo 2^32 clock ticks = 4GHz) |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_CPU_REQUENCY (5) |
====================================================================== |
Function 18, subfunction 6 - save ramdisk to the file on hard drive. |
====================================================================== |
727,6 → 802,9 |
* All folders in the given path must exist, otherwise function |
returns value 5, "file not found". |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_RD_TO_HDD (6) |
====================================================================== |
=========== Function 18, subfunction 7 - get active window. ========== |
====================================================================== |
741,6 → 819,9 |
messages on all keyboard input. |
* To make a window active, use subfunction 3. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_ACTIVE_WINDOW (7) |
====================================================================== |
== Function 18, subfunction 8 - disable/enable the internal speaker. = |
====================================================================== |
765,6 → 846,10 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SPEAKER (8) |
ecx - SSSF_GET_STATE (1), SSSF_TOGGLE (2) |
====================================================================== |
== Function 18, subfunction 9 - system shutdown with the parameter. == |
====================================================================== |
783,6 → 868,9 |
* Do not rely on returned value by incorrect call, it can be |
changed in future versions of the kernel. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SHUTDOWN (9) |
====================================================================== |
======= Function 18, subfunction 10 - minimize topmost window. ======= |
====================================================================== |
804,6 → 892,9 |
for other windows it can be defined manually by function 8), |
restore of a window is done by the application '@taskbar'. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MINIMIZE_WINDOW (10) |
====================================================================== |
Function 18, subfunction 11 - get information on the disk subsystem. |
====================================================================== |
828,7 → 919,7 |
For example, for the standard configuration from one 1.44-drive |
here will be 40h, and for the case 1.2Mb on A: and 1.44Mb on B: |
the value is 24h. |
First IDE controller: |
* +1: byte: information about hard disks and CD-drives, AABBCCDD, |
where AA corresponds to the controller IDE0, ..., DD - IDE3: |
839,7 → 930,7 |
this field contains 48h. |
* +2: 4 db: number of the retrieved partitions on hard disks |
at accordingly IDE0,...,IDE3. |
Second IDE controller: |
* +6: byte: information about hard disks and CD-drives, AABBCCDD, |
where AA corresponds to the controller IDE4, ..., DD - IDE7: |
860,8 → 951,8 |
For example, in the case HD on IDE8 and CD on IDE10 |
this field contains 48h. |
* +12: 4 db: number of the retrieved partitions on hard disks |
at accordingly IDE8,...,IDE11. |
at accordingly IDE8,...,IDE11. |
If the hard disk on IDEx is absent, appropriate byte is zero, |
otherwise it shows number of the recognized partitions, which |
can be not presented (if the drive is not formatted or if |
872,6 → 963,9 |
* The table can be used for obtaining the information about |
available devices. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_INFO_DISC_SYS (11) |
====================================================================== |
========== Function 18, subfunction 13 - get kernel version. ========= |
====================================================================== |
891,6 → 985,9 |
db 0 |
dd 1675 |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_KERNEL_VERSION (13) |
====================================================================== |
======= Function 18, subfunction 14 - wait for screen retrace. ======= |
====================================================================== |
905,6 → 1002,9 |
* Function is intended only for active high-efficiency graphics |
applications; is used for smooth output of a graphics. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_WAIT_RETRACE (14) |
====================================================================== |
== Function 18, subfunction 15 - center mouse cursor on the screen. == |
====================================================================== |
914,6 → 1014,9 |
Returned value: |
* eax = 0 as the tag of success |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_CURSOR_CENTER (15) |
====================================================================== |
========= Function 18, subfunction 16 - get size of free RAM. ======== |
====================================================================== |
923,6 → 1026,9 |
Returned value: |
* eax = size of free memory in kilobytes |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_FREE_RAM (16) |
====================================================================== |
======== Function 18, subfunction 17 - get full amount of RAM. ======= |
====================================================================== |
932,6 → 1038,9 |
Returned value: |
* eax = total size of existing memory in kilobytes |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_TOTAL_RAM (17) |
====================================================================== |
===================== Function 18, subfunction 18 ==================== |
============= Terminate process/thread by the identifier. ============ |
949,6 → 1058,9 |
* See also subfunction 2 - terminate |
process/thread by given slot. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_TERMINATE_THREAD_ID (18) |
====================================================================== |
======== Function 18, subfunction 19 - get/set mouse features. ======= |
====================================================================== |
1032,6 → 1144,12 |
Remark: mouse settings can be modified in the application mouse_cfg. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MOUSE_SETTINGS (19) |
ecx - SSSF_GET_SPEED (0), SSSF_SET_SPEED (1), SSSF_GET_SPEEDUP (2), |
SSSF_SET_SPEEDUP (3), SSSF_SET_POS (4), SSSF_SET_BUTTON (5), |
SSSF_GET_DOUBLE_CLICK_DELAY (6), SSSF_SET_DOUBLE_CLICK_DELAY (7) |
====================================================================== |
======== Function 18, subfunction 20 - get information on RAM. ======= |
====================================================================== |
1056,6 → 1174,9 |
* +32: dword: size of maximum allocated block in kernel heap |
(reserved) |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_RAM_INFO (20) |
====================================================================== |
===================== Function 18, subfunction 21 ==================== |
======== Get slot number of process/thread by the identifier. ======== |
1068,6 → 1189,9 |
* eax = 0 - error (invalid identifier) |
* otherwise eax = slot number |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_GET_THREAD_SLOT (21) |
====================================================================== |
===================== Function 18, subfunction 22 ==================== |
============== Operations with window of another thread. ============= |
1089,6 → 1213,11 |
* One can restore and activate window simultaneously with |
subfunction 3 (which requires slot number). |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_FOREIGN_WINDOW (22) |
ecx - SSSF_MINIMIZE (0), SSSF_MINIMIZE_ID (1), SSSF_RESTORE (2), |
SSSF_RESTORE_ID (3) |
====================================================================== |
======== Function 18, subfunction 23 - minimize all windows. ========== |
====================================================================== |
1101,6 → 1230,9 |
Remarks: |
* Window of special thread (name begin to symbol @) is not minimize. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_MINIMIZE_ALL (23) |
====================================================================== |
======= Function 18, subfunction 24 - set limits of screen. ========== |
====================================================================== |
1119,6 → 1251,9 |
of the current video mode, otherwise the function will not change |
anything. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_SET_SCREEN_LIMITS (24) |
====================================================================== |
===================== Function 18, subfunction 25 ==================== |
===== Control position of the window relative to other windows. ====== |
1150,6 → 1285,10 |
ZPOS_NORMAL = 0 - normal |
ZPOS_ALWAYS_TOP = 1 - on top of all windows |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM (18) |
ebx - SSF_WINDOW_BEHAVIOR (25) |
ecx - SSSF_GET_WB (1), SSSF_SET_WB (2) |
====================================================================== |
==================== Function 20 - MIDI interface. =================== |
====================================================================== |
1171,6 → 1310,9 |
* Previously the base port must be defined by |
subfunction 1 of function 21. |
---------------------- Constants for registers: ---------------------- |
eax - SF_MIDI (20) |
ebx - SSF_RESET (1), SSF_OUTPUT (2) |
====================================================================== |
======== Function 21, subfunction 1 - set MPU MIDI base port. ======== |
====================================================================== |
1186,6 → 1328,9 |
* The installation of base is necessary for function 20. |
* To get base port use subfunction 1 of function 26. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_MPU_MIDI_BASE (1) |
====================================================================== |
========== Function 21, subfunction 2 - set keyboard layout. ========= |
====================================================================== |
1219,6 → 1364,9 |
the corresponding icon. |
* The application @taskbar switches layouts on user request. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_KEYBOARD_LAYOUT (2) |
====================================================================== |
========== Function 21, subfunction 5 - set system language. ========= |
====================================================================== |
1236,6 → 1384,9 |
use this variable. |
* To get system language use subfunction 5 of function 26. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_SYS_LANG (5) |
====================================================================== |
Function 21, subfunction 11 - enable/disable low-level access to HD. |
====================================================================== |
1250,6 → 1401,9 |
* The current implementation uses only low bit of ecx. |
* To get current status use subfunction 11 of function 26. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_ACCESS_HD_LBA (11) |
====================================================================== |
Function 21, subfunction 12 - enable/disable low-level access to PCI. |
====================================================================== |
1264,6 → 1418,9 |
* The current implementation uses only low bit of ecx. |
* To get current status use subfunction 12 of function 26. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_SET (21) |
ebx - SSF_ACCESS_PCI (12) |
====================================================================== |
================= Function 22 - set system date/time. ================ |
====================================================================== |
1302,6 → 1459,8 |
an alarm clock cancels automatically the previous set. |
However, at moment no program uses it. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SET_TIME_DATE (22) |
====================================================================== |
============= Function 23 - wait for event with timeout. ============= |
====================================================================== |
1325,6 → 1484,8 |
if the addition of ebx with the current value of time counter |
makes 32-bit overflow. |
---------------------- Constants for registers: ---------------------- |
eax - SF_WAIT_EVENT_TIMEOUT (23) |
====================================================================== |
======= Function 24, subfunction 4 - eject tray of disk drive. ======= |
====================================================================== |
1345,6 → 1506,9 |
corresponding device. |
* An example of usage of the function is the application CD_tray. |
---------------------- Constants for registers: ---------------------- |
eax - SF_CD (24) |
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5) |
====================================================================== |
======== Function 24, subfunction 5 - load tray of disk drive. ======= |
====================================================================== |
1361,6 → 1525,9 |
* The function is supported only for ATAPI devices (CD and DVD). |
* An example of usage of the function is the application CD_tray. |
---------------------- Constants for registers: ---------------------- |
eax - SF_CD (24) |
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5) |
====================================================================== |
======= Function 25 - put image area on the background layer. ======== |
====================================================================== |
1381,6 → 1548,8 |
* The function places the image directly to LFB. It is not for |
background image f.15. Options f.15 to f.25 does not make sense. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SCREEN_PUT_IMAGE (25) |
====================================================================== |
======== Function 26, subfunction 1 - get MPU MIDI base port. ======== |
====================================================================== |
1392,6 → 1561,9 |
Parameters: |
* To set base port use subfunction 1 of function 21. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_MPU_MIDI_BASE (1) |
====================================================================== |
========== Function 26, subfunction 2 - get keyboard layout. ========= |
====================================================================== |
1428,6 → 1600,9 |
the corresponding icon (using this function). |
* The application @taskbar switches layouts on user request. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_KEYBOARD_LAYOUT (2) |
====================================================================== |
========== Function 26, subfunction 5 - get system language. ========= |
====================================================================== |
1442,6 → 1617,9 |
appropriate icon (using this function). |
* To set system language use subfunction 5 of function 21. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_SYS_LANG (5) |
====================================================================== |
=== Function 26, subfunction 9 - get the value of the time counter. == |
====================================================================== |
1453,8 → 1631,11 |
Remarks: |
* Counter takes modulo 2^32, that correspond to a little more |
than 497 days. |
* To get system time use function 3. |
* To get system time use function 3. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_TIME_COUNT (9) |
====================================================================== |
===================== Function 26, subfunction 10 ==================== |
========== Get the value of the high precision time counter. ========= |
1464,11 → 1645,14 |
* ebx = 10 - subfunction number |
Returned value: |
* eax = number of nanoseconds since system boot time (lower DWORD) |
* edx = number of nanoseconds since system boot time (high DWORD) |
* edx = number of nanoseconds since system boot time (high DWORD) |
Remarks: |
* The counter is based on HPET, if HPET is not available, resolution |
will be reduced to 10 000 000 nanoseconds. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_TIME_COUNT_PRO (10) |
====================================================================== |
===================== Function 26, subfunction 11 ==================== |
========== Find out whether low-level HD access is enabled. ========== |
1482,6 → 1666,9 |
* Is used in LBA read (subfunction 8 of function 58). |
* To set current state use subfunction 11 of function 21. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_ACCESS_HD_LBA (11) |
====================================================================== |
===================== Function 26, subfunction 12 ==================== |
========== Find out whether low-level PCI access is enabled. ========= |
1496,6 → 1683,9 |
* The current implementation uses only low bit of ecx. |
* To set the current state use subfunction 12 of function 21. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYSTEM_GET (26) |
ebx - SSF_ACCESS_PCI (12) |
====================================================================== |
=================== Function 29 - get system date. =================== |
====================================================================== |
1510,6 → 1700,8 |
Remarks: |
* To set system date use function 22. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_SYS_DATE (29) |
====================================================================== |
============= Function 30 - work with the current folder. ============ |
====================================================================== |
1554,6 → 1746,9 |
Remarks: |
* The function can be called only 1 time for 1 session of the OS. |
---------------------- Constants for registers: ---------------------- |
eax - SF_CURRENT_FOLDER (30) |
ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3) |
====================================================================== |
========= Function 34 - who owner the pixel on the screen. =========== |
====================================================================== |
1567,6 → 1762,8 |
If incorrect values ebx and ecx then function returns 0 |
* The function takes the value from the area [_WinMapAddress] |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_PIXEL_OWNER (34) |
====================================================================== |
======= Function 35 - read the color of a pixel on the screen. ======= |
====================================================================== |
1584,6 → 1781,8 |
to videomemory through the selector gs. To get parameters of |
the current videomode, use function 61. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_PIXEL (35) |
====================================================================== |
=================== Function 36 - read screen area. ================== |
====================================================================== |
1600,6 → 1799,8 |
of the image relative to the screen. |
* Size of the image in bytes is 3*xsize*ysize. |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_IMAGE (36) |
====================================================================== |
=================== Function 37 - work with mouse. =================== |
====================================================================== |
1722,6 → 1923,11 |
* Values are zeroed after reading. |
* Values are signed. |
---------------------- Constants for registers: ---------------------- |
eax - SF_MOUSE_GET (37) |
ebx - SSF_SCREEN_POSITION (0), SSF_WINDOW_POSITION (1), |
SSF_BUTTON (2), SSF_BUTTON_EXT (3), SSF_LOAD_CURSOR (4), |
SSF_SET_CURSOR (5), SSF_DEL_CURSOR (6), SSF_SCROLL_DATA (7) |
====================================================================== |
====================== Function 38 - draw line. ====================== |
====================================================================== |
1740,6 → 1946,8 |
* Coordinates are relative to the window. |
* End point is also drawn. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DRAW_LINE (38) |
====================================================================== |
== Function 39, subfunction 1 - get a size of the background image. == |
====================================================================== |
1753,6 → 1961,8 |
subfunction 1 of function 15. After which it is necessary, |
of course, anew to define image. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
== Function 39, subfunction 2 - get pixel from the background image. = |
====================================================================== |
1772,6 → 1982,8 |
* There is a pair function to set pixel on the background image - |
subfunction 2 of function 15. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
== Function 39, subfunction 4 - get drawing mode for the background. = |
====================================================================== |
1785,6 → 1997,8 |
* There is a pair function to set drawing mode - |
subfunction 4 of function 15. |
---------------------- Constants for registers: ---------------------- |
eax - SF_BACKGROUND_GET (39) |
====================================================================== |
=========== Function 40 - set the mask for expected events. ========== |
====================================================================== |
1812,7 → 2026,8 |
* Event functions take into account the mask on moment of |
function call, not on moment of event arrival. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SET_EVENTS_MASK (40) |
====================================================================== |
================ Function 43 - input/output to a port. =============== |
====================================================================== |
1841,7 → 2056,8 |
processor instructions in/out - this is much |
faster and a bit shorter and easier. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PORT_IN_OUT (43) |
====================================================================== |
====== Function 46 - reserve/free a group of input/output ports. ===== |
====================================================================== |
1874,6 → 2090,8 |
* When a thread terminates, all reserved by it ports |
are freed automatically. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SET_PORTS (46) |
====================================================================== |
============= Function 47 - draw a number in the window. ============= |
====================================================================== |
1908,6 → 2126,8 |
* Parameters of fonts are shown in the description of function 4 |
(text output). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DRAW_NUMBER (47) |
====================================================================== |
========= Function 48, subfunction 0 - apply screen settings. ======== |
====================================================================== |
1924,6 → 2144,9 |
is ignored. |
* Function call with nonzero ecx is ignored. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_APPLY (0) |
====================================================================== |
=========== Function 48, subfunction 1 - set button style. =========== |
====================================================================== |
1940,6 → 2163,9 |
subfunction 0. |
* Button style influences only to their draw of function 8. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_BUTTON_STYLE (1) |
====================================================================== |
====== Function 48, subfunction 2 - set standard window colors. ====== |
====================================================================== |
1963,6 → 2189,9 |
* Color table can be viewed/changed interactively with |
the application 'desktop'. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_COLORS (2) |
====================================================================== |
====== Function 48, subfunction 3 - get standard window colors. ====== |
====================================================================== |
2008,6 → 2237,9 |
* Color table can be viewed/changed interactively with |
the application 'desktop'. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_COLORS (3) |
====================================================================== |
============ Function 48, subfunction 4 - get skin height. =========== |
====================================================================== |
2022,6 → 2254,9 |
* See also general structure of window in the description |
of function 0. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SKIN_HEIGHT (4) |
====================================================================== |
======== Function 48, subfunction 5 - get screen working area. ======= |
====================================================================== |
2044,6 → 2279,9 |
to get sizes of all screen. |
* There is a pair function to set working area - subfunction 6. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SCREEN_AREA (5) |
====================================================================== |
======== Function 48, subfunction 6 - set screen working area. ======= |
====================================================================== |
2074,6 → 2312,9 |
updating coordinates and sizes of maximized windows. |
The system sends to all windows redraw message (the event 1). |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_SCREEN_AREA (6) |
====================================================================== |
=========== Function 48, subfunction 7 - get skin margins. =========== |
====================================================================== |
2092,6 → 2333,9 |
(by function 4) or a substitute of header text |
(at the discretion of an application). |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_SKIN_MARGINS (7) |
====================================================================== |
============= Function 48, subfunction 8 - set used skin. ============ |
====================================================================== |
2112,6 → 2356,9 |
* User can change the skin statically by creating hisself |
'default.skn' or dynamically with the application 'desktop'. |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_SKIN (8) |
====================================================================== |
====== Function 48, subfunction 9 - get font smoothing setting. ====== |
====================================================================== |
2121,6 → 2368,9 |
Returned value: |
* eax = 2 - subpixel, 1 - anti-aliasing, 0 - off |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_FONT_SMOOTH (9) |
====================================================================== |
========== Function 48, subfunction 10 - set font smoothing. ========= |
====================================================================== |
2129,6 → 2379,9 |
* ebx = 10 - subfunction number |
* cl = 2 - subpixel, 1 - anti-aliasing, 0 - off |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_FONT_SMOOTH (10) |
====================================================================== |
============ Function 48, subfunction 11 - get font size. ============ |
====================================================================== |
2138,6 → 2391,9 |
Returned value: |
* eax = current font height in pixels |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_GET_FONT_SIZE (11) |
====================================================================== |
============ Function 48, subfunction 12 - set font size. ============ |
====================================================================== |
2146,6 → 2402,9 |
* ebx = 10 - subfunction number |
* cl = new font height in pixels |
---------------------- Constants for registers: ---------------------- |
eax - SF_STYLE_SETTINGS (48) |
ebx - SSF_SET_FONT_SIZE (12) |
====================================================================== |
=========== Function 49 - Advanced Power Management (APM). =========== |
====================================================================== |
2168,6 → 2427,8 |
(http://www.pobox.com/~ralf/files.html, |
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/). |
---------------------- Constants for registers: ---------------------- |
eax - SF_APM (49) |
====================================================================== |
=================== Function 50 - set window shape. ================== |
====================================================================== |
2214,6 → 2475,8 |
* The call of subfunction 0 with NULL pointer results in return |
to the rectangular shape. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SET_WINDOW_SHAPE (50) |
====================================================================== |
==================== Function 51 - create thread. ==================== |
====================================================================== |
2225,8 → 2488,9 |
Returned value: |
* eax = -1 - error (there is too many threads) |
* otherwise eax = TID - thread identifier |
</UL> |
---------------------- Constants for registers: ---------------------- |
eax - SF_CREATE_THREAD (51) |
====================================================================== |
==================== Function 54, subfunction 0 ====================== |
============== Get the number of slots in the clipboard. ============= |
2238,6 → 2502,9 |
* eax = slots in the clipboard |
* eax = -1 - main list area not found |
---------------------- Constants for registers: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_GET_SLOT_COUNT (0) |
====================================================================== |
==================== Function 54, subfunction 1 ====================== |
================= Read the data from the clipboard. ================== |
2251,6 → 2518,9 |
* eax = 1 - error |
* eax = -1 - main list area not found |
---------------------- Constants for registers: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_READ_CB (1) |
====================================================================== |
==================== Function 54, subfunction 2 ====================== |
================= Write the data to the clipboard. =================== |
2264,7 → 2534,10 |
* eax = 0 - success |
* eax = 1 - error |
* eax = -1 - main list area not found |
---------------------- Constants for registers: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_WRITE_CB (2) |
====================================================================== |
===================== Function 54, subfunction 3 ===================== |
================ Delete the last slot in the clipboard =============== |
2276,7 → 2549,10 |
* eax = 0 - success |
* eax = 1 - error |
* eax = -1 - main list area not found |
---------------------- Constants for registers: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_DEL_SLOT (3) |
====================================================================== |
===================== Function 54, subfunction 4 ===================== |
===================== Alarm reset the lock buffer ==================== |
2291,6 → 2567,9 |
* Used in exceptional cases, where no responsible or killed |
application blocked the clipboard operations. |
---------------------- Constants for registers: ---------------------- |
eax - SF_CLIPBOARD (54) |
ebx - SSF_UNLOCK_BUFFER (4) |
====================================================================== |
Function 55, subfunction 55 - begin to play data on built-in speaker. |
====================================================================== |
2324,6 → 2603,8 |
* The data must be kept in the memory at least up to the end |
of play. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SPEAKER_PLAY (55) |
====================================================================== |
======================= Function 57 - PCI BIOS. ====================== |
====================================================================== |
2342,6 → 2623,8 |
* If BIOS does not support this extension, its behavior is emulated |
(through kernel-mode analogues of subfunctions of function 62). |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI_BIOS (57) |
====================================================================== |
========== Function 60 - Inter Process Communication (IPC). ========== |
====================================================================== |
2391,6 → 2674,9 |
* Immediately after writing of IPC-message to the buffer the system |
sends to the receiver the event with code 7 (see event codes). |
---------------------- Constants for registers: ---------------------- |
eax - SF_IPC (60) |
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2) |
====================================================================== |
==== Function 61 - get parameters for the direct graphics access. ==== |
====================================================================== |
2450,6 → 2736,10 |
* eax = number of bytes occupied by one scanline |
(horizontal line on the screen) |
---------------------- Constants for registers: ---------------------- |
eax - SF_GET_GRAPHICAL_PARAMS (61) |
ebx - SSF_SCREEN_SIZE (1), SSF_BITS_PER_PIXEL (2), |
SSF_BYTES_PER_LINE (3) |
====================================================================== |
===== Function 62, subfunction 0 - get version of PCI-interface. ===== |
====================================================================== |
2465,6 → 2755,9 |
enabled by subfunction 12 of function 21. |
* If PCI BIOS is not supported, the value of ax is undefined. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_VERSION (0) |
====================================================================== |
==== Function 62, subfunction 1 - get number of the last PCI-bus. ==== |
====================================================================== |
2479,6 → 2772,9 |
enabled by subfunction 12 of function 21. |
* If PCI BIOS is not supported, the value of ax is undefined. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_LAST_BUS (1) |
====================================================================== |
===================== Function 62, subfunction 2 ===================== |
===== Get mechanism of addressing to the PCI configuration space. ==== |
2497,6 → 2793,9 |
* Subfunctions of read and write work automatically |
with the selected mechanism. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_GET_ADRR_MODE (2) |
====================================================================== |
======== Function 62, subfunctions 4,5,6 - read PCI-register. ======== |
====================================================================== |
2529,6 → 2828,9 |
registers of the second type must be listed |
in the device documentation. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_READ_BYTE (4), SSF_READ_WORD (5), SSF_READ_DWORD (6) |
====================================================================== |
====== Function 62, subfunctions 8,9,10 - write to PCI-register. ===== |
====================================================================== |
2559,6 → 2861,9 |
Ralf Brown; registers of the second type must be listed |
in the device documentation. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PCI (62) |
ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10) |
====================================================================== |
============== Function 63 - work with the debug board. ============== |
====================================================================== |
2604,6 → 2909,9 |
* eax = ebx = 0 - the buffer is empty |
* eax = byte, ebx = 1 - byte was successfully read |
---------------------- Constants for registers: ---------------------- |
eax - SF_BOARD (63) |
ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2) |
====================================================================== |
============== Function 64 - resize application memory. ============== |
====================================================================== |
2621,6 → 2929,8 |
The function call will be ignored after creation of process heap |
with function 68.11. |
---------------------- Constants for registers: ---------------------- |
eax - SF_MEMORY_RESIZE (64) |
====================================================================== |
======== Function 65 - draw image with palette in the window. ======== |
====================================================================== |
2665,6 → 2975,8 |
* The call to function 7 is equivalent to call to this function |
with esi=24, ebp=0. |
---------------------- Constants for registers: ---------------------- |
eax - SF_PUT_IMAGE_EXT (65) |
====================================================================== |
================== Function 66 - work with keyboard. ================= |
====================================================================== |
2773,6 → 3085,11 |
* Unlocking the results of the f. 66.6 |
* To emulate a mouse via the keyboard, the application MOUSEMUL |
---------------------- Constants for registers: ---------------------- |
eax - SF_KEYBOARD (66) |
ebx - SSF_SET_INPUT_MODE (1), SSF_GET_INPUT_MODE (2), |
SSF_GET_CONTROL_KEYS (3), SSF_SET_SYS_HOTKEY (4), |
SSF_DEL_SYS_HOTKEY (5), SSF_LOCK_INPUT (6), SSF_UNLOCK_INPUT (7) |
====================================================================== |
========= Function 67 - change position/sizes of the window. ========= |
====================================================================== |
2797,6 → 3114,8 |
call to function 9. |
* The function sends to the window redraw event (with the code 1). |
---------------------- Constants for registers: ---------------------- |
eax - SF_CHANGE_WINDOW (67) |
====================================================================== |
====== Function 68, subfunction 0 - get the task switch counter. ===== |
====================================================================== |
2807,6 → 3126,9 |
* eax = number of task switches from the system booting |
(modulo 2^32) |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_GET_TASK_SWITCH_COUNT (0) |
====================================================================== |
======= Function 68, subfunction 1 - switch to the next thread. ====== |
====================================================================== |
2820,6 → 3142,9 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SWITCH_TASK (1) |
====================================================================== |
============= Function 68, subfunction 2 - cache + rdpmc. ============ |
====================================================================== |
2842,6 → 3167,11 |
* for ecx=2 and ecx=3: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_PERFORMANCE (2) |
ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1), |
SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3) |
====================================================================== |
=========== Function 68, subfunction 3 - read MSR-register. ========== |
====================================================================== |
2866,6 → 3196,9 |
will generate other exception in the kernel, which will anyway |
kill the thread. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_READ_MSR (3) |
====================================================================== |
========= Function 68, subfunction 4 - write to MSR-register. ======== |
====================================================================== |
2891,6 → 3224,9 |
will generate other exception in the kernel, which will anyway |
kill the thread. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_WRITE_MSR (4) |
====================================================================== |
======= Function 68, subfunction 11 - initialize process heap. ======= |
====================================================================== |
2908,6 → 3244,9 |
returning the size of the existing heap. |
* After creation of the heap calls to function 64 will be ignored. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_HEAP_INIT (11) |
====================================================================== |
======== Function 68, subfunction 12 - allocate memory block. ======== |
====================================================================== |
2924,6 → 3263,9 |
way that the real size of allocated block is more than or equal to |
requested size. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_ALLOC (12) |
====================================================================== |
========== Function 68, subfunction 13 - free memory block. ========== |
====================================================================== |
2938,6 → 3280,9 |
* The memory block must have been allocated by subfunction 12 |
or subfunction 20. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_FREE (13) |
====================================================================== |
===================== Function 68, subfunction 14 ==================== |
============ Wait for signal from another program/driver. ============ |
2952,6 → 3297,9 |
* +4: dword: data of signal (20 bytes), format of which is defined |
by the first dword |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_WAIT_SIGNAL (14) |
====================================================================== |
============= Function 68, subfunction 16 - load driver. ============= |
====================================================================== |
2970,6 → 3318,9 |
terminating null character, the rest is ignored. |
* Driver ABC is loaded from file /rd/1/drivers/ABC.obj. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DRIVER (16) |
====================================================================== |
============ Function 68, subfunction 17 - driver control. =========== |
====================================================================== |
2990,6 → 3341,9 |
are defined by driver. |
* Previously one must obtain driver handle by subfunction 16. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_CONTROL_DRIVER (17) |
====================================================================== |
=============== Function 68, subfunction 19 - load DLL. ============== |
====================================================================== |
3005,6 → 3359,9 |
by zero. The first dword in structure points to function name, |
the second dword contains address of function. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DLL (19) |
====================================================================== |
======= Function 68, subfunction 20 - reallocate memory block. ======= |
====================================================================== |
3028,6 → 3385,9 |
* The contents of the block are unchanged up to the shorter of |
the new and old sizes. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_REALLOC (20) |
====================================================================== |
=========== Function 68, subfunction 21 - load driver PE. ============ |
====================================================================== |
3043,6 → 3403,9 |
* If the driver was not loaded yet, it is loaded; |
if the driver was loaded yet, nothing happens. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_DRIVER_PE (21) |
====================================================================== |
======== Function 68, subfunction 22 - open named memory area. ======= |
====================================================================== |
3081,6 → 3444,9 |
with denied rights will fail with error code E_ACCESS. |
* The process which has created an area always has write access. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_OPEN (22) |
====================================================================== |
======= Function 68, subfunction 23 - close named memory area. ======= |
====================================================================== |
3096,6 → 3462,9 |
this area will close it. |
* When thread is terminating, all opened by it areas are closed. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_CLOSE (23) |
====================================================================== |
======== Function 68, subfunction 24 - set exception handler. ======== |
====================================================================== |
3128,6 → 3497,9 |
Also user handler is responsible for clearing exceptions flags in |
FPU and/or SSE. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SET_EXCEPTION_HANDLER (24) |
====================================================================== |
======== Function 68, subfunction 25 - set exception activity ======== |
====================================================================== |
3144,6 → 3516,9 |
which has been previously set by subfunction 24, |
is changed. Signal number corresponds to exception number. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SET_EXCEPTION_STATE (25) |
====================================================================== |
====== Function 68, subfunction 26 - release memory pages ============ |
====================================================================== |
3157,6 → 3532,9 |
* function release range of pages from ecx+edx to ecx+edx+esi |
and set virtual memory into reserved state. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_MEM_FREE_EXT (26) |
====================================================================== |
========== Function 68, subfunction 27 - load file =================== |
====================================================================== |
3170,6 → 3548,9 |
Remarks: |
* function loads file and unpacks, if necessary |
---------------------- Constants for registers: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_LOAD_FILE (27) |
====================================================================== |
====================== Function 69 - debugging. ====================== |
====================================================================== |
3216,6 → 3597,12 |
* subfunction 8 - terminate debugged thread |
* subfunction 9 - set/clear hardware breakpoint |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_MESSAGE_AREA (0), SSF_GET_REGISTERS (1), |
SSF_SET_REGISTERS (2), SSF_DETACH (3), SSF_SUSPEND (4), |
SSF_RESUME (5), SSF_READ_MEMORY (6), SSF_WRITE_MEMORY (7), |
SSF_TERMINATE (8), SSF_DEFINE_BREAKPOINT (9) |
====================================================================== |
= Function 69, subfunction 0 - define data area fror debug messages. = |
====================================================================== |
3239,6 → 3626,9 |
length - messages. Format of a message is explained in |
general description. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_MESSAGE_AREA (0) |
====================================================================== |
===================== Function 69, subfunction 1 ===================== |
============ Get contents of registers of debugged thread. =========== |
3268,6 → 3658,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_GET_REGISTERS (1) |
====================================================================== |
===================== Function 69, subfunction 2 ===================== |
============ Set contents of registers of debugged thread. =========== |
3287,6 → 3680,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SET_REGISTERS (2) |
====================================================================== |
===== Function 69, subfunction 3 - detach from debugged process. ===== |
====================================================================== |
3299,6 → 3695,9 |
Remarks: |
* If the process was suspended, it resumes execution. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_DETACH (3) |
====================================================================== |
======== Function 69, subfunction 4 - suspend debugged thread. ======= |
====================================================================== |
3312,6 → 3711,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_SUSPEND (4) |
====================================================================== |
======== Function 69, subfunction 5 - resume debugged thread. ======== |
====================================================================== |
3325,6 → 3727,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_RESUME (5) |
====================================================================== |
= Fucntion 69, subfunction 6 - read from memory of debugged process. = |
====================================================================== |
3343,6 → 3748,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_READ_MEMORY (6) |
====================================================================== |
== Function 69, subfunction 7 - write to memory of debugged process. = |
====================================================================== |
3361,6 → 3769,9 |
* Process must be loaded for debugging (as is shown in |
general description). |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_WRITE_MEMORY (7) |
====================================================================== |
======= Function 69, subfunction 8 - terminate debugged thread. ====== |
====================================================================== |
3377,6 → 3788,9 |
with two differences: it requires first remark and |
accepts PID rather than slot number. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_TERMINATE (8) |
====================================================================== |
===== Function 69, subfunction 9 - set/clear hardware breakpoint. ==== |
====================================================================== |
3418,6 → 3832,9 |
* Breakpoints on write and read/write act after |
execution of the caused it instruction. |
---------------------- Constants for registers: ---------------------- |
eax - SF_DEBUG (69) |
ebx - SSF_DEFINE_BREAKPOINT (9) |
====================================================================== |
==== Function 70 - work with file system with long names support. ==== |
====================================================================== |
3486,6 → 3903,12 |
drive data. Unlocking is made when subfunction 4 of function 24 |
is called for corresponding device. |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2), |
SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5), |
SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8), |
SSF_CREATE_FOLDER (9) |
====================================================================== |
=== Function 70, subfunction 0 - read file with long names support. == |
====================================================================== |
3513,6 → 3936,9 |
* The function does not allow to read folder (returns eax=10, |
access denied). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FILE (0) |
====================================================================== |
== Function 70, subfunction 1 - read folder with long names support. = |
====================================================================== |
3610,6 → 4036,9 |
and times and dates are zeroed. An alternative way to get the |
equipment information - subfunction 11 of function 18. |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_READ_FOLDER (1) |
====================================================================== |
===================== Function 70, subfunction 2 ===================== |
============ Create/rewrite file with long names support. ============ |
3638,6 → 4067,9 |
write as many as can and then return error code 8. |
* The function is not supported for CD (returns error code 2). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_CREATE_FILE (2) |
====================================================================== |
===================== Function 70, subfunction 3 ===================== |
=========== Write to existing file with long names support. ========== |
3668,6 → 4100,9 |
size with zero characters. |
* The function is not supported for CD (returns error code 2). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_WRITE_FILE (3) |
====================================================================== |
============ Function 70, subfunction 4 - set end of file. =========== |
====================================================================== |
3699,6 → 4134,9 |
error code 8. |
* The function is not supported for CD (returns error code 2). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_SET_END (4) |
====================================================================== |
==== Function 70, subfunction 5 - get information on file/folder. ==== |
====================================================================== |
3727,6 → 4165,9 |
* The function does not support virtual folders such as /, /rd and |
root folders like /rd/1. |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_GET_INFO (5) |
====================================================================== |
===== Function 70, subfunction 6 - set attributes of file/folder. ==== |
====================================================================== |
3757,6 → 4198,9 |
root folders like /rd/1. |
* The function is not supported for CD (returns error code 2). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_SET_INFO (6) |
====================================================================== |
=========== Function 70, subfunction 7 - start application. ========== |
====================================================================== |
3789,6 → 4233,9 |
* If the process is started as debugged, it is created in |
the suspended state; to run use subfunction 5 of function 69. |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_START_APP (7) |
====================================================================== |
========== Function 70, subfunction 8 - delete file/folder. ========== |
====================================================================== |
3814,6 → 4261,9 |
* The function can delete only empty folders (attempt to delete |
nonempty folder results in error with code 10, "access denied"). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_DELETE (8) |
====================================================================== |
============= Function 70, subfunction 9 - create folder. ============ |
====================================================================== |
3839,6 → 4289,9 |
* The parent folder must already exist. |
* If target folder already exists, function returns success (eax=0). |
---------------------- Constants for registers: ---------------------- |
eax - SF_FILE (70) |
[ebx] - SSF_CREATE_FOLDER (9) |
====================================================================== |
========== Function 71, subfunction 1 - set window caption. ========== |
====================================================================== |
3857,6 → 4310,8 |
otherwise will be used cp866. |
* Pass NULL in ecx to remove caption. |
---------------------- Constants for registers: ---------------------- |
eax - SF_SET_CAPTION (71) |
====================================================================== |
=============== Function 72 - send message to a window. ============== |
====================================================================== |
3871,6 → 4326,8 |
* eax = 0 - success |
* eax = 1 - buffer is full |
---------------------- Constants for registers: ---------------------- |
eax - SF_SEND_MESSAGE (72) |
====================================================================== |
===================== Function 73 - blit bitmap ===================== |
====================================================================== |
3910,6 → 4367,8 |
Returned value: |
* function does not return value |
---------------------- Constants for registers: ---------------------- |
eax - SF_BLITTER (73) |
====================================================================== |
= Function 74, Subfunction 255, Get number of active network devices. = |
====================================================================== |
3919,6 → 4378,9 |
Returned value: |
* eax = number of active network devices |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_COUNT (255) |
====================================================================== |
======== Function 74, Subfunction 0, Get network device type. ======== |
====================================================================== |
3929,6 → 4391,9 |
Returned value: |
* eax = device type number |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_TYPE (0) |
====================================================================== |
======== Function 74, Subfunction 1, Get network device name. ======== |
====================================================================== |
3941,6 → 4406,9 |
* eax = -1 on error |
* The network device name is written into the buffer, on success |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_NAME (1) |
====================================================================== |
========= Function 74, Subfunction 2, Reset network device. ========== |
====================================================================== |
3951,6 → 4419,9 |
Returned value: |
* eax = -1 on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RESET_DEVICE (2) |
====================================================================== |
========== Function 74, Subfunction 3, Stop network device. ========== |
====================================================================== |
3961,6 → 4432,9 |
Returned value: |
* eax = -1 on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_STOP_DEVICE (3) |
====================================================================== |
=========== Function 74, Subfunction 4, Get device pointer. ========== |
====================================================================== |
3971,6 → 4445,9 |
Returned value: |
* eax = device pointer, -1 on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_DEVICE_POINER (4) |
====================================================================== |
========= Function 74, Subfunction 6, Get packet TX counter. ========= |
====================================================================== |
3981,6 → 4458,9 |
Returned value: |
* eax = Number of packets sent since device start, -1 on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_TX_PACKET_COUNT (6) |
====================================================================== |
========= Function 74, Subfunction 7, Get packet RX counter. ========= |
====================================================================== |
3991,6 → 4471,9 |
Returned value: |
* eax = Number of packets received since device start, -1 on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RX_PACKET_COUNT (7) |
====================================================================== |
========== Function 74, Subfunction 8, Get TX byte counter. ========== |
====================================================================== |
4003,6 → 4486,9 |
-1 on error |
* ebx = Number of bytes sent since device start (higher dword) |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_TX_BYTE_COUNT (8) |
====================================================================== |
========== Function 74, Subfunction 9, Get RX byte counter. ========== |
====================================================================== |
4015,6 → 4501,9 |
-1 on error |
* ebx = Number of bytes received since device start (higher dword) |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_RX_BYTE_COUNT (9) |
====================================================================== |
========== Function 74, Subfunction 10, Get link status. ============= |
====================================================================== |
4033,6 → 4522,9 |
ETH_LINK_100M = 1000b ; 100 mbit |
ETH_LINK_1G = 1100b ; gigabit |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_GET (74) |
bl - SSF_LINK_STATUS (10) |
====================================================================== |
============== Function 75, Subfunction 0, Open socket. ============== |
====================================================================== |
4046,6 → 4538,9 |
* eax = socket number, -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_OPEN (0) |
====================================================================== |
============= Function 75, Subfunction 1, Close socket. ============== |
====================================================================== |
4057,6 → 4552,9 |
* eax = -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_CLOSE (1) |
====================================================================== |
================== Function 75, Subfunction 2, Bind. ================= |
====================================================================== |
4070,6 → 4568,9 |
* eax = -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_BIND (2) |
====================================================================== |
================= Function 75, Subfunction 3, Listen. ================ |
====================================================================== |
4082,6 → 4583,9 |
* eax = -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_LISTEN (3) |
====================================================================== |
================ Function 75, Subfunction 4, Connect. ================ |
====================================================================== |
4095,6 → 4599,9 |
* eax = -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_CONNECT (4) |
====================================================================== |
================= Function 75, Subfunction 5, Accept. ================ |
====================================================================== |
4108,6 → 4615,9 |
* eax = socket number of accepted socket, -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_ACCEPT (5) |
====================================================================== |
================== Function 75, Subfunction 6, Send. ================= |
====================================================================== |
4122,6 → 4632,9 |
* eax = number of bytes copied, -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_SEND (6) |
====================================================================== |
================ Function 75, Subfunction 7, Receive. ================ |
====================================================================== |
4136,6 → 4649,9 |
* eax = number of bytes copied, -1 on error |
* ebx = errorcode |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_RECEIVE (7) |
====================================================================== |
=========== Function 75, Subfunction 8, Set socket options. ========== |
====================================================================== |
4149,12 → 4665,15 |
* ebx = errorcode |
Remarks: |
Optstruct: |
Optstruct: |
dd level |
dd optionname |
dd optlength |
db options... |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_SET_OPTIONS (8) |
====================================================================== |
=========== Function 75, Subfunction 9, Get socket options. ========== |
====================================================================== |
4168,12 → 4687,15 |
* ebx = errorcode |
Remarks: |
Optstruct: |
Optstruct: |
dd level |
dd optionname |
dd optlength |
db options... |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_GET_OPTIONS (9) |
====================================================================== |
============ Function 75, Subfunction 10, Get socketpair. =========== |
====================================================================== |
4183,7 → 4705,10 |
Returned value: |
* eax = socketnum1, -1 on error |
* ebx = socketnum2, errorcode on error |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_SOCKET (75) |
bl - SSF_GET_PAIR (10) |
====================================================================== |
============ Function 76, Network options and statistics. ============ |
====================================================================== |
4195,9 → 4720,9 |
Ethernet (0) |
0 - Read MAC |
IPv4 (1) |
0 - Read # IP packets send |
0 - Read # IP packets sent |
1 - Read # IP packets received |
2 - Read IP |
3 - Write IP |
4207,22 → 4732,22 |
7 - Write subnet |
8 - Read gateway |
9 - Write gateway |
ICMP (2) |
0 - Read # ICMP packets send |
0 - Read # ICMP packets sent |
1 - Read # ICMP packets received |
3 - enable/disable ICMP echo reply |
UDP (3) |
0 - Read # UDP packets send |
0 - Read # UDP packets sent |
1 - Read # UDP packets received |
TCP (4) |
0 - Read # TCP packets send |
1 - Read # TCP packets received |
0 - Read # TCP packets sent |
1 - Read # TCP packets received |
ARP (5) |
0 - Read # ARP packets send |
0 - Read # ARP packets sent |
1 - Read # ARP packets received |
2 - Read # ARP entry's |
3 - Read ARP entry |
4229,9 → 4754,55 |
4 - Add static ARP entry |
5 - Remove ARP entry (-1 = remove all) |
6 - Send ARP announce on specified interface |
7 - Read # ARP conflicts (IP address conflicts) |
7 - Read # ARP conflicts (IP address conflicts) |
---------------------- Constants for registers: ---------------------- |
eax - SF_NETWORK_PROTOCOL (76) |
====================================================================== |
========== Function 77, Subfunction 0, Create futex object =========== |
====================================================================== |
Parameters: |
* eax = 77 - function number |
* ebx = 0 - subfunction number |
* ecx = pointer to futex dword |
Returned value: |
* eax = futex handle, 0 on error |
Remarks: |
* Use subfunction 1 to destroy the futex. |
The kernel destroys the futexes automatically when the process |
terminates. |
====================================================================== |
========= Function 77, Subfunction 1, Destroy futex object =========== |
====================================================================== |
Parameters: |
* eax = 77 - function number |
* ebx = 1 - subfunction number |
* ecx = futex handle |
Returned value: |
* eax = 0 - successfull, -1 on error |
Remarks: |
* The futex handle must have been created by subfunction 0 |
====================================================================== |
=============== Function 77, Subfunction 2, Futex wait =============== |
====================================================================== |
Parameters: |
* eax = 77 - function number |
* ebx = 2 - subfunction number |
* ecx = futex handle |
* edx = control value |
* esi = timeout in system ticks or 0 for infinity |
Returned value: |
* eax = 0 - successfull, -1 on timeout |
Remarks: |
* This operation tests that the value at the futex dword still |
contains the expected control value, and if so, then sleeps |
waiting for a wake operation on the futex. |
* The futex handle must have been created by subfunction 0 |
====================================================================== |
=============== Function -1 - terminate thread/process =============== |
====================================================================== |
Parameters: |
/kernel/branches/Kolibri-acpi/fs/fat.inc |
---|
1808,6 → 1808,8 |
mov ebx, [ebx+16] ; buffer |
push ebx |
push 0 |
test ecx, ecx |
jz .done |
mov eax, [edi+28] |
sub eax, edx |
jb .fileEnd |
1920,7 → 1922,7 |
jnz .noaccess3 |
pop ecx |
xor edx, edx |
jcxz .done |
jecxz .done |
jmp .alignedCluster |
.readEnd: |
add ecx, edi |
/kernel/branches/Kolibri-acpi/fs/fs_lfn.inc |
---|
20,6 → 20,7 |
ERROR_FS_FAIL = 9 |
ERROR_ACCESS_DENIED = 10 |
ERROR_DEVICE = 11 |
ERROR_OUT_OF_MEMORY = 12 |
image_of_eax EQU esp+32 |
image_of_ebx EQU esp+20 |
/kernel/branches/Kolibri-acpi/fs/ntfs.inc |
---|
37,6 → 37,8 |
recordFlags = 16h |
recordRealSize = 18h |
recordAllocatedSize = 1ch |
baseRecordReference = 20h ; for auxiliary records |
baseRecordReuse = 26h |
newAttributeID = 28h |
; attribute header |
attributeType = 0 |
44,9 → 46,10 |
nonResidentFlag = 8 |
nameLength = 9 |
nameOffset = 10 |
attributeFlags = 12 |
attributeID = 14 |
sizeWithoutHeader = 16 |
attributeFlags = 16h |
indexedFlag = 16h |
; non resident attribute header |
lastVCN = 18h |
dataRunsOffset = 20h |
111,8 → 114,8 |
indexOffset dd ? |
nodeLastRead dd ? |
ntfs_bCanContinue db ? |
ntfsNotFound db ? |
ntfsFolder db ? |
ntfsWriteAttr db ? ; Warning: Don't forget to turn off!!! |
ntfsFragmentCount db ? |
cur_subnode_size dd ? |
143,7 → 146,7 |
dd ntfs_ReadFile |
dd ntfs_ReadFolder |
dd ntfs_CreateFile |
dd ntfs_Write |
dd ntfs_WriteFile |
dd ntfs_SetFileEnd |
dd ntfs_GetFileInfo |
dd ntfs_SetFileInfo |
270,13 → 273,10 |
mov dword [eax+NTFS.FirstSector], ecx |
mov ecx, dword [ebp+PARTITION.FirstSector+4] |
mov dword [eax+NTFS.FirstSector+4], ecx |
mov ecx, dword [ebp+PARTITION.Length] |
mov dword [eax+NTFS.Length], ecx |
mov ecx, dword [ebp+PARTITION.Length+4] |
mov dword [eax+NTFS.Length+4], ecx |
mov ecx, [ebp+PARTITION.Disk] |
mov [eax+NTFS.Disk], ecx |
mov [eax+NTFS.FSUserFunctions], ntfs_user_functions |
mov [eax+NTFS.ntfsWriteAttr], 0 |
push ebx ebp esi |
mov ebp, eax |
544,6 → 544,7 |
ret |
ntfs_read_attr: |
; [ebp+NTFS.ntfsWriteAttr]=1 -> write attribute |
; in: |
; [ebp+NTFS.ntfs_cur_iRecord] = number of fileRecord |
; [ebp+NTFS.ntfs_cur_attr] = attribute type |
992,6 → 993,18 |
sub eax, [ecx+10h] ; first_vbo |
jb .okret |
; eax = cluster, edx = starting sector |
cmp [ebp+NTFS.ntfs_cur_attr], 0x80 |
jnz .sys |
cmp [ebp+NTFS.ntfs_cur_iRecord], 0 |
jz .sys |
push fs_read64_app |
cmp [ebp+NTFS.ntfsWriteAttr], 1 |
jnz @f |
mov dword[esp], fs_write64_app |
jmp @f |
.sys: |
push fs_read64_sys |
@@: |
sub esp, 10h |
movzx esi, word [ecx+20h] ; mcb_info_ofs |
add esi, ecx |
1021,15 → 1034,7 |
mov [ebp+NTFS.ntfsLastRead], eax |
push ecx |
xor edx, edx |
cmp [ebp+NTFS.ntfs_cur_attr], 0x80 |
jnz .sys |
cmp [ebp+NTFS.ntfs_cur_iRecord], 0 |
jz .sys |
call fs_read64_app |
jmp .appsys |
.sys: |
call fs_read64_sys |
.appsys: |
call dword[esp+18h] |
pop ecx |
test eax, eax |
jnz .errread2 |
1044,7 → 1049,7 |
xor edx, edx |
cmp [ebp+NTFS.ntfs_cur_size], 0 |
jnz .readloop |
add esp, 10h |
add esp, 14h |
mov eax, [ebp+NTFS.ntfs_cur_tail] |
test eax, eax |
jz @f |
1055,11 → 1060,11 |
ret |
.errread2: |
pop ecx |
add esp, 10h |
add esp, 14h |
stc |
ret |
.break: |
add esp, 10h ; CF=0 |
add esp, 14h ; CF=0 |
mov [ebp+NTFS.ntfs_bCanContinue], 1 |
ret |
1157,6 → 1162,14 |
ret |
ntfs_decode_mcb_entry: |
; in: |
; esi -> mcb entry |
; esp -> buffer (16 bytes) |
; out: |
; esi -> next mcb entry |
; esp -> data run size |
; esp+8 -> cluster (delta) |
; CF=0 -> mcb end |
push eax ecx edi |
lea edi, [esp+16] |
xor eax, eax |
1211,8 → 1224,8 |
; in: [esi]+[esp+4] = name |
; out: |
; [ebp+NTFS.ntfs_cur_iRecord] = number of MFT fileRecord |
; eax = pointer in parent index node |
; CF=1 -> file not found (or just error) |
; eax -> index in the parent index node |
; CF=1 -> file not found, eax=0 -> error |
mov [ebp+NTFS.ntfs_cur_iRecord], 5 ; start parse from root cluster |
.doit2: |
mov [ebp+NTFS.ntfs_cur_attr], 0x90 ; $INDEX_ROOT |
1222,11 → 1235,11 |
mov eax, [ebp+NTFS.cur_index_buf] |
mov [ebp+NTFS.ntfs_cur_buf], eax |
call ntfs_read_attr |
mov eax, 0 |
jnc @f |
.ret: |
ret 4 |
@@: |
xor eax, eax |
cmp [ebp+NTFS.ntfs_cur_read], 0x20 |
jc .ret |
pushad |
1345,7 → 1358,6 |
add esi, 0x18 |
jmp .scanloop |
.notfound: |
mov [ebp+NTFS.ntfsNotFound], 1 |
mov [esp+1Ch], esi |
.err: |
popad |
1470,7 → 1482,6 |
adc edx, 0 |
shrd eax, edx, 9 |
pop edx |
.zero1: |
mov [ebp+NTFS.ntfs_cur_offs], eax |
mov [ebp+NTFS.ntfs_cur_buf], edx |
mov eax, ecx |
1550,7 → 1561,7 |
test eax, eax |
jz .notfound |
or ebx, -1 |
push 11 |
push ERROR_DEVICE |
jmp .pop_ret |
.ok: |
cmp [ebp+NTFS.ntfs_cur_read], 0x20 |
1587,7 → 1598,7 |
call ntfs_unlock |
popad |
or ebx, -1 |
movi eax, 12 |
movi eax, ERROR_OUT_OF_MEMORY |
ret |
@@: |
mov [ebp+NTFS.cur_index_buf], eax |
1976,6 → 1987,7 |
ntfs_CreateFolder: |
mov [ebp+NTFS.ntfsFolder], 1 |
jmp @f |
ntfs_CreateFile: |
mov [ebp+NTFS.ntfsFolder], 0 |
@@: |
1982,36 → 1994,57 |
cmp byte [esi], 0 |
jnz @f |
xor ebx, ebx |
movi eax, ERROR_ACCESS_DENIED ; root directory itself |
movi eax, ERROR_ACCESS_DENIED |
ret |
@@: ; 1. Search file |
call ntfs_lock |
mov [ebp+NTFS.ntfsNotFound], 0 |
stdcall ntfs_find_lfn, [esp+4] |
jnc @f ; found; rewrite |
jnc .found |
cmp [ebp+NTFS.ntfsFragmentCount], 1 |
jnz @f ; record fragmented |
cmp [ebp+NTFS.ntfsNotFound], 1 |
jz .notFound |
push ERROR_FS_FAIL |
jmp ntfsError |
@@: |
push ERROR_UNSUPPORTED_FS |
jmp ntfsError |
.notFound: ; create; check name |
jnz ntfsUnsupported ; record fragmented |
test eax, eax |
jz ntfsFail |
jmp .notFound |
.found: ; rewrite |
cmp [ebp+NTFS.ntfs_cur_iRecord], 16 |
jc ntfsDenied |
cmp [ebp+NTFS.ntfsFolder], 1 |
jz ntfsDenied |
mov [ebp+NTFS.ntfs_cur_attr], 0x80 |
mov [ebp+NTFS.ntfs_cur_offs], 0 |
mov [ebp+NTFS.ntfs_cur_size], 0 |
call ntfs_read_attr |
jc ntfsDenied |
mov eax, [ebp+NTFS.frs_buffer] |
cmp word [eax+baseRecordReuse], 0 |
jnz ntfsUnsupported ; auxiliary record |
cmp byte [eax+hardLinkCounter], 1 |
jnz ntfsUnsupported ; file copying required |
mov ecx, [ebp+NTFS.ntfs_attr_offs] |
cmp byte [ecx+nonResidentFlag], 1 |
jnz ntfsUnsupported ; resident $DATA |
mov eax, [ebx+4] |
mov edx, [ebx+8] |
add eax, [ebx+12] |
adc edx, 0 |
cmp edx, [ecx+attributeRealSize+4] |
jnz ntfsUnsupported |
cmp [ecx+attributeRealSize], eax |
jnz ntfsUnsupported |
jmp ntfs_WriteFile.write |
.notFound: ; create; check path folders |
cmp dword [esp+4], 0 |
jnz .bad |
jnz ntfsNotFound |
cmp byte [esi], 0 |
jnz @f |
.bad: ; path folder not found |
push ERROR_FILE_NOT_FOUND |
jmp ntfsError |
@@: ; 2. Prepair directory record |
jz ntfsNotFound |
; 2. Prepare directory record |
mov ecx, esi |
@@: ; count characters |
inc ecx |
cmp byte [ecx], '/' |
jz .bad |
jz ntfsNotFound |
cmp byte [ecx], 0 |
jnz @b |
sub ecx, esi |
2022,16 → 2055,15 |
mov edi, [ebp+NTFS.cur_index_buf] |
push esi |
push ecx |
cmp dword [edi], 'INDX' ; where are we? |
cmp dword [edi], 'INDX' |
jz .indexRecord |
mov esi, [ebp+NTFS.frs_buffer] ; mftRecord |
mov esi, [ebp+NTFS.frs_buffer] ; indexRoot |
mov edx, [esi+recordRealSize] |
add edx, ecx |
cmp [esi+recordAllocatedSize], edx |
jnc @f |
add esp, 12 |
push ERROR_UNSUPPORTED_FS ; indexAllocation required |
jmp ntfsError |
jmp ntfsUnsupported ; indexAllocation required |
@@: ; index fits in the indexRoot |
mov [esi+recordRealSize], edx |
mov ecx, edx |
2043,7 → 2075,7 |
mov esi, [esp] |
add [edi+sizeWithHeader], esi |
add [edi+sizeWithoutHeader], esi |
mov cx, [edi+attributeOffset] |
mov cl, [edi+attributeOffset] |
add edi, ecx |
add [edi+16+nodeRealSize], esi |
add [edi+16+nodeAllocatedSize], esi |
2055,16 → 2087,15 |
jmp .common |
.indexRecord: |
mov edx, [edi+1ch] |
mov edx, [edi+28] |
add edx, ecx |
cmp [edi+20h], edx |
cmp [edi+32], edx |
jnc @f |
add esp, 12 |
push ERROR_UNSUPPORTED_FS ; new node required |
jmp ntfsError |
jmp ntfsUnsupported ; new node required |
@@: ; index fits in the node |
mov [edi+1ch], edx |
lea edi, [edi+edx+14h] |
mov [edi+28], edx |
lea edi, [edi+edx+24-4] |
.common: |
mov esi, edi |
sub esi, [esp] |
2124,7 → 2155,7 |
@@: ; 3. File data |
cmp [ebp+NTFS.fileRealSize], 0 |
jz .mftBitmap |
; One piece free space bitmap search engine |
; One piece free space bitmap search engine |
mov edi, [ebp+NTFS.BitmapBuffer] |
add edi, [ebp+NTFS.BitmapStart] |
mov eax, [ebp+NTFS.fileDataSize] |
2132,12 → 2163,10 |
jz .small |
push eax ; bitmap dwords |
add edi, 4 |
xor edx, edx |
.start: |
mov ecx, [ebp+NTFS.BitmapSize] |
mov eax, edi |
sub eax, [ebp+NTFS.BitmapBuffer] |
sub ecx, eax |
add ecx, [ebp+NTFS.BitmapBuffer] |
sub ecx, edi |
shr ecx, 2 |
@@: |
xor eax, eax |
2159,6 → 2188,7 |
jnz .start |
sub esi, 4 |
mov eax, [esi] |
xor edx, edx |
bsr edx, eax |
inc edx |
push edx ; starting bit |
2239,36 → 2269,34 |
mov [esp+4], ecx |
@@: |
mov edi, [esp] |
mov esi, [ebp+NTFS.fileDataSize] |
mov edx, [edi] |
ror edx, cl |
xor eax, eax |
dec eax |
shr eax, cl |
shl eax, cl |
neg ecx |
add ecx, 32 |
mov eax, -1 |
sub esi, ecx |
jnc @f |
mov esi, ecx ; fits inside |
mov ecx, [ebp+NTFS.fileDataSize] |
shrd edx, eax, cl |
sub esi, ecx |
mov ecx, esi |
ror edx, cl |
mov [edi], edx |
sub ecx, [ebp+NTFS.fileDataSize] |
jc @f |
shl eax, cl ; fits inside dword |
shr eax, cl |
or [edi], eax |
jmp .writeData |
@@: |
shrd edx, eax, cl |
mov [edi], edx |
mov ecx, esi |
or [edi], eax |
neg ecx |
push ecx |
shr ecx, 5 |
add edi, 4 |
xor eax, eax |
dec eax |
rep stosd |
mov ecx, esi |
pop ecx |
and ecx, 31 |
mov edx, [edi] |
shr edx, cl |
shld edx, eax, cl |
mov [edi], edx |
shr eax, cl |
shl eax, cl |
not eax |
or [edi], eax |
.writeData: |
pop edx |
sub edx, [ebp+NTFS.BitmapBuffer] |
2284,10 → 2312,7 |
mov ebx, [ebx+16] |
call fs_write64_app |
test eax, eax |
jz .mftBitmap |
push 11 |
jmp ntfsError |
jnz ntfsDevice |
; 4. MFT record |
.mftBitmap: ; search for free record |
mov edi, [ebp+NTFS.mftBitmapBuffer] |
2300,14 → 2325,9 |
movzx eax, byte [edi] |
not al |
bsf ecx, eax |
jnz @f |
push ERROR_UNSUPPORTED_FS ; no free records |
jmp ntfsError |
@@: ; mark record |
mov al, [edi] |
bts eax, ecx |
mov [edi], al |
; get record location |
jz ntfsUnsupported ; no free records |
bts [edi], ecx |
; get record location |
sub edi, [ebp+NTFS.mftBitmapBuffer] |
shl edi, 3 |
add edi, ecx |
2324,21 → 2344,24 |
call ntfs_read_attr |
cmp [ebp+NTFS.ntfs_cur_read], 0 |
jnz .mftRecord |
; extend MFT $DATA |
; extend MFT $DATA |
mov eax, [ebp+NTFS.mft_cluster] |
mul [ebp+NTFS.sectors_per_cluster] |
push ERROR_UNSUPPORTED_FS |
cmp eax, [ebp+NTFS.ntfsLastRead] |
jnz ntfsError ; auxiliary record |
jnz ntfsUnsupported ; auxiliary record |
mov edi, [ebp+NTFS.ntfs_attr_offs] |
mov ebx, [ebp+NTFS.sectors_per_cluster] |
shl ebx, 9+3 |
add dword [edi+lastVCN], 8 |
add [edi+attributeAllocatedSize], ebx |
adc byte [edi+attributeAllocatedSize+4], 0 |
add [edi+attributeRealSize], ebx |
adc byte [edi+attributeRealSize+4], 0 |
add [edi+initialDataSize], ebx |
add edi, [edi+dataRunsOffset] |
movzx eax, byte [edi] |
adc byte [edi+initialDataSize+4], 0 |
movzx eax, byte [edi+dataRunsOffset] |
add edi, eax |
mov al, [edi] |
inc edi |
shl eax, 4 |
shr al, 4 |
2348,13 → 2371,13 |
add ah, al |
shr eax, 8 |
cmp byte [edi+eax], 0 |
jnz ntfsError ; $MFT fragmented |
jnz ntfsUnsupported ; $MFT fragmented |
mov al, 8 |
mov edx, [edi] |
rol eax, cl |
rol edx, cl |
add eax, edx |
jc ntfsError |
jc ntfsUnsupported |
ror eax, cl |
shr edx, cl |
mov [edi], eax |
2364,17 → 2387,16 |
and ecx, 7 |
shr edx, 3 |
add edx, [ebp+NTFS.BitmapBuffer] |
movzx eax, word [edx] |
shr eax, cl |
jnz ntfsError |
mov al, -1 |
mov ax, [edx] |
shr ax, cl |
test al, al |
jnz ntfsUnsupported |
dec al |
xchg [edx], al |
mov [edx+1], al |
pop eax |
push 12 |
stdcall kernel_alloc, ebx |
test eax, eax |
jz ntfsError |
jz ntfsNoMemory |
mov ecx, ebx |
shr ecx, 2 |
mov edi, eax |
2388,8 → 2410,6 |
shr ecx, 9 |
call fs_write64_sys ; clear new records |
stdcall kernel_free, ebx |
pop eax |
push 11 |
mov eax, esi |
shr eax, 3+9 |
mov ebx, eax |
2400,12 → 2420,12 |
xor edx, edx |
call fs_write64_app ; partition bitmap |
test eax, eax |
jnz ntfsError |
jnz ntfsDevice |
mov eax, [ebp+NTFS.frs_buffer] |
mov [ebp+NTFS.ntfs_cur_buf], eax |
call writeRecord ; $MFT |
test eax, eax |
jnz ntfsError |
jnz ntfsDevice |
mov eax, [ebp+NTFS.mftmirr_cluster] |
mul [ebp+NTFS.sectors_per_cluster] |
mov ebx, [ebp+NTFS.frs_buffer] |
2413,8 → 2433,7 |
dec ecx |
call fs_write64_sys ; $MFTMirr |
test eax, eax |
jnz ntfsError |
pop eax |
jnz ntfsDevice |
mov eax, [ebp+NTFS.ntfs_cur_offs] |
add [ebp+NTFS.ntfsLastRead], eax |
.mftRecord: |
2427,7 → 2446,7 |
shr ecx, 2 |
rep stosd |
mov edi, [ebp+NTFS.frs_buffer] |
; record header |
; record header |
mov dword[edi], 'FILE' |
mov byte [edi+updateSequenceOffset], 2ah |
mov byte [edi+updateSequenceSize], 3 |
2439,13 → 2458,13 |
rdtsc |
mov [edi+2ah], ax |
add edi, 30h |
; $StandardInformation |
; $StandardInformation |
mov byte [edi+attributeType], 10h |
mov byte [edi+sizeWithHeader], 48h |
mov byte [edi+sizeWithoutHeader], 30h |
mov byte [edi+attributeOffset], 18h |
add edi, 48h |
; $FileName |
; $FileName |
mov byte [edi+attributeType], 30h |
mov byte [edi+attributeID], 1 |
mov cx, [esi+indexRawSize] |
2454,7 → 2473,7 |
add ecx, 8 |
mov [edi+sizeWithHeader], ecx |
mov byte [edi+attributeOffset], 18h |
mov byte [edi+attributeFlags], 1 |
mov byte [edi+indexedFlag], 1 |
add edi, 18h |
add esi, 16 |
sub ecx, 18h |
2462,7 → 2481,7 |
rep movsd |
cmp [ebp+NTFS.ntfsFolder], 0 |
jnz @f |
; $Data |
; $Data |
mov byte [edi+attributeType], 80h |
cmp [ebp+NTFS.fileRealSize], 0 |
jz .zeroSize |
2497,19 → 2516,17 |
mov byte [edi+attributeOffset], 20h |
mov dword[edi+18h], 490024h ; unicode $I30 |
mov dword[edi+18h+4], 300033h |
add edi, 20h |
mov byte [edi+attributeType], 30h |
mov byte [edi+collationRule], 1 |
mov byte [edi+20h+attributeType], 30h |
mov byte [edi+20h+collationRule], 1 |
mov eax, [ebp+NTFS.sectors_per_cluster] |
shl eax, 9 |
mov [edi+indexRecordSize], eax |
mov byte [edi+indexRecordSizeClus], 1 |
mov byte [edi+16+indexOffset], 16 |
mov byte [edi+16+nodeRealSize], 32 |
mov byte [edi+16+nodeAllocatedSize], 32 |
mov byte [edi+32+indexAllocatedSize], 16 |
mov byte [edi+32+indexFlags], 2 |
sub edi, 20h |
mov [edi+20h+indexRecordSize], eax |
mov byte [edi+20h+indexRecordSizeClus], 1 |
mov byte [edi+30h+indexOffset], 16 |
mov byte [edi+30h+nodeRealSize], 32 |
mov byte [edi+30h+nodeAllocatedSize], 32 |
mov byte [edi+40h+indexAllocatedSize], 16 |
mov byte [edi+40h+indexFlags], 2 |
mov al, 3 |
.writeMftRecord: |
mov byte [edi+sizeWithHeader], 50h |
2520,13 → 2537,10 |
mov [ebp+NTFS.ntfs_cur_buf], edi |
call writeRecord |
test eax, eax |
jz @f |
push 11 |
jmp ntfsError |
@@: |
jnz ntfsDevice |
mov esi, [ebp+PARTITION.Disk] |
call disk_sync |
; write MFT bitmap |
; write MFT bitmap |
mov eax, [ebp+NTFS.newMftRecord] |
shr eax, 3+9 |
mov ebx, eax |
2537,10 → 2551,8 |
xor edx, edx |
call fs_write64_sys |
test eax, eax |
jz @f |
push 11 |
jmp ntfsError |
@@: ; 5. Write partition bitmap |
jnz ntfsDevice |
; 5. Write partition bitmap |
cmp [ebp+NTFS.ntfsFolder], 0 |
jnz @f |
cmp [ebp+NTFS.fileRealSize], 0 |
2559,9 → 2571,7 |
xor edx, edx |
call fs_write64_app |
test eax, eax |
jz @f |
push 11 |
jmp ntfsError |
jnz ntfsDevice |
@@: |
mov esi, [ebp+PARTITION.Disk] |
call disk_sync |
2568,18 → 2578,20 |
mov edi, [ebp+NTFS.indexOffset] |
mov eax, [ebp+NTFS.newMftRecord] |
mov [edi+fileRecordReference], eax |
; 6. Write directory node |
; 6. Write directory node |
mov eax, [ebp+NTFS.nodeLastRead] |
mov [ebp+NTFS.ntfsLastRead], eax |
mov eax, [ebp+NTFS.cur_index_buf] |
mov [ebp+NTFS.ntfs_cur_buf], eax |
call writeRecord |
push eax |
test eax, eax |
jnz ntfsDevice |
mov ebx, [ebp+NTFS.fileRealSize] |
ntfsDone: |
mov esi, [ebp+PARTITION.Disk] |
call disk_sync |
call ntfs_unlock |
pop eax |
mov ebx, [ebp+NTFS.fileRealSize] |
xor eax, eax |
ret |
writeRecord: |
2602,7 → 2614,7 |
mov [esi-2], ax |
dec ecx |
jnz @b |
; writing to disk |
; writing to disk |
mov eax, [ebp+NTFS.ntfsLastRead] |
mov ebx, [ebp+NTFS.ntfs_cur_buf] |
pop ecx |
2612,6 → 2624,8 |
bitmapBuffering: |
; Extend BitmapBuffer and read next 32kb of bitmap |
; Warning: $Bitmap fragmentation is not foreseen |
; if edi -> position in bitmap buffer, |
; then ecx = number of buffered dwords left |
push ebx |
mov eax, [ebp+NTFS.BitmapTotalSize] |
cmp eax, [ebp+NTFS.BitmapSize] |
2641,9 → 2655,8 |
mov [ebp+NTFS.BitmapSize], eax |
@@: |
mov ecx, [ebp+NTFS.BitmapSize] |
mov eax, edi |
sub eax, [ebp+NTFS.BitmapBuffer] |
sub ecx, eax |
add ecx, [ebp+NTFS.BitmapBuffer] |
sub ecx, edi |
shr ecx, 2 |
pop ebx |
ret |
2656,19 → 2669,327 |
.end: |
add esp, 12 ; double ret |
push ERROR_DISK_FULL |
jmp ntfsError |
jmp ntfsOut |
;---------------------------------------------------------------- |
ntfs_Write: |
ntfs_WriteFile: |
cmp byte [esi], 0 |
jnz @f |
xor ebx, ebx |
mov eax, ERROR_UNSUPPORTED_FS |
movi eax, ERROR_ACCESS_DENIED |
ret |
@@: |
call ntfs_lock |
stdcall ntfs_find_lfn, [esp+4] |
jc ntfsNotFound |
cmp [ebp+NTFS.ntfs_cur_iRecord], 16 |
jc ntfsDenied |
mov [ebp+NTFS.ntfs_cur_attr], 0x80 |
mov [ebp+NTFS.ntfs_cur_offs], 0 |
mov [ebp+NTFS.ntfs_cur_size], 0 |
call ntfs_read_attr |
jc ntfsDenied |
mov eax, [ebp+NTFS.frs_buffer] |
cmp word [eax+baseRecordReuse], 0 |
jnz ntfsUnsupported ; auxiliary record |
cmp byte [eax+hardLinkCounter], 1 |
jnz ntfsUnsupported ; file copying required |
mov ecx, [ebp+NTFS.ntfs_attr_offs] |
cmp byte [ecx+nonResidentFlag], 1 |
jnz ntfsUnsupported ; resident $DATA |
cmp word [ecx+attributeFlags], 0 |
jnz ntfsUnsupported |
mov eax, [ebx+4] |
mov edx, [ebx+8] |
add eax, [ebx+12] |
adc edx, 0 |
cmp edx, [ecx+attributeRealSize+4] |
jc .write |
jnz ntfsUnsupported ; end of file |
cmp [ecx+attributeRealSize], eax |
jc ntfsUnsupported |
.write: |
mov eax, [ebx+4] |
mov edx, [ebx+8] |
mov ecx, [ebx+12] |
mov esi, [ebx+16] |
shrd eax, edx, 9 |
test dword[ebx+4], 1FFh |
jz .aligned |
mov [ebp+NTFS.ntfs_cur_offs], eax |
mov [ebp+NTFS.ntfs_cur_size], 1 |
lea edi, [ebp+NTFS.ntfs_bitmap_buf] |
mov [ebp+NTFS.ntfs_cur_buf], edi |
call ntfs_read_attr.continue |
jc ntfsDevice |
mov eax, [ebx+4] |
and eax, 1FFh |
add edi, eax |
sub eax, [ebp+NTFS.ntfs_cur_read] |
neg eax |
push ecx |
cmp ecx, eax |
jb @f |
mov ecx, eax |
@@: |
sub [esp], ecx |
rep movsb |
push ebx |
mov eax, [ebp+NTFS.ntfsLastRead] |
lea ebx, [ebp+NTFS.ntfs_bitmap_buf] |
mov ecx, 1 |
xor edx, edx |
call fs_write64_app |
pop ebx |
pop ecx |
test eax, eax |
jnz ntfsDevice |
test ecx, ecx |
jz @f |
mov eax, [ebx+4] |
mov edx, [ebx+8] |
shrd eax, edx, 9 |
inc eax |
.aligned: |
push ecx |
shr ecx, 9 |
mov [ebp+NTFS.ntfs_cur_offs], eax |
mov [ebp+NTFS.ntfs_cur_size], ecx |
mov [ebp+NTFS.ntfs_cur_buf], esi |
add eax, ecx |
push eax |
mov [ebp+NTFS.ntfsWriteAttr], 1 |
call ntfs_read_attr.continue |
mov [ebp+NTFS.ntfsWriteAttr], 0 |
pop [ebp+NTFS.ntfs_cur_offs] |
pop ecx |
jc ntfsDevice |
and ecx, 1FFh |
jz @f |
add esi, [ebp+NTFS.ntfs_cur_read] |
mov [ebp+NTFS.ntfs_cur_size], 1 |
lea edi, [ebp+NTFS.ntfs_bitmap_buf] |
mov [ebp+NTFS.ntfs_cur_buf], edi |
call ntfs_read_attr.continue |
jc ntfsDevice |
rep movsb |
push ebx |
mov eax, [ebp+NTFS.ntfsLastRead] |
lea ebx, [ebp+NTFS.ntfs_bitmap_buf] |
mov ecx, 1 |
xor edx, edx |
call fs_write64_app |
pop ebx |
test eax, eax |
jnz ntfsDevice |
@@: |
mov ebx, [ebx+12] |
jmp ntfsDone |
;---------------------------------------------------------------- |
ntfs_Delete: |
cmp byte [esi], 0 |
jnz @f |
xor ebx, ebx |
movi eax, ERROR_ACCESS_DENIED |
ret |
@@: |
call ntfs_lock |
stdcall ntfs_find_lfn, [esp+4] |
jc ntfsNotFound |
cmp [ebp+NTFS.ntfs_cur_iRecord], 16 |
jc ntfsDenied |
cmp [ebp+NTFS.ntfsFragmentCount], 1 |
jnz ntfsUnsupported ; record fragmented |
test byte [eax+indexFlags], 1 |
jnz ntfsUnsupported ; index has a subnode |
mov edx, [ebp+NTFS.ntfs_cur_iRecord] |
shr edx, 3 |
cmp edx, [ebp+NTFS.mftBitmapSize] |
jnc ntfsUnsupported |
; delete index from the node |
movzx edx, word [eax+indexAllocatedSize] |
mov edi, [ebp+NTFS.cur_index_buf] |
cmp dword [edi], 'INDX' |
jz .indexRecord |
mov esi, [ebp+NTFS.frs_buffer] ; indexRoot |
mov ecx, [esi+recordRealSize] |
shr ecx, 2 |
rep movsd |
mov esi, [ebp+NTFS.cur_index_buf] |
mov edi, [ebp+NTFS.ntfs_attr_offs] |
sub edi, [ebp+NTFS.frs_buffer] |
add edi, esi |
sub [edi+sizeWithHeader], edx |
sub [edi+sizeWithoutHeader], edx |
mov cl, [edi+attributeOffset] |
add edi, ecx |
sub [edi+16+nodeRealSize], edx |
sub [edi+16+nodeAllocatedSize], edx |
sub eax, esi |
add eax, edi |
sub [esi+recordRealSize], edx |
mov ecx, [esi+recordRealSize] |
jmp @f |
.indexRecord: |
sub [edi+28], edx |
mov ecx, [edi+28] |
add ecx, 24 |
@@: |
add ecx, [ebp+NTFS.cur_index_buf] |
sub ecx, eax |
shr ecx, 2 |
mov esi, eax |
add esi, edx |
mov edi, eax |
rep movsd |
mov eax, [ebp+NTFS.ntfsLastRead] |
mov [ebp+NTFS.nodeLastRead], eax |
; examine file record |
mov [ebp+NTFS.ntfs_cur_attr], 0x80 |
mov [ebp+NTFS.ntfs_cur_offs], 0 |
mov [ebp+NTFS.ntfs_cur_size], 0 |
call ntfs_read_attr |
jc .folder |
mov esi, [ebp+NTFS.frs_buffer] |
cmp word [esi+baseRecordReuse], 0 |
jnz ntfsUnsupported ; auxiliary record |
cmp byte [esi+hardLinkCounter], 2 |
jnc .writeFileRecord ; delete hard link |
mov esi, [ebp+NTFS.ntfs_attr_offs] |
cmp byte [esi+nonResidentFlag], 0 |
jz .writeBitmapMFT |
movzx eax, byte [esi+dataRunsOffset] |
add esi, eax |
xor edi, edi |
sub esp, 16 |
.clearBitmap: ; "delete" file data |
call ntfs_decode_mcb_entry |
jnc .mcbEnd |
cmp dword[esp+8], 0 |
jz .clearBitmap |
add edi, [esp+8] |
mov ebx, [esp] |
mov eax, edi |
add eax, ebx |
shr eax, 3 |
inc eax |
cmp eax, [ebp+NTFS.BitmapSize] |
jc .buffered |
add eax, [ebp+NTFS.BitmapBuffer] |
add esp, 16 |
push edi |
mov edi, eax |
@@: |
call bitmapBuffering |
shl ecx, 2 |
js @b |
pop edi |
sub esp, 16 |
.buffered: |
push edi |
mov ecx, edi |
shr edi, 5 |
shl edi, 2 |
add edi, [ebp+NTFS.BitmapBuffer] |
and ecx, 31 |
xor eax, eax |
dec eax |
shr eax, cl |
shl eax, cl |
neg ecx |
add ecx, 32 |
sub ecx, ebx |
jc @f |
shl eax, cl ; fits inside dword |
shr eax, cl |
not eax |
and [edi], eax |
jmp .writeBitmap |
@@: |
not eax |
and [edi], eax |
neg ecx |
push ecx |
shr ecx, 5 |
add edi, 4 |
xor eax, eax |
rep stosd |
pop ecx |
and ecx, 31 |
dec eax |
shr eax, cl |
shl eax, cl |
and [edi], eax |
.writeBitmap: |
pop edi |
mov ecx, edi |
add ecx, ebx |
add ecx, 4095 |
shr ecx, 3+9 |
mov eax, edi |
shr eax, 3+9 |
sub ecx, eax |
mov ebx, eax |
shl ebx, 9 |
add eax, [ebp+NTFS.BitmapLocation] |
add ebx, [ebp+NTFS.BitmapBuffer] |
xor edx, edx |
call fs_write64_app |
jmp .clearBitmap |
.mcbEnd: |
add esp, 16 |
jmp .writeBitmapMFT |
.folder: ; empty? |
lea esi, [ebp+NTFS.ntfs_bitmap_buf] |
mov [ebp+NTFS.ntfs_cur_buf], esi |
mov [ebp+NTFS.ntfs_cur_attr], 0x90 |
mov [ebp+NTFS.ntfs_cur_offs], 0 |
mov [ebp+NTFS.ntfs_cur_size], 1 |
call ntfs_read_attr |
cmp [ebp+NTFS.ntfs_cur_read], 48 |
jnz ntfsDenied |
test byte [esi+32+indexFlags], 1 |
jnz ntfsDenied |
.writeBitmapMFT: ; "delete" file record |
mov eax, [ebp+NTFS.ntfs_cur_iRecord] |
mov ecx, eax |
shr eax, 3 |
and ecx, 7 |
mov edi, [ebp+NTFS.mftBitmapBuffer] |
btr [edi+eax], ecx |
shr eax, 9 |
mov ebx, eax |
shl ebx, 9 |
add eax, [ebp+NTFS.mftBitmapLocation] |
add ebx, edi |
mov ecx, 1 |
xor edx, edx |
call fs_write64_sys |
mov esi, [ebp+NTFS.frs_buffer] |
mov byte [esi+recordFlags], 0 |
.writeFileRecord: |
dec byte [esi+hardLinkCounter] |
mov [ebp+NTFS.ntfs_cur_buf], esi |
call writeRecord |
; write directory node |
mov eax, [ebp+NTFS.nodeLastRead] |
mov [ebp+NTFS.ntfsLastRead], eax |
mov eax, [ebp+NTFS.cur_index_buf] |
mov [ebp+NTFS.ntfs_cur_buf], eax |
call writeRecord |
test eax, eax |
jz ntfsDone |
jmp ntfsDevice |
;---------------------------------------------------------------- |
ntfs_SetFileEnd: |
ntfs_SetFileInfo: |
ntfs_Delete: |
mov eax, ERROR_UNSUPPORTED_FS |
movi eax, ERROR_UNSUPPORTED_FS |
ret |
;---------------------------------------------------------------- |
2675,19 → 2996,16 |
ntfs_GetFileInfo: |
cmp byte [esi], 0 |
jnz @f |
movi eax, 2 |
movi eax, ERROR_UNSUPPORTED_FS |
ret |
@@: |
call ntfs_lock |
stdcall ntfs_find_lfn, [esp+4] |
jnc .doit |
jnc .found |
test eax, eax |
push ERROR_FILE_NOT_FOUND |
jz ntfsError |
pop eax |
push 11 |
jmp ntfsError |
.doit: |
jz ntfsFail |
jmp ntfsNotFound |
.found: |
push esi edi |
mov esi, eax |
mov edi, [ebx+16] |
2698,8 → 3016,25 |
xor eax, eax |
ret |
ntfsError: |
ntfsUnsupported: |
push ERROR_UNSUPPORTED_FS |
ntfsOut: |
call ntfs_unlock |
xor ebx, ebx |
pop eax |
ret |
ntfsDevice: |
push ERROR_DEVICE |
jmp ntfsOut |
ntfsNotFound: |
push ERROR_FILE_NOT_FOUND |
jmp ntfsOut |
ntfsDenied: |
push ERROR_ACCESS_DENIED |
jmp ntfsOut |
ntfsFail: |
push ERROR_FS_FAIL |
jmp ntfsOut |
ntfsNoMemory: |
push ERROR_OUT_OF_MEMORY |
jmp ntfsOut |
/kernel/branches/Kolibri-acpi/gui/button.inc |
---|
1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
8,10 → 8,6 |
$Revision$ |
;============================================================================== |
;///// public functions /////////////////////////////////////////////////////// |
;============================================================================== |
button.MAX_BUTTONS = 4095 |
struct SYS_BUTTON |
25,12 → 21,11 |
dw ? |
ends |
align 4 |
;------------------------------------------------------------------------------ |
syscall_button: ;///// system function 8 ////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
syscall_button: ;////////////// system function 8 ////////////// |
;--------------------------------------------------------------- |
;? Define/undefine GUI button object |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
;; Define button: |
;> ebx = pack[16(x), 16(width)] |
;> ecx = pack[16(y), 16(height)] |
40,12 → 35,12 |
;> 6 (30) = don't draw button |
;> 5 (29) = don't draw button frame when pressed |
;> esi = button color |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
;; Undefine button: |
;> edx = pack[8(flags), 24(button identifier)] |
;> flags bits: |
;> 7 (31) = 1 |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
; do we actually need to undefine the button? |
test edx, 0x80000000 |
jnz .remove_button |
74,13 → 69,12 |
pop eax |
; basic checks passed, define the button |
push ebx ecx edx |
inc eax |
mov [edi], ax |
shl eax, 4 |
add edi, eax |
; NOTE: this code doesn't rely on SYS_BUTTON struct, please revise it |
; if you change something |
; NOTE: this code doesn't rely on SYS_BUTTON struct, |
; please revise it, if you change something. |
mov ax, [CURRENT_TASK] |
stosw |
mov ax, dx |
94,18 → 88,52 |
mov eax, edx |
shr eax, 16 |
stosw ; button id number: bits 16-31 |
pop edx ecx ebx |
; do we also need to draw the button? |
test edx, 0x40000000 |
jnz .exit |
; draw button body |
and esi, 0xFFFFFF |
xor edi, edi |
push ebx ecx esi |
dec cx |
dec cx |
cmp [buttontype], 1 |
jnz .draw |
cmp cx, 65 |
jnc .draw |
pushad |
; calculate gradient data |
mov eax, esi |
shl eax, 8 |
mov edx, 3 |
.calculate: |
rol eax, 8 |
shl al, 1 |
jnc @f |
neg al |
jnz @f |
mov al, 64 |
@@: |
cmp al, 65 |
jc @f |
mov al, 64 |
@@: |
div cl |
shl ax, 8 |
dec edx |
jnz .calculate |
mov dl, cl |
dec edx |
shr edx, 1 |
shr eax, 8 |
mov edi, eax |
mul edx |
add esi, eax |
; calculate window-relative coordinates |
movzx edi, cx |
.draw: ; calculate window-relative coordinates |
movzx ebp, cx |
dec ebp |
shr ebx, 16 |
shr ecx, 16 |
mov eax, [TASK_BASE] |
113,110 → 141,73 |
add ecx, [eax - twdw + WDATA.box.top] |
mov eax, ebx |
inc eax |
shl eax, 16 |
mov ax, bx |
add ax, word[esp + 16] |
dec ax |
mov edx, ebx |
add dx, [esp+8] |
dec edx |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
; calculate initial color |
mov ecx, esi |
cmp [buttontype], 0 |
je @f |
call button._.incecx2 |
; set button height counter |
@@: |
mov edx, edi |
add ebx, 0x00010001 |
dec edx |
.next_line: |
call button._.button_dececx |
push edi |
shr ecx, 1 |
and cx, 7F7Fh |
push esi |
mov esi, edi |
xor edi, edi |
; call [draw_line] |
call __sys_draw_line |
pop edi |
add ebx, 0x00010001 |
dec edx |
call hline ; top border |
inc ebx |
or ecx, 808080h |
call hline ; top light line |
pop ecx |
inc ebx |
.next_line: |
call hline ; button body |
inc ebx |
sub ecx, esi |
dec ebp |
jnz .next_line |
popad |
; draw button frame |
push ebx ecx |
; calculate window-relative coordinates |
shr ebx, 16 |
shr ecx, 16 |
mov eax, [TASK_BASE] |
add ebx, [eax - twdw + WDATA.box.left] |
add ecx, [eax - twdw + WDATA.box.top] |
; top border |
mov eax, ebx |
shl eax, 16 |
mov ax, bx |
add ax, [esp + 4] |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
push ebx |
xor edi, edi |
mov ecx, esi |
call button._.incecx |
; call [draw_line] |
call __sys_draw_line |
; bottom border |
movzx edx, word[esp + 4 + 0] |
add ebx, edx |
shl edx, 16 |
add ebx, edx |
mov ecx, esi |
call button._.dececx |
; call [draw_line] |
call __sys_draw_line |
; left border |
pop ebx |
shr ecx, 2 |
and cx, 3F3Fh |
mov ebp, ecx |
shl ecx, 1 |
add ecx, ebp |
call hline ; bottom dark line |
inc ebx |
sub ecx, ebp |
call hline ; bottom border |
pop ecx |
shr ecx, 1 |
inc edx |
push edx |
mov edx, eax |
shr edx, 16 |
mov ax, dx |
mov edx, ebx |
shr edx, 16 |
mov bx, dx |
add bx, [esp + 4 + 0] |
pop edx |
mov ecx, esi |
call button._.incecx |
; call [draw_line] |
dec ebx |
call __sys_draw_line |
; right border |
mov dx, [esp + 4] |
add ax, dx |
shl edx, 16 |
add eax, edx |
add ebx, 0x00010000 |
mov ecx, esi |
call button._.dececx |
; call [draw_line] |
call __sys_draw_line |
sub bx, [esp+4] |
dec edx |
inc ebx |
cmp [buttontype], 0 |
jnz @f |
dec edx |
or ecx, 808080h |
call vline ; left light line |
inc edx |
@@: |
and ecx, 7F7F7Fh |
dec eax |
call vline ; left border |
pop eax |
call vline ; right border |
cmp [buttontype], 0 |
jnz @f |
mov ebp, ecx |
shr ecx, 1 |
and cx, 7F7Fh |
add ecx, ebp |
dec eax |
inc ebx |
call vline ; right dark line |
@@: |
pop ecx ebx |
.exit: |
.exit: |
ret |
; FIXME: mutex needed |
syscall_button.remove_button: |
.remove_button: |
and edx, 0x00ffffff |
mov edi, [BTN_ADDR] |
mov ebx, [edi] |
227,7 → 218,7 |
add ecx, -sizeof.SYS_BUTTON |
add esi, sizeof.SYS_BUTTON |
.next_button: |
.next_button: |
dec ebx |
jz .exit |
256,87 → 247,19 |
pop ebx |
jmp .next_button |
.exit: |
ret |
align 4 |
;------------------------------------------------------------------------------ |
sys_button_activate_handler: ;///////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
sys_button_activate_handler: |
sys_button_deactivate_handler: |
;--------------------------------------------------------------- |
;> eax = pack[8(process slot), 24(button id)] |
;> ebx = pack[16(button x coord), 16(button y coord)] |
;> cl = mouse button mask this system button was pressed with |
;------------------------------------------------------------------------------ |
call button._.find_button |
or eax, eax |
jz .exit |
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
call button._.negative_button |
.exit: |
ret |
align 4 |
;------------------------------------------------------------------------------ |
sys_button_deactivate_handler: ;/////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;> eax = pack[8(process slot), 24(button id)] |
;> ebx = pack[16(button x coord), 16(button y coord)] |
;> cl = mouse button mask this system button was pressed with |
;------------------------------------------------------------------------------ |
call button._.find_button |
or eax, eax |
jz .exit |
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
call button._.negative_button |
.exit: |
ret |
align 4 |
;------------------------------------------------------------------------------ |
sys_button_perform_handler: ;////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
;> eax = pack[8(process slot), 24(button id)] |
;> ebx = pack[16(button x coord), 16(button y coord)] |
;> cl = mouse button mask this system button was pressed with |
;------------------------------------------------------------------------------ |
shl eax, 8 |
mov al, cl |
movzx ebx, byte[BTN_COUNT] |
mov [BTN_BUFF + ebx * 4], eax |
inc bl |
mov [BTN_COUNT], bl |
ret |
;============================================================================== |
;///// private functions ////////////////////////////////////////////////////// |
;============================================================================== |
;------------------------------------------------------------------------------ |
button._.find_button: ;//////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Find system button by specified process slot, id and coordinates |
;------------------------------------------------------------------------------ |
;> eax = pack[8(process slot), 24(button id)] or 0 |
;> ebx = pack[16(button x coord), 16(button y coord)] |
;------------------------------------------------------------------------------ |
;< eax = pointer to SYS_BUTTON struct or 0 |
;------------------------------------------------------------------------------ |
;--------------------------------------------------------------- |
; find system button by specified process slot, id and coordinates |
push ecx edx esi edi |
mov edx, eax |
shr edx, 24 |
and eax, 0x0ffffff |
mov edi, [BTN_ADDR] |
mov ecx, [edi] |
imul esi, ecx, sizeof.SYS_BUTTON |
343,11 → 266,9 |
add esi, edi |
inc ecx |
add esi, sizeof.SYS_BUTTON |
.next_button: |
.next_button: |
dec ecx |
jz .not_found |
jz .popexit |
add esi, -sizeof.SYS_BUTTON |
; does it belong to our process? |
367,147 → 288,58 |
cmp ebx, edi |
jne .next_button |
; okay, return it |
mov eax, esi |
jmp .exit |
.not_found: |
xor eax, eax |
.exit: |
pop edi esi edx ecx |
ret |
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] |
;------------------------------------------------------------------------------ |
button._.dececx: ;///////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
sub cl, 0x20 |
jnc @f |
xor cl, cl |
@@: |
sub ch, 0x20 |
jnc @f |
xor ch, ch |
@@: |
rol ecx, 16 |
sub cl, 0x20 |
jnc @f |
xor cl, cl |
@@: |
rol ecx, 16 |
ret |
; display button border on press? |
bt ebx, 29 |
jc .exit |
;------------------------------------------------------------------------------ |
button._.incecx: ;///////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
add cl, 0x20 |
jnc @f |
or cl, -1 |
@@: |
add ch, 0x20 |
jnc @f |
or ch, -1 |
@@: |
rol ecx, 16 |
add cl, 0x20 |
jnc @f |
or cl, -1 |
@@: |
rol ecx, 16 |
ret |
;------------------------------------------------------------------------------ |
button._.incecx2: ;//////////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
add cl, 0x14 |
jnc @f |
or cl, -1 |
@@: |
add ch, 0x14 |
jnc @f |
or ch, -1 |
@@: |
rol ecx, 16 |
add cl, 0x14 |
jnc @f |
or cl, -1 |
@@: |
rol ecx, 16 |
ret |
;------------------------------------------------------------------------------ |
button._.button_dececx: ;////////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? <description> |
;------------------------------------------------------------------------------ |
cmp [buttontype], 1 |
jne .finish |
push eax |
mov al, 1 |
cmp edi, 20 |
jg @f |
mov al, 2 |
@@: |
sub cl, al |
jnc @f |
xor cl, cl |
@@: |
sub ch, al |
jnc @f |
xor ch, ch |
@@: |
rol ecx, 16 |
sub cl, al |
jnc @f |
xor cl, cl |
@@: |
rol ecx, 16 |
pop eax |
.finish: |
ret |
;------------------------------------------------------------------------------ |
button._.negative_button: ;//////////////////////////////////////////////////// |
;------------------------------------------------------------------------------ |
;? Invert system button border |
;------------------------------------------------------------------------------ |
; if requested, do not display button border on press. |
test ebx, 0x20000000 |
jnz .exit |
; invert system button border |
pushad |
xchg esi, eax |
mov esi, eax |
mov edi, ebx |
movzx ecx, [esi + SYS_BUTTON.pslot] |
shl ecx, 5 |
add ecx, window_data |
mov eax, dword[esi + SYS_BUTTON.left] |
mov ebx, dword[esi + SYS_BUTTON.top] |
add eax, [ecx + WDATA.box.left] |
add ebx, [ecx + WDATA.box.top] |
push eax ebx |
pop edx ecx |
mov ecx, eax |
mov edx, ebx |
bt edi, 30 |
jc @f |
inc ax |
inc bx |
dec cx |
dec dx |
@@: |
rol eax, 16 |
rol ebx, 16 |
add ax, cx |
add bx, dx |
mov esi, 0x01000000 |
mov esi, 1000000h |
call draw_rectangle.forced |
popad |
.exit: |
ret |
.popexit: |
pop edi esi edx ecx |
ret |
.exit: |
;--------------------------------------------------------------- |
sys_button_perform_handler: |
;--------------------------------------------------------------- |
;> eax = pack[8(process slot), 24(button id)] |
;> ebx = pack[16(button x coord), 16(button y coord)] |
;> cl = mouse button mask this system button was pressed with |
;--------------------------------------------------------------- |
shl eax, 8 |
mov al, cl |
movzx ebx, byte[BTN_COUNT] |
mov [BTN_BUFF + ebx * 4], eax |
inc bl |
mov [BTN_COUNT], bl |
ret |
/kernel/branches/Kolibri-acpi/gui/font.inc |
---|
241,7 → 241,7 |
.drawPicture: |
mov eax, -1 |
repz scasd |
jcxz @f |
jecxz @f |
mov eax, edx |
sub eax, ecx |
push ecx |
/kernel/branches/Kolibri-acpi/gui/skincode.inc |
---|
101,7 → 101,6 |
xor eax, eax |
cld |
rep stosd |
mov ebx, [ebp+SKIN_HEADER.params] |
add ebx, [skin_data] |
mov eax, [ebx+SKIN_PARAMS.skin_height] |
127,11 → 126,8 |
mov dword[_skinmargins+0], eax |
mov eax, dword[ebx+SKIN_PARAMS.margin.bottom] |
mov dword[_skinmargins+4], eax |
mov ebx, [ebp+SKIN_HEADER.bitmaps] |
add ebx, [skin_data] |
;-------------------------------------- |
align 4 |
.lp1: |
cmp dword[ebx], 0 |
je .end_bitmaps |
142,11 → 138,8 |
xor eax, eax |
mov edx, skin_active.left.data |
or ecx, ecx |
jnz @f |
jnz .next_bitmap |
mov edx, skin_inactive.left.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
159,11 → 152,8 |
neg eax |
mov edx, skin_active.oper.data |
or ecx, ecx |
jnz @f |
jnz .next_bitmap |
mov edx, skin_inactive.oper.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
173,12 → 163,9 |
mov eax, [skin_active.left.width] |
mov edx, skin_active.base.data |
or ecx, ecx |
jnz @f |
jnz .next_bitmap |
mov eax, [skin_inactive.left.width] |
mov edx, skin_inactive.base.data |
;-------------------------------------- |
align 4 |
@@: |
jmp .next_bitmap |
;-------------------------------------- |
align 4 |
202,8 → 189,6 |
.end_bitmaps: |
mov ebx, [ebp+SKIN_HEADER.buttons] |
add ebx, [skin_data] |
;-------------------------------------- |
align 4 |
.lp2: |
cmp dword[ebx], 0 |
je .end_buttons |
245,13 → 230,10 |
;------------------------------------------------------------------------------ |
align 4 |
drawwindow_IV_caption: |
mov ebp, skin_active |
or al, al |
jnz @f |
mov ebp, skin_inactive |
;-------------------------------------- |
align 4 |
@@: |
mov esi, [esp+4] |
mov eax, [esi+WDATA.box.width] ; window width |
260,13 → 242,10 |
mov ecx, [ebp+SKIN_DATA.left.width] |
shl ecx, 16 |
add ecx, [_skinh] |
mov ebx, [ebp+SKIN_DATA.left.data] |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
mov esi, [esp+4] |
mov eax, [esi+WDATA.box.width] |
278,9 → 257,7 |
mov ecx, [ebp+SKIN_DATA.base.width] |
jecxz .non_base |
div ecx |
inc eax |
mov ebx, [ebp+SKIN_DATA.base.data] |
mov ecx, [ebp+SKIN_DATA.base.width] |
shl ecx, 16 |
288,8 → 265,6 |
mov edx, [ebp+SKIN_DATA.base.left] |
sub edx, [ebp+SKIN_DATA.base.width] |
shl edx, 16 |
;-------------------------------------- |
align 4 |
.baseskinloop: |
shr edx, 16 |
add edx, [ebp+SKIN_DATA.base.width] |
296,21 → 271,15 |
shl edx, 16 |
push eax ebx ecx edx |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
pop edx ecx ebx eax |
dec eax |
jnz .baseskinloop |
;-------------------------------------- |
align 4 |
.non_base: |
mov esi, [esp+4] |
mov edx, [esi+WDATA.box.width] |
sub edx, [ebp+SKIN_DATA.oper.width] |
317,16 → 286,12 |
inc edx |
shl edx, 16 |
mov ebx, [ebp+SKIN_DATA.oper.data] |
mov ecx, [ebp+SKIN_DATA.oper.width] |
shl ecx, 16 |
add ecx, [_skinh] |
or ebx, ebx |
jz @f |
call sys_putimage.forced |
;-------------------------------------- |
align 4 |
@@: |
ret |
;------------------------------------------------------------------------------ |
334,17 → 299,12 |
drawwindow_IV: |
;param1 - aw_yes |
pusha |
push edx |
mov edi, edx |
mov ebp, skin_active |
cmp byte [esp+32+4+4], 0 |
jne @f |
mov ebp, skin_inactive |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [edi+WDATA.box.left] |
shl eax, 16 |
362,8 → 322,6 |
rol ebx, 16 |
call draw_rectangle |
mov ecx, 3 |
;-------------------------------------- |
align 4 |
_dw3l: |
add eax, 1*65536-1 |
add ebx, 0*65536-1 |
387,8 → 345,6 |
test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP |
jnz @f |
call draw_rectangle |
;-------------------------------------- |
align 4 |
@@: |
mov eax, [skin_data] |
cmp [eax], dword 'SKIN' |
400,7 → 356,6 |
inc ecx |
mov edx, [_skinh] |
mov edi, [common_colours+4]; standard grab color |
; call [drawbar] |
call vesa20_drawbar |
jmp draw_clientbar |
;-------------------------------------- |
408,11 → 363,8 |
@@: |
mov al, [esp+32+4+4] |
call drawwindow_IV_caption |
;-------------------------------------- |
align 4 |
draw_clientbar: |
mov esi, [esp] |
mov edx, [esi+WDATA.box.top] ; WORK AREA |
add edx, 21+5 |
mov ebx, [esi+WDATA.box.top] |
428,10 → 380,7 |
mov edi, [esi+WDATA.cl_workarea] |
test edi, 0x40000000 |
jnz _noinside2 |
; call [drawbar] |
call vesa20_drawbar |
;-------------------------------------- |
align 4 |
_noinside2: |
mov eax, [skin_data] |
cmp [eax], dword 'SKIN' |
443,39 → 392,30 |
jge no_skin_add_button |
inc eax |
mov [edi], ax |
shl eax, 4 |
add eax, edi |
mov bx, [CURRENT_TASK] |
mov [eax], bx |
add eax, 2 ; save button id number |
mov bx, 1 |
mov [eax], bx |
add eax, 2 ; x start |
mov word [eax+2], 1 ; button id |
xor ebx, ebx |
cmp [skin_btn_close.left], 0 |
jge _bCx_at_right |
jge @f |
mov ebx, [esp] |
mov ebx, [ebx+WDATA.box.width] |
inc ebx |
;-------------------------------------- |
align 4 |
_bCx_at_right: |
@@: |
add ebx, [skin_btn_close.left] |
mov [eax], bx |
add eax, 2 ; x size |
mov word [eax+4], bx ; x start |
mov ebx, [skin_btn_close.width] |
dec ebx |
mov [eax], bx |
add eax, 2 ; y start |
mov word [eax+6], bx ; x size |
mov ebx, [skin_btn_close.top] |
mov [eax], bx |
add eax, 2 ; y size |
mov word [eax+8], bx ; y start |
mov ebx, [skin_btn_close.height] |
dec ebx |
mov [eax], bx |
mov word [eax+10], bx ; y size |
bts word [eax+12], 14 |
;* minimize button |
mov edi, [BTN_ADDR] |
movzx eax, word [edi] |
483,43 → 423,31 |
jge no_skin_add_button |
inc eax |
mov [edi], ax |
shl eax, 4 |
add eax, edi |
mov bx, [CURRENT_TASK] |
mov [eax], bx |
add eax, 2 ; save button id number |
mov bx, 65535;999 |
mov [eax], bx |
add eax, 2 ; x start |
mov word [eax+2], -1 ; button id |
xor ebx, ebx |
cmp [skin_btn_minimize.left], 0 |
jge _bMx_at_right |
jge @f |
mov ebx, [esp] |
mov ebx, [ebx+WDATA.box.width] |
inc ebx |
;-------------------------------------- |
align 4 |
_bMx_at_right: |
@@: |
add ebx, [skin_btn_minimize.left] |
mov [eax], bx |
add eax, 2 ; x size |
mov word [eax+4], bx ; x start |
mov ebx, [skin_btn_minimize.width] |
dec ebx |
mov [eax], bx |
add eax, 2 ; y start |
mov word [eax+6], bx ; x size |
mov ebx, [skin_btn_minimize.top] |
mov [eax], bx |
add eax, 2 ; y size |
mov word [eax+8], bx ; y start |
mov ebx, [skin_btn_minimize.height] |
dec ebx |
mov [eax], bx |
;-------------------------------------- |
align 4 |
mov word [eax+10], bx ; y size |
bts word [eax+12], 14 |
no_skin_add_button: |
pop edi |
popa |
ret 4 |
;------------------------------------------------------------------------------ |
/kernel/branches/Kolibri-acpi/hid/mousedrv.inc |
---|
551,9 → 551,9 |
endp |
;----------------------------------------------------------------------------- |
; 3 = x^2 /2 |
; 2 = (x+1)^2 /4 |
; 1 = (x+2)^2 /8 |
; 3 = (x+1)^2 /4 |
; 2 = (x+2)^2 /8 |
; 1 = (x+3)^2 /16 |
align 4 |
mouse_acceleration: |
cmp [mouse_delay], 0 |
562,13 → 562,13 |
@@: |
neg eax |
jl @b |
inc eax |
cmp [mouse_delay], 3 |
adc eax, 0 |
cmp [mouse_delay], 2 |
adc eax, 0 |
mul al |
shr eax, 1 |
adc eax, 0 |
shr eax, 2 |
cmp [mouse_delay], 2 |
jz .2 |
jnc .3 |
/kernel/branches/Kolibri-acpi/kernel.asm |
---|
996,8 → 996,6 |
; mov esi, boot_devices |
; call boot_log |
call clear_pci_ide_interrupts |
include "detect/vortex86.inc" ; Vortex86 SoC detection code |
stdcall load_pe_driver, szVidintel, 0 |
2167,7 → 2165,7 |
pusha |
mov edx, [TASK_BASE] |
mov edx, [edx+TASKDATA.pid] |
call SOCKET_process_end |
call socket_process_end |
popa |
;-------------------------------------- |
mov ecx, [current_slot] |
2297,7 → 2295,7 |
; terminate all network sockets it used |
pusha |
mov eax, edx |
call SOCKET_process_end |
call socket_process_end |
popa |
;-------------------------------------- |
cmp [_display.select_cursor], 0 |
/kernel/branches/Kolibri-acpi/network/ARP.inc |
---|
70,14 → 70,12 |
;----------------------------------------------------------------- |
; |
; ARP_init |
; |
; This function resets all ARP variables |
; |
;----------------------------------------------------------------- |
macro ARP_init { |
;-----------------------------------------------------------------; |
; ; |
; arp_init: Resets all ARP variables. ; |
; ; |
;-----------------------------------------------------------------; |
macro arp_init { |
xor eax, eax |
mov edi, ARP_entries_num |
86,14 → 84,13 |
} |
;--------------------------------------------------------------------------- |
; |
; ARP_decrease_entry_ttls |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_decrease_entry_ttls ; |
; ; |
;-----------------------------------------------------------------; |
macro arp_decrease_entry_ttls { |
macro ARP_decrease_entry_ttls { |
local .loop |
local .exit |
135,7 → 132,7 |
je .response_timeout |
push esi edi ecx |
call ARP_del_entry |
call arp_del_entry |
pop ecx edi esi |
jmp .next |
154,20 → 151,21 |
} |
;----------------------------------------------------------------- |
; |
; ARP_input |
; |
; IN: Pointer to buffer in [esp] |
; size of buffer in [esp+4] |
; packet size (without ethernet header) in ecx |
; packet ptr in edx |
; device ptr in ebx |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_input ; |
; ; |
; IN: [esp] = Pointer to buffer ; |
; [esp+4] = size of buffer ; |
; ecx = packet size (without ethernet header) ; |
; edx = packet ptr ; |
; ebx = device ptr ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_input: |
arp_input: |
;----------------------------------------- |
; Check validity and print some debug info |
175,7 → 173,7 |
cmp ecx, sizeof.ARP_header |
jb .exit |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
cmp edi, -1 |
jz .exit |
294,21 → 292,21 |
.exit: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_input: exiting\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
;--------------------------------------------------------------------------- |
; |
; ARP_output_request |
; |
; IN: ebx = device ptr |
; eax = IP |
; OUT: / |
; scratched: probably everything |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_output_request ; |
; ; |
; IN: ebx = device ptr ; |
; eax = IP ; |
; ; |
; OUT: scratched: probably everything ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_output_request: |
arp_output_request: |
push eax |
318,7 → 316,7 |
mov ax, ETHER_PROTO_ARP |
mov ecx, sizeof.ARP_header |
mov edx, ETH_BROADCAST ; broadcast mac |
call ETH_output |
call eth_output |
jz .exit |
mov [edi + ARP_header.HardwareType], 0x0100 ; Ethernet |
333,7 → 331,7 |
movsd ; |
push edi |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [ARP_PACKETS_TX + edi] ; assume we will succeed |
lea esi, [IP_LIST + edi] ; SenderIP |
pop edi |
354,19 → 352,23 |
ret |
;----------------------------------------------------------------- |
; |
; ARP_add_entry (or update) |
; |
; IN: esi = ptr to entry (can easily be made on the stack) |
; edi = device num*4 |
; OUT: eax = entry #, -1 on error |
; esi = ptr to newly created entry |
; |
;----------------------------------------------------------------- ; TODO: use a mutex |
;-----------------------------------------------------------------; |
; ; |
; arp_add_entry: Add or update an entry in the ARP table. ; |
; ; |
; IN: esi = ptr to entry (can easily be made on the stack) ; |
; edi = device num*4 ; |
; ; |
; OUT: eax = entry number on success ; |
; eax = -1 on error ; |
; esi = ptr to newly created entry ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_add_entry: |
arp_add_entry: |
; TODO: use a mutex to lock ARP table |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: device=%u\n", edi |
mov ecx, [ARP_entries_num + edi] |
421,19 → 423,22 |
ret |
;----------------------------------------------------------------- |
; |
; ARP_del_entry |
; |
; IN: esi = ptr to arp entry |
; edi = device number |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_del_entry: Remove an entry from the ARP table. ; |
; ; |
; IN: esi = ptr to arp entry ; |
; edi = device number ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_del_entry: |
arp_del_entry: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=%x entrys=%u\n", esi, [ARP_entries_num + 4*edi] |
; TODO: use a mutex to lock ARP table |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=0x%x entrys=%u\n", esi, [ARP_entries_num + 4*edi] |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: IP=%u.%u.%u.%u\n", \ |
[esi + ARP_entry.IP]:1, [esi + ARP_entry.IP + 1]:1, [esi + ARP_entry.IP + 2]:1, [esi + ARP_entry.IP + 3]:1 |
463,22 → 468,22 |
;----------------------------------------------------------------- |
; |
; ARP_IP_to_MAC |
; |
; This function translates an IP address to a MAC address |
; |
; IN: eax = IPv4 address |
; edi = device number * 4 |
; OUT: eax = -1 on error, -2 means request send |
; else, ax = first two bytes of mac (high 16 bits of eax will be 0) |
; ebx = last four bytes of mac |
; edi = unchanged |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_ip_to_mac: Translate an IP address to a MAC address. ; |
; ; |
; IN: eax = IPv4 address ; |
; edi = device number * 4 ; |
; ; |
; OUT: eax = -1 on error ; |
; eax = -2 when request send ; |
; eax = first two bytes of mac on success ; |
; ebx = last four bytes of mac on success ; |
; edi = unchanged ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_IP_to_MAC: |
arp_ip_to_mac: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: %u.%u", al, ah |
rol eax, 16 |
513,11 → 518,11 |
pushw ARP_AWAITING_RESPONSE ; status |
pushd 0 ; mac |
pushw 0 |
pushd eax ; ip |
pushd eax ; IP |
mov esi, esp |
; Add it to the list |
call ARP_add_entry |
call arp_add_entry |
; Delete the temporary entry |
add esp, sizeof.ARP_entry ; clear the entry from stack |
534,7 → 539,7 |
push esi edi |
mov ebx, [NET_DRV_LIST + edi] |
call ARP_output_request |
call arp_output_request |
pop edi esi |
.found_it: |
cmp [esi + ARP_entry.Status], ARP_VALID_MAPPING ; Does it have a MAC assigned? |
576,21 → 581,19 |
ret |
;----------------------------------------------------------------- |
; |
; ARP_API |
; |
; This function is called by system function 76 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: ? |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; arp_api: Part of system function 76. ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: depends on subfunction ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ARP_api: |
arp_api: |
movzx eax, bh |
shl eax, 2 |
650,7 → 653,7 |
.write: |
; esi = pointer to buffer |
mov edi, eax |
call ARP_add_entry ; out: eax = entry number, -1 on error |
call arp_add_entry ; out: eax = entry number, -1 on error |
ret |
.remove: |
661,12 → 664,12 |
lea esi, [ARP_table + ecx] |
mov edi, eax |
shr edi, 2 |
call ARP_del_entry |
call arp_del_entry |
ret |
.send_announce: |
mov ebx, [NET_DRV_LIST + eax] |
mov eax, [IP_LIST + eax] |
call ARP_output_request ; now send a gratuitous ARP |
call arp_output_request ; now send a gratuitous ARP |
ret |
/kernel/branches/Kolibri-acpi/network/IPv4.inc |
---|
16,7 → 16,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5842 $ |
$Revision: 6011 $ |
IPv4_MAX_FRAGMENTS = 64 |
IPv4_MAX_ROUTES = 64 |
92,14 → 92,12 |
endg |
;----------------------------------------------------------------- |
; |
; IPv4_init |
; |
; This function resets all IP variables |
; |
;----------------------------------------------------------------- |
macro IPv4_init { |
;-----------------------------------------------------------------; |
; ; |
; ipv4_init: Resets all IPv4 variables ; |
; ; |
;-----------------------------------------------------------------; |
macro ipv4_init { |
xor eax, eax |
mov edi, IP_LIST |
109,12 → 107,12 |
} |
;----------------------------------------------------------------- |
; |
; Decrease TimeToLive of all fragment slots |
; |
;----------------------------------------------------------------- |
macro IPv4_decrease_fragment_ttls { |
;-----------------------------------------------------------------; |
; ; |
; Decrease TimeToLive of all fragment slots ; |
; ; |
;-----------------------------------------------------------------; |
macro ipv4_decrease_fragment_ttls { |
local .loop, .next |
141,7 → 139,7 |
macro IPv4_checksum ptr { |
macro ipv4_checksum ptr { |
; This is the fast procedure to create or check an IP header without options |
; To create a new checksum, the checksum field must be set to 0 before computation |
205,24 → 203,22 |
;----------------------------------------------------------------- |
; |
; IPv4_input: |
; |
; Will check if IPv4 Packet isnt damaged |
; and call appropriate handler. (TCP/UDP/ICMP/..) |
; |
; It will also re-construct fragmented packets |
; |
; IN: Pointer to buffer in [esp] |
; pointer to device struct in ebx |
; pointer to IPv4 header in edx |
; size of IPv4 packet in ecx |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_input: Check if IPv4 Packet isnt damaged and call ; |
; appropriate handler. (TCP/UDP/ICMP/..) ; |
; We will also re-construct fragmented packets. ; |
; ; |
; IN: Pointer to buffer in [esp] ; |
; pointer to device struct in ebx ; |
; pointer to IPv4 header in edx ; |
; size of IPv4 packet in ecx ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_input: |
ipv4_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: packet from %u.%u.%u.%u ",\ |
[edx + IPv4_header.SourceAddress + 0]:1,[edx + IPv4_header.SourceAddress + 1]:1,\ |
231,7 → 227,7 |
[edx + IPv4_header.DestinationAddress + 0]:1,[edx + IPv4_header.DestinationAddress + 1]:1,\ |
[edx + IPv4_header.DestinationAddress + 2]:1,[edx + IPv4_header.DestinationAddress + 3]:1 |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
cmp edi, -1 |
je .invalid_device |
238,7 → 234,7 |
;------------------------------- |
; re-calculate the checksum |
IPv4_checksum edx |
ipv4_checksum edx |
jnz .dump ; if checksum isn't valid then dump packet |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: Checksum ok\n" |
304,13 → 300,13 |
add esi, edx ; make esi ptr to data |
cmp al, IP_PROTO_TCP |
je TCP_input |
je tcp_input |
cmp al, IP_PROTO_UDP |
je UDP_input |
je udp_input |
cmp al, IP_PROTO_ICMP |
je ICMP_input |
je icmp_input |
;------------------------------- |
; Look for a matching RAW socket |
347,7 → 343,7 |
call mutex_lock |
popa |
jmp SOCKET_input |
jmp socket_input |
.dump_unlock: |
361,12 → 357,12 |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: dumping\n" |
inc [IPv4_packets_dumped + edi] |
call NET_BUFF_free |
call net_buff_free |
ret |
.invalid_device: |
DEBUGF DEBUG_NETWORK_ERROR, "IPv4_input: packet originated from invalid device\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
390,7 → 386,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: Middle fragment packet received!\n" |
call IPv4_find_fragment_slot |
call ipv4_find_fragment_slot |
cmp esi, -1 |
je .dump |
455,7 → 451,7 |
.is_last_fragment: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: Last fragment packet received!\n" |
call IPv4_find_fragment_slot |
call ipv4_find_fragment_slot |
cmp esi, -1 |
je .dump |
546,7 → 542,7 |
push [edx + IPv4_FRAGMENT_entry.NextPtr] ; Set edx to the next pointer |
push edx ; Push pointer to fragment onto stack |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_input: Next Fragment: 0x%x\n", edx |
call NET_BUFF_free ; free the previous fragment buffer (this uses the value from stack) |
call net_buff_free ; free the previous fragment buffer (this uses the value from stack) |
pop edx ebx eax |
cmp edx, -1 ; Check if it is last fragment in chain |
jne .rebuild_packet_loop |
571,16 → 567,17 |
;----------------------------------------------------------------- |
; |
; find fragment slot |
; |
; IN: pointer to fragmented packet in edx |
; OUT: pointer to slot in esi, -1 on error |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_find_fragment_slot ; |
; ; |
; IN: pointer to fragmented packet in edx ; |
; ; |
; OUT: pointer to slot in esi, -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_find_fragment_slot: |
ipv4_find_fragment_slot: |
;;; TODO: the RFC says we should check protocol number too |
607,26 → 604,27 |
ret |
;------------------------------------------------------------------ |
; |
; IPv4_output |
; |
; IN: al = protocol |
; ah = TTL |
; ebx = device ptr (or 0 to let IP layer decide) |
; ecx = data length |
; edx = Source IP |
; edi = Destination IP |
; |
; OUT: eax = pointer to buffer start / 0 on error |
; ebx = device ptr (send packet through this device) |
; ecx = data length |
; edx = size of complete frame |
; edi = start of IPv4 payload |
; |
;------------------------------------------------------------------ |
;------------------------------------------------------------------; |
; ; |
; ipv4_output ; |
; ; |
; IN: al = protocol ; |
; ah = TTL ; |
; ebx = device ptr (or 0 to let IP layer decide) ; |
; ecx = data length ; |
; edx = Source IP ; |
; edi = Destination IP ; |
; ; |
; OUT: eax = pointer to buffer start ; |
; eax = 0 on error ; |
; ebx = device ptr (send packet through this device) ; |
; ecx = data length ; |
; edx = size of complete frame ; |
; edi = start of IPv4 payload ; |
; ; |
;------------------------------------------------------------------; |
align 4 |
IPv4_output: |
ipv4_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u ip=0x%x\n", ecx, eax |
635,12 → 633,12 |
push ecx ax edi |
mov eax, edi |
call IPv4_route ; outputs device number in edi, dest ip in eax, source IP in edx |
call ipv4_route ; outputs device number in edi, dest ip in eax, source IP in edx |
push edx |
test edi, edi |
jz .loopback |
call ARP_IP_to_MAC |
call arp_ip_to_mac |
test eax, 0xffff0000 ; error bits |
jnz .arp_error |
push ebx ; push the mac onto the stack |
653,7 → 651,7 |
mov ecx, [esp + 6 + 8 + 2] |
add ecx, sizeof.IPv4_header |
mov edx, esp |
call ETH_output |
call eth_output |
jz .eth_error |
add esp, 6 ; pop the mac out of the stack |
674,7 → 672,7 |
pop ecx |
IPv4_checksum edi |
ipv4_checksum edi |
add edi, sizeof.IPv4_header |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: success!\n" |
ret |
704,25 → 702,25 |
mov ecx, [esp + 10] |
add ecx, sizeof.IPv4_header |
mov edi, AF_INET4 |
call LOOP_output |
call loop_output |
jmp .continue |
;------------------------------------------------------------------ |
; |
; IPv4_output_raw |
; |
; IN: eax = socket ptr |
; ecx = data length |
; esi = data ptr |
; |
; OUT: eax = -1 on error |
; |
;------------------------------------------------------------------ |
;------------------------------------------------------------------; |
; ; |
; ipv4_output_raw ; |
; ; |
; IN: eax = socket ptr ; |
; ecx = data length ; |
; esi = data ptr ; |
; ; |
; OUT: eax = -1 on error ; |
; ; |
;------------------------------------------------------------------; |
align 4 |
IPv4_output_raw: |
ipv4_output_raw: |
DEBUGF 1,"IPv4_output_raw: size=%u ptr=%x socket=%x\n", ecx, esi, eax |
729,8 → 727,8 |
sub esp, 8 |
push esi eax |
call IPv4_route |
call ARP_IP_to_MAC |
call ipv4_route |
call arp_ip_to_mac |
test eax, 0xffff0000 ; error bits |
jnz .arp_error |
744,7 → 742,7 |
mov ecx, [esp + 6 + 4] |
add ecx, sizeof.IPv4_header |
mov edx, esp |
call ETH_output |
call eth_output |
jz .error |
add esp, 6 ; pop the mac |
772,7 → 770,7 |
; [edi + IPv4_header.SourceAddress] |
; [edi + IPv4_header.DestinationAddress] |
IPv4_checksum edi ;;;; todo: checksum for IP packet with options! |
ipv4_checksum edi ;;;; todo: checksum for IP packet with options! |
add edi, sizeof.IPv4_header |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output_raw: device=%x\n", ebx |
call [ebx + NET_DEVICE.transmit] |
791,17 → 789,18 |
ret |
;-------------------------------------------------------- |
; |
; |
; IN: [esp] = pointer to buffer containing ipv4 packet to be fragmented |
; edi = pointer to ip header in that buffer |
; ebx = device ptr |
; |
; OUT: / |
; |
;-------------------------------------------------------- |
proc IPv4_fragment stdcall buffer |
;-----------------------------------------------------------------; |
; ; |
; ipv4_fragment ; |
; ; |
; IN: [esp] = ptr to packet buffer to fragment ; |
; edi = ptrr to ip header in that buffer ; |
; ebx = device ptr ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
proc ipv4_fragment stdcall buffer |
locals |
offset dd ? |
910,22 → 909,24 |
;--------------------------------------------------------------------------- |
; |
; IPv4_route |
; |
; IN: eax = Destination IP |
; ebx = outgoing device / 0 |
; edx = Source IP |
; OUT: eax = Destination IP (or gateway IP) |
; edx = Source IP |
; edi = device number*4 |
; DESTROYED: |
; ecx |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_route ; |
; ; |
; IN: eax = Destination IP ; |
; ebx = outgoing device / 0 ; |
; edx = Source IP ; |
; ; |
; OUT: eax = Destination IP (or gateway IP) ; |
; edx = Source IP ; |
; edi = device number*4 ; |
; ; |
; DESTROYED: ; |
; ecx ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_route: ; TODO: return error if no valid route found |
ipv4_route: ; TODO: return error if no valid route found |
test ebx, ebx |
jnz .got_device |
961,7 → 962,7 |
.got_device: |
; Validate device ptr and convert to device number |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
cmp edi, -1 |
je .fail |
982,32 → 983,35 |
;--------------------------------------------------------------------------- |
; |
; IPv4_get_frgmnt_num |
; |
; IN: / |
; OUT: fragment number in ax |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_get_frgmnt_num ; |
; ; |
; IN: / ; |
; ; |
; OUT: ax = fragment number ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_get_frgmnt_num: |
ipv4_get_frgmnt_num: |
xor ax, ax ;;; TODO: replace this with real code |
ret |
;----------------------------------------------------------------- |
; |
; IPv4_connect |
; |
; IN: eax = socket pointer |
; OUT: eax = 0 ok / -1 error |
; ebx = error code |
; |
;------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_connect ; |
; ; |
; IN: eax = socket pointer ; |
; ; |
; OUT: eax = 0 on success ; |
; eax = -1 on error ; |
; ebx = error code on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_connect: |
ipv4_connect: |
push eax edx |
lea ecx, [eax + SOCKET.mutex] |
1031,21 → 1035,19 |
ret |
;--------------------------------------------------------------------------- |
; |
; IPv4_API |
; |
; This function is called by system function 75 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv4_API: Part of system function 76. ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: depends on subfunction ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv4_api: |
ipv4_api: |
movzx eax, bh |
shl eax, 2 |
1096,9 → 1098,9 |
mov ebx, [NET_DRV_LIST + eax] |
mov eax, [IP_LIST + eax] |
call ARP_output_request ; now send a gratuitous ARP |
call arp_output_request ; now send a gratuitous ARP |
call NET_send_event |
call net_send_event |
xor eax, eax |
ret |
1108,7 → 1110,7 |
.write_dns: |
mov [DNS_LIST + eax], ecx |
call NET_send_event |
call net_send_event |
xor eax, eax |
ret |
1125,7 → 1127,7 |
or ecx, ebx |
mov [BROADCAST_LIST + eax], ecx |
call NET_send_event |
call net_send_event |
xor eax, eax |
ret |
1136,6 → 1138,6 |
.write_gateway: |
mov [GATEWAY_LIST + eax], ecx |
call NET_send_event |
call net_send_event |
xor eax, eax |
ret |
/kernel/branches/Kolibri-acpi/network/IPv6.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5522 $ |
$Revision: 6011 $ |
struct IPv6_header |
45,14 → 45,12 |
endg |
;----------------------------------------------------------------- |
; |
; IPv6_init |
; |
; This function resets all IP variables |
; |
;----------------------------------------------------------------- |
macro IPv6_init { |
;-----------------------------------------------------------------; |
; ; |
; ipv6_init: Resets all IPv6 variables ; |
; ; |
;-----------------------------------------------------------------; |
macro ipv6_init { |
xor eax, eax |
mov edi, IPv6 |
63,25 → 61,23 |
;----------------------------------------------------------------- |
; |
; IPv6_input: |
; |
; Will check if IPv6 Packet isnt damaged |
; and call appropriate handler. (TCP/UDP/ICMP/..) |
; |
; It will also re-construct fragmented packets |
; |
; IN: Pointer to buffer in [esp] |
; size of buffer in [esp+4] |
; pointer to device struct in ebx |
; pointer to IPv6 header in edx |
; size of IPv6 packet in ecx |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv6_input: Check if IPv6 Packet isnt damaged and call ; |
; appropriate handler. (TCP/UDP/ICMP/..) ; |
; We will also re-construct fragmented packets ; |
; ; |
; IN: [esp] = ptr to buffer ; |
; [esp+4] = size of buffer ; |
; ebx = ptr to device struct ; |
; edx = ptr to IPv6 header ; |
; ecx = size of IPv6 packet ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv6_input: |
ipv6_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv6_input from: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x\n",\ |
[edx + IPv6_header.SourceAddress + 0]:2,[edx + IPv6_header.SourceAddress + 1]:2,\ |
147,7 → 143,7 |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv6_input - dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
.dump_options: |
245,21 → 241,19 |
;--------------------------------------------------------------------------- |
; |
; IPv6_API |
; |
; This function is called by system function 75 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ipv6_api: Part of system function 76 ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: depends on subfunction ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
IPv6_api: |
ipv6_api: |
movzx eax, bh |
shl eax, 2 |
/kernel/branches/Kolibri-acpi/network/PPPoE.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5522 $ |
$Revision: 6011 $ |
struct PPPoE_frame |
33,37 → 33,33 |
endg |
;----------------------------------------------------------------- |
; |
; PPPoE_init |
; |
; This function resets all IP variables |
; |
;----------------------------------------------------------------- |
macro PPPoE_init { |
;-----------------------------------------------------------------; |
; ; |
; pppoe_init: Reset all pppoe variables ; |
; ; |
;-----------------------------------------------------------------; |
macro pppoe_init { |
call PPPoE_stop_connection |
call pppoe_stop_connection |
} |
;----------------------------------------------------------------- |
; |
; PPPoE discovery input |
; |
; Handler of received Ethernet packet with type = Discovery |
; |
; |
; IN: Pointer to buffer in [esp] |
; size of buffer in [esp+4] |
; pointer to device struct in ebx |
; pointer to PPP header in edx |
; size of PPP packet in ecx |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; pppoe_discovery_input ; |
; ; |
; IN: [esp] = ptr to buffer ; |
; [esp+4] = size of buffer ; |
; ebx = ptr to device struct ; |
; ecx = size of PPP packet ; |
; edx = ptr to PPP header ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
PPPoE_discovery_input: |
pppoe_discovery_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_input\n" |
97,7 → 93,7 |
mov ecx, [esp + 4] |
mov esi, [esp] |
jmp SOCKET_input |
jmp socket_input |
.dump: |
pusha |
106,22 → 102,21 |
popa |
DEBUGF DEBUG_NETWORK_VERBOSE, 'PPPoE_discovery_input: dumping\n' |
call NET_BUFF_free |
call net_buff_free |
ret |
;-------------------------------------- |
; |
; Send discovery packet |
; |
; IN: eax = socket pointer |
; ecx = number of bytes to send |
; esi = pointer to data |
; |
;-------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; pppoe_discovery_output ; |
; ; |
; IN: eax = socket pointer ; |
; ecx = number of bytes to send ; |
; esi = pointer to data ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
PPPoE_discovery_output: |
pppoe_discovery_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: socket=%x buffer=%x size=%d\n", eax, esi, ecx |
147,7 → 142,7 |
; Create packet. |
push ecx esi |
stdcall kernel_alloc, 1500 |
;;;; FIXME stdcall kernel_alloc, 1500 |
pop esi ecx |
test eax, eax |
jz .bad |
185,23 → 180,21 |
ret |
;----------------------------------------------------------------- |
; |
; PPPoE session input |
; |
; Handler of received Ethernet packet with type = Session |
; |
; |
; IN: Pointer to buffer in [esp] |
; size of buffer in [esp+4] |
; pointer to device struct in ebx |
; pointer to PPP header in edx |
; size of PPP packet in ecx |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; pppoe_session_input ; |
; ; |
; IN: [esp] = ptr to buffer ; |
; [esp+4] = size of buffer ; |
; ebx = ptr to device struct ; |
; edx = ptr to PPP header ; |
; ecx = size of PPP packet ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
PPPoE_session_input: |
pppoe_session_input: |
cmp [edx + PPPoE_frame.VersionAndType], 0x11 |
jne .dump |
221,38 → 214,39 |
add edx, PPPoE_frame.Payload + 2 |
cmp ax, PPP_PROTO_IPv4 |
je IPv4_input |
je ipv4_input |
; cmp ax, PPP_PROTO_IPv6 |
; je IPv6_input |
; je ipv6_input |
jmp PPPoE_discovery_input ; Send LCP,CHAP,CBCP,... packets to the PPP dialer |
jmp pppoe_discovery_input ; Send LCP,CHAP,CBCP,... packets to the PPP dialer |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_input: Unknown protocol=%x\n", ax |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
;----------------------------------------------------------------- |
; |
; PPPoE_output |
; |
; IN: ax = protocol |
; ebx = device ptr |
; ecx = packet size |
; |
; OUT: eax = buffer start / 0 on error |
; ebx = device ptr |
; ecx = packet size |
; edx = size of complete buffer |
; edi = start of PPP payload |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; pppoe_output ; |
; ; |
; IN: ax = protocol ; |
; ebx = device ptr ; |
; ecx = packet size ; |
; ; |
; OUT: eax = buffer start ; |
; eax = 0 on error ; |
; ebx = device ptr ; |
; ecx = packet size ; |
; edx = size of complete buffer ; |
; edi = start of PPP payload ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
PPPoE_output: |
pppoe_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_output: size=%u device=%x\n", ecx, ebx |
262,7 → 256,7 |
mov ax, ETHER_PROTO_PPP_SESSION |
add ecx, PPPoE_frame.Payload + 2 |
lea edx, [PPPoE_MAC] |
call ETH_output |
call eth_output |
jz .eth_error |
sub ecx, PPPoE_frame.Payload |
287,9 → 281,9 |
xor eax, eax |
ret |
align 4 |
pppoe_start_connection: |
PPPoE_start_connection: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_start_connection: %x\n", cx |
cmp [PPPoE_SID], 0 |
308,7 → 302,7 |
align 4 |
PPPoE_stop_connection: |
pppoe_stop_connection: |
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_stop_connection\n" |
320,21 → 314,19 |
ret |
;--------------------------------------------------------------------------- |
; |
; PPPoE API |
; |
; This function is called by system function 75 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; |
;--------------------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; pppoe_api: Part of system function 76 ; |
; ; |
; IN: subfunction number in bl ; |
; device number in bh ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
PPPoE_api: |
pppoe_api: |
movzx eax, bh |
shl eax, 2 |
345,8 → 337,8 |
jmp dword [.table + 4*ebx] |
.table: |
dd PPPoE_start_connection ; 0 |
dd PPPoE_stop_connection ; 1 |
dd pppoe_start_connection ; 0 |
dd pppoe_stop_connection ; 1 |
.number = ($ - .table) / 4 - 1 |
.error: |
/kernel/branches/Kolibri-acpi/network/ethernet.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5522 $ |
$Revision: 6011 $ |
ETH_FRAME_MINIMUM = 60 |
ETH_QUEUE_SIZE = 255 |
50,10 → 50,10 |
ETH_input_event dd ? |
endg |
macro ETH_init { |
macro eth_init { |
movi ebx, 1 |
mov ecx, ETH_process_input |
mov ecx, eth_process_input |
call new_sys_threads |
test eax, eax |
jns @f |
62,20 → 62,18 |
} |
;----------------------------------------------------------------- |
; |
; ETH_input |
; |
; This function is called by ethernet drivers, |
; It pushes the received ethernet packets onto the ethernet input queue |
; |
; IN: [esp] = Pointer to buffer |
; |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; eth_input: This function is called by ethernet drivers. ; |
; Push the received ethernet packet onto the ethernet input queue.; |
; ; |
; IN: [esp] = Pointer to buffer ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ETH_input: |
eth_input: |
pop eax |
pushf |
109,14 → 107,22 |
DEBUGF DEBUG_NETWORK_ERROR, "ETH incoming queue is full, discarding packet!\n" |
popf |
push eax |
call NET_BUFF_free |
call net_buff_free |
ret |
;-----------------------------------------------------------------; |
; ; |
; eth_process_input: Process packets from ethernet input queue. ; |
; ; |
; IN: / ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ETH_process_input: |
eth_process_input: |
xor esi, esi |
mov ecx, MANUAL_DESTROY |
163,44 → 169,46 |
; Place protocol handlers here |
cmp ax, ETHER_PROTO_IPv4 |
je IPv4_input |
je ipv4_input |
cmp ax, ETHER_PROTO_ARP |
je ARP_input |
je arp_input |
; cmp ax, ETHER_PROTO_IPv6 |
; je IPv6_input |
; je ipv6_input |
; cmp ax, ETHER_PROTO_PPP_DISCOVERY |
; je PPPoE_discovery_input |
; je pppoe_discovery_input |
; cmp ax, ETHER_PROTO_PPP_SESSION |
; je PPPoE_session_input |
; je pppoe_session_input |
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_input: Unknown packet type=%x\n", ax |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
;----------------------------------------------------------------- |
; |
; ETH_output |
; |
; IN: ax = protocol |
; ebx = device ptr |
; ecx = payload size |
; edx = pointer to destination mac |
; |
; OUT: eax = start of net frame / 0 on error |
; ebx = device ptr |
; ecx = payload size |
; edi = start of payload |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; eth_output ; |
; ; |
; IN: ax = protocol ; |
; ebx = device ptr ; |
; ecx = payload size ; |
; edx = pointer to destination mac ; |
; ; |
; OUT: eax = start of net frame / 0 on error ; |
; ebx = device ptr ; |
; ecx = payload size ; |
; edi = start of payload ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ETH_output: |
eth_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_output: size=%u device=%x\n", ecx, ebx |
211,7 → 219,7 |
push ax edx |
add ecx, sizeof.ETH_header + NET_BUFF.data |
stdcall NET_BUFF_alloc, ecx |
stdcall net_buff_alloc, ecx |
test eax, eax |
jz .out_of_ram |
mov [eax + NET_BUFF.type], NET_BUFF_ETH |
257,21 → 265,19 |
;----------------------------------------------------------------- |
; |
; ETH_API |
; |
; This function is called by system function 76 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; eth_api: Part of system function 76. ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: depends on subfunction ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ETH_api: |
eth_api: |
cmp bh, NET_DEVICES_MAX |
ja .error |
/kernel/branches/Kolibri-acpi/network/icmp.inc |
---|
20,72 → 20,71 |
; ICMP types & codes |
ICMP_ECHOREPLY = 0 ; echo reply message |
ICMP_ECHOREPLY = 0 ; echo reply message |
ICMP_UNREACH = 3 |
ICMP_UNREACH_NET = 0 ; bad net |
ICMP_UNREACH_HOST = 1 ; bad host |
ICMP_UNREACH_PROTOCOL = 2 ; bad protocol |
ICMP_UNREACH_PORT = 3 ; bad port |
ICMP_UNREACH_NEEDFRAG = 4 ; IP_DF caused drop |
ICMP_UNREACH_SRCFAIL = 5 ; src route failed |
ICMP_UNREACH_NET_UNKNOWN = 6 ; unknown net |
ICMP_UNREACH_HOST_UNKNOWN = 7 ; unknown host |
ICMP_UNREACH_ISOLATED = 8 ; src host isolated |
ICMP_UNREACH_NET_PROHIB = 9 ; prohibited access |
ICMP_UNREACH_HOST_PROHIB = 10 ; ditto |
ICMP_UNREACH_TOSNET = 11 ; bad tos for net |
ICMP_UNREACH_TOSHOST = 12 ; bad tos for host |
ICMP_UNREACH_FILTER_PROHIB = 13 ; admin prohib |
ICMP_UNREACH_HOST_PRECEDENCE = 14 ; host prec vio. |
ICMP_UNREACH_PRECEDENCE_CUTOFF = 15 ; prec cutoff |
ICMP_UNREACH_NET = 0 ; bad net |
ICMP_UNREACH_HOST = 1 ; bad host |
ICMP_UNREACH_PROTOCOL = 2 ; bad protocol |
ICMP_UNREACH_PORT = 3 ; bad port |
ICMP_UNREACH_NEEDFRAG = 4 ; IP_DF caused drop |
ICMP_UNREACH_SRCFAIL = 5 ; src route failed |
ICMP_UNREACH_NET_UNKNOWN = 6 ; unknown net |
ICMP_UNREACH_HOST_UNKNOWN = 7 ; unknown host |
ICMP_UNREACH_ISOLATED = 8 ; src host isolated |
ICMP_UNREACH_NET_PROHIB = 9 ; prohibited access |
ICMP_UNREACH_HOST_PROHIB = 10 ; ditto |
ICMP_UNREACH_TOSNET = 11 ; bad tos for net |
ICMP_UNREACH_TOSHOST = 12 ; bad tos for host |
ICMP_UNREACH_FILTER_PROHIB = 13 ; admin prohib |
ICMP_UNREACH_HOST_PRECEDENCE = 14 ; host prec vio. |
ICMP_UNREACH_PRECEDENCE_CUTOFF = 15 ; prec cutoff |
ICMP_SOURCEQUENCH = 4 ; Packet lost, slow down |
ICMP_SOURCEQUENCH = 4 ; Packet lost, slow down |
ICMP_REDIRECT = 5 ; shorter route, codes: |
ICMP_REDIRECT_NET = 0 ; for network |
ICMP_REDIRECT_HOST = 1 ; for host |
ICMP_REDIRECT_TOSNET = 2 ; for tos and net |
ICMP_REDIRECT_TOSHOST = 3 ; for tos and host |
ICMP_REDIRECT = 5 ; shorter route, codes: |
ICMP_REDIRECT_NET = 0 ; for network |
ICMP_REDIRECT_HOST = 1 ; for host |
ICMP_REDIRECT_TOSNET = 2 ; for tos and net |
ICMP_REDIRECT_TOSHOST = 3 ; for tos and host |
ICMP_ALTHOSTADDR = 6 ; alternate host address |
ICMP_ECHO = 8 ; echo service |
ICMP_ROUTERADVERT = 9 ; router advertisement |
ICMP_ROUTERADVERT_NORMAL = 0 ; normal advertisement |
ICMP_ROUTERADVERT_NOROUTE_COMMON= 16 ; selective routing |
ICMP_ALTHOSTADDR = 6 ; alternate host address |
ICMP_ECHO = 8 ; echo service |
ICMP_ROUTERADVERT = 9 ; router advertisement |
ICMP_ROUTERADVERT_NORMAL = 0 ; normal advertisement |
ICMP_ROUTERADVERT_NOROUTE_COMMON= 16 ; selective routing |
ICMP_ROUTERSOLICIT = 10 ; router solicitation |
ICMP_TIMXCEED = 11 ; time exceeded, code: |
ICMP_TIMXCEED_INTRANS = 0 ; ttl==0 in transit |
ICMP_TIMXCEED_REASS = 1 ; ttl==0 in reass |
ICMP_ROUTERSOLICIT = 10 ; router solicitation |
ICMP_TIMXCEED = 11 ; time exceeded, code: |
ICMP_TIMXCEED_INTRANS = 0 ; ttl==0 in transit |
ICMP_TIMXCEED_REASS = 1 ; ttl==0 in reass |
ICMP_PARAMPROB = 12 ; ip header bad |
ICMP_PARAMPROB_ERRATPTR = 0 ; error at param ptr |
ICMP_PARAMPROB_OPTABSENT = 1 ; req. opt. absent |
ICMP_PARAMPROB_LENGTH = 2 ; bad length |
ICMP_PARAMPROB = 12 ; ip header bad |
ICMP_PARAMPROB_ERRATPTR = 0 ; error at param ptr |
ICMP_PARAMPROB_OPTABSENT = 1 ; req. opt. absent |
ICMP_PARAMPROB_LENGTH = 2 ; bad length |
ICMP_TSTAMP = 13 ; timestamp request |
ICMP_TSTAMPREPLY = 14 ; timestamp reply |
ICMP_IREQ = 15 ; information request |
ICMP_IREQREPLY = 16 ; information reply |
ICMP_MASKREQ = 17 ; address mask request |
ICMP_MASKREPLY = 18 ; address mask reply |
ICMP_TRACEROUTE = 30 ; traceroute |
ICMP_DATACONVERR = 31 ; data conversion error |
ICMP_MOBILE_REDIRECT = 32 ; mobile host redirect |
ICMP_IPV6_WHEREAREYOU = 33 ; IPv6 where-are-you |
ICMP_IPV6_IAMHERE = 34 ; IPv6 i-am-here |
ICMP_MOBILE_REGREQUEST = 35 ; mobile registration req |
ICMP_MOBILE_REGREPLY = 36 ; mobile registreation reply |
ICMP_SKIP = 39 ; SKIP |
ICMP_TSTAMP = 13 ; timestamp request |
ICMP_TSTAMPREPLY = 14 ; timestamp reply |
ICMP_IREQ = 15 ; information request |
ICMP_IREQREPLY = 16 ; information reply |
ICMP_MASKREQ = 17 ; address mask request |
ICMP_MASKREPLY = 18 ; address mask reply |
ICMP_TRACEROUTE = 30 ; traceroute |
ICMP_DATACONVERR = 31 ; data conversion error |
ICMP_MOBILE_REDIRECT = 32 ; mobile host redirect |
ICMP_IPV6_WHEREAREYOU = 33 ; IPv6 where-are-you |
ICMP_IPV6_IAMHERE = 34 ; IPv6 i-am-here |
ICMP_MOBILE_REGREQUEST = 35 ; mobile registration req |
ICMP_MOBILE_REGREPLY = 36 ; mobile registreation reply |
ICMP_SKIP = 39 ; SKIP |
ICMP_PHOTURIS = 40 ; Photuris |
ICMP_PHOTURIS_UNKNOWN_INDEX = 1 ; unknown sec index |
ICMP_PHOTURIS_AUTH_FAILED = 2 ; auth failed |
ICMP_PHOTURIS_DECRYPT_FAILED = 3 ; decrypt failed |
ICMP_PHOTURIS = 40 ; Photuris |
ICMP_PHOTURIS_UNKNOWN_INDEX = 1 ; unknown sec index |
ICMP_PHOTURIS_AUTH_FAILED = 2 ; auth failed |
ICMP_PHOTURIS_DECRYPT_FAILED = 3 ; decrypt failed |
struct ICMP_header |
Type db ? |
107,13 → 106,13 |
;----------------------------------------------------------------- |
; |
; ICMP_init |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; ICMP_init ; |
; ; |
;-----------------------------------------------------------------; |
macro ICMP_init { |
macro icmp_init { |
xor eax, eax |
mov edi, ICMP_PACKETS_TX |
123,25 → 122,23 |
} |
;----------------------------------------------------------------- |
; |
; ICMP_input: |
; |
; This procedure will send reply's to ICMP echo's |
; and insert packets into sockets when needed |
; |
; IN: Pointer to buffer in [esp] |
; ebx = pointer to device struct |
; ecx = ICMP Packet size |
; edx = ptr to IPv4 header |
; esi = ptr to ICMP Packet data |
; edi = interface number*4 |
; |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; icmp_input: Send a reply's to an ICMP echo or insert packets ; |
; into socket. ; |
; ; |
; IN: [esp] = ptr to buffer ; |
; ebx = ptr to device struct ; |
; ecx = ICMP Packet size ; |
; edx = ptr to IPv4 header ; |
; esi = ptr to ICMP Packet data ; |
; edi = interface number*4 ; |
; ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ICMP_input: |
icmp_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ICMP_input\n" |
204,7 → 201,7 |
call mutex_lock |
popa |
jmp SOCKET_input |
jmp socket_input |
274,7 → 271,7 |
test eax, eax |
jnz @f |
DEBUGF DEBUG_NETWORK_VERBOSE, "ICMP transmit failed\n" |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [ICMP_PACKETS_TX + edi] |
@@: |
ret |
293,26 → 290,26 |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ICMP_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
if 0 |
;----------------------------------------------------------------- |
; |
; ICMP_output |
; |
; IN: eax = dest ip |
; bh = type |
; bl = code |
; ecx = data length |
; edx = source ip |
; esi = data offset |
; edi = identifier shl 16 + sequence number |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; icmp_output ; |
; ; |
; IN: eax = dest ip ; |
; bh = type ; |
; bl = code ; |
; ecx = data length ; |
; edx = source ip ; |
; esi = data offset ; |
; edi = identifier shl 16 + sequence number ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ICMP_output: |
icmp_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "Creating ICMP Packet\n" |
364,17 → 361,17 |
;----------------------------------------------------------------- |
; |
; ICMP_output_raw |
; |
; IN: eax = socket ptr |
; ecx = data length |
; edx = data pointer |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; icmp_output_raw ; |
; ; |
; IN: eax = socket ptr ; |
; ecx = data length ; |
; edx = data pointer ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ICMP_output_raw: |
icmp_output_raw: |
DEBUGF DEBUG_NETWORK_VERBOSE, "Creating ICMP Packet for socket %x, data ptr=%x\n", eax, edx |
384,7 → 381,7 |
mov edi, [eax + IP_SOCKET.RemoteIP] |
mov al, [eax + IP_SOCKET.ttl] |
mov ah, IP_PROTO_ICMP |
call IPv4_output |
call ipv4_output |
jz .fail |
pop esi |
407,7 → 404,7 |
call [ebx + NET_DEVICE.transmit] |
test eax, eax |
jnz @f |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [ICMP_PACKETS_TX + edi] |
@@: |
ret |
422,21 → 419,19 |
;----------------------------------------------------------------- |
; |
; ICMP_API |
; |
; This function is called by system function 75 |
; |
; IN: subfunction number in bl |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; icmp_api: Part of system function 76. ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
; ecx, edx, .. depends on subfunction ; |
; ; |
; OUT: depends on subfunction ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
ICMP_api: |
icmp_api: |
movzx eax, bh |
shl eax, 2 |
/kernel/branches/Kolibri-acpi/network/loopback.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5976 $ |
$Revision: 6011 $ |
iglobal |
align 4 |
27,7 → 27,7 |
.unload dd .dummy_fn |
.reset dd .dummy_fn |
.transmit dd LOOP_input |
.transmit dd loop_input |
.bytes_tx dq 0 |
.bytes_rx dq 0 |
45,11 → 45,11 |
endg |
macro LOOP_init { |
macro loop_init { |
local .fail |
mov ebx, LOOPBACK_DEVICE |
call NET_add_device |
call net_add_device |
cmp eax, -1 |
je .fail |
63,7 → 63,7 |
;-----------------------------------------------------------------; |
; ; |
; LOOP_input ; |
; loop_input ; |
; ; |
; IN: [esp+4] = Pointer to buffer ; |
; ; |
71,7 → 71,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
LOOP_input: |
loop_input: |
mov eax, [esp+4] |
95,19 → 95,19 |
; Place protocol handlers here |
cmp eax, AF_INET4 |
je IPv4_input |
je ipv4_input |
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", eax |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
;-----------------------------------------------------------------; |
; ; |
; LOOP_output ; |
; loop_output ; |
; ; |
; IN: ecx = packet size ; |
; edi = address family ; |
119,7 → 119,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
LOOP_output: |
loop_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "LOOP_output\n" |
128,7 → 128,7 |
push ecx edi |
add ecx, NET_BUFF.data |
stdcall NET_BUFF_alloc, ecx |
stdcall net_buff_alloc, ecx |
test eax, eax |
jz .out_of_ram |
/kernel/branches/Kolibri-acpi/network/socket.inc |
---|
207,10 → 207,10 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_init ; |
; socket_init ; |
; ; |
;-----------------------------------------------------------------; |
macro SOCKET_init { |
macro socket_init { |
xor eax, eax |
mov edi, net_sockets |
251,7 → 251,7 |
mov dword[esp+20], 0 ; Set error code to 0 |
cmp ebx, 255 |
jz SOCKET_debug |
jz socket_debug |
cmp ebx, .number |
ja .error |
258,17 → 258,17 |
jmp dword [.table + 4*ebx] |
.table: |
dd SOCKET_open ; 0 |
dd SOCKET_close ; 1 |
dd SOCKET_bind ; 2 |
dd SOCKET_listen ; 3 |
dd SOCKET_connect ; 4 |
dd SOCKET_accept ; 5 |
dd SOCKET_send ; 6 |
dd SOCKET_receive ; 7 |
dd SOCKET_set_opt ; 8 |
dd SOCKET_get_opt ; 9 |
dd SOCKET_pair ; 10 |
dd socket_open ; 0 |
dd socket_close ; 1 |
dd socket_bind ; 2 |
dd socket_listen ; 3 |
dd socket_connect ; 4 |
dd socket_accept ; 5 |
dd socket_send ; 6 |
dd socket_receive ; 7 |
dd socket_set_opt ; 8 |
dd socket_get_opt ; 9 |
dd socket_pair ; 10 |
.number = ($ - .table) / 4 - 1 |
.error: |
279,7 → 279,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_open: Create a new socket. ; |
; socket_open: Create a new socket. ; |
; ; |
; IN: ecx = domain ; |
; edx = type ; |
291,12 → 291,12 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_open: |
socket_open: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_open: domain=%u type=%u protocol=%x ", ecx, edx, esi |
push ecx edx esi |
call SOCKET_alloc |
call socket_alloc |
pop esi edx ecx |
test eax, eax |
jz .nobuffs |
339,7 → 339,7 |
.no_ppp: |
.unsupported: |
push eax |
call SOCKET_free |
call socket_free |
pop eax |
mov dword[esp+20], EOPNOTSUPP |
mov dword[esp+32], -1 |
366,19 → 366,19 |
pop eax |
mov [eax + SOCKET.Protocol], IP_PROTO_UDP |
mov [eax + SOCKET.snd_proc], SOCKET_send_udp |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
mov [eax + SOCKET.connect_proc], UDP_connect |
mov [eax + SOCKET.snd_proc], socket_send_udp |
mov [eax + SOCKET.rcv_proc], socket_receive_dgram |
mov [eax + SOCKET.connect_proc], udp_connect |
ret |
align 4 |
.tcp: |
mov [eax + SOCKET.Protocol], IP_PROTO_TCP |
mov [eax + SOCKET.snd_proc], SOCKET_send_tcp |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream |
mov [eax + SOCKET.connect_proc], TCP_connect |
mov [eax + SOCKET.snd_proc], socket_send_tcp |
mov [eax + SOCKET.rcv_proc], socket_receive_stream |
mov [eax + SOCKET.connect_proc], tcp_connect |
TCP_init_socket eax |
tcp_init_socket eax |
ret |
388,9 → 388,9 |
init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
pop eax |
mov [eax + SOCKET.snd_proc], SOCKET_send_ip |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
mov [eax + SOCKET.connect_proc], IPv4_connect |
mov [eax + SOCKET.snd_proc], socket_send_ip |
mov [eax + SOCKET.rcv_proc], socket_receive_dgram |
mov [eax + SOCKET.connect_proc], ipv4_connect |
ret |
400,9 → 400,9 |
init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
pop eax |
mov [eax + SOCKET.snd_proc], SOCKET_send_icmp |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
mov [eax + SOCKET.connect_proc], IPv4_connect |
mov [eax + SOCKET.snd_proc], socket_send_icmp |
mov [eax + SOCKET.rcv_proc], socket_receive_dgram |
mov [eax + SOCKET.connect_proc], ipv4_connect |
ret |
align 4 |
411,14 → 411,14 |
init_queue (eax + SOCKET_QUEUE_LOCATION) ; Set up data receiving queue |
pop eax |
mov [eax + SOCKET.snd_proc], SOCKET_send_pppoe |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram |
mov [eax + SOCKET.snd_proc], socket_send_pppoe |
mov [eax + SOCKET.rcv_proc], socket_receive_dgram |
ret |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_bind: Bind to a local port. ; |
; socket_bind: Bind to a local port. ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to sockaddr struct ; |
430,11 → 430,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_bind: |
socket_bind: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_bind: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
444,10 → 444,10 |
cmp [eax + UDP_SOCKET.LocalPort], 0 ; Socket can only be bound once |
jnz .invalid |
cmp word [edx], AF_INET4 |
cmp word[edx], AF_INET4 |
je .af_inet4 |
cmp word [edx], AF_LOCAL |
cmp word[edx], AF_LOCAL |
je .af_local |
.notsupp: |
479,7 → 479,6 |
.tcp: |
.udp: |
pushd [edx + 4] ; First, fill in the IP |
popd [eax + IP_SOCKET.LocalIP] |
486,11 → 485,11 |
mov bx, [edx + 2] ; Did caller specify a local port? |
test bx, bx |
jnz .just_check |
call SOCKET_find_port ; Nope, find an ephemeral one |
call socket_find_port ; Nope, find an ephemeral one |
jmp .done |
.just_check: |
call SOCKET_check_port ; Yes, check if it's still available |
call socket_check_port ; Yes, check if it's still available |
jz .addrinuse ; ZF is set by socket_check_port on error |
.done: |
511,7 → 510,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_connect: Connect to the remote host. ; |
; socket_connect: Connect to the remote host. ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to sockaddr struct ; |
523,11 → 522,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_connect: |
socket_connect: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_connect: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
572,7 → 571,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_listen: Listen for incoming connections. ; |
; socket_listen: Listen for incoming connections. ; |
; ; |
; IN: ecx = socket number ; |
; edx = backlog in edx ; |
583,11 → 582,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_listen: |
socket_listen: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_listen: socknum=%u backlog=%u\n", ecx, edx |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
641,7 → 640,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_accept: Accept an incoming connection. ; |
; socket_accept: Accept an incoming connection. ; |
; ; |
; IN: ecx = socket number (of listening socket) ; |
; edx = ptr to sockaddr struct ; |
653,11 → 652,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_accept: |
socket_accept: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_accept: socknum=%u sockaddr=%x length=%u\n", ecx, edx, esi |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
677,7 → 676,7 |
mov eax, [esi] |
; Verify that it is (still) a valid socket |
call SOCKET_check |
call socket_check |
jz .invalid |
; Change sockets thread owner ID to that of the current thread |
694,7 → 693,7 |
test [eax + SOCKET.options], SO_NONBLOCK |
jnz .wouldblock |
call SOCKET_block |
call socket_block |
jmp .loop |
.wouldblock: |
714,7 → 713,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_close: Close the socket (and connection). ; |
; socket_close: Close the socket (and connection). ; |
; ; |
; IN: ecx = socket number ; |
; ; |
724,11 → 723,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_close: |
socket_close: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_close: socknum=%u\n", ecx |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
738,7 → 737,7 |
test [eax + SOCKET.state], SS_BLOCKED ; Is the socket still in blocked state? |
jz @f |
call SOCKET_notify ; Unblock it. |
call socket_notify ; Unblock it. |
@@: |
cmp [eax + SOCKET.Domain], AF_INET4 |
748,15 → 747,15 |
je .tcp |
.free: |
call SOCKET_free |
call socket_free |
ret |
.tcp: |
call TCP_usrclosed |
call tcp_usrclosed |
test eax, eax |
jz @f |
call TCP_output ; If connection is not closed yet, send the FIN |
call tcp_output ; If connection is not closed yet, send the FIN |
@@: |
ret |
769,7 → 768,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_receive: Receive some data from the remote end. ; |
; socket_receive: Receive some data from the remote end. ; |
; ; |
; IN: ecx = socket number ; |
; edx = addr to application buffer ; |
783,11 → 782,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_receive: |
socket_receive: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: socknum=%u bufaddr=%x buflength=%u flags=%x\n", ecx, edx, esi, edi |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
808,7 → 807,7 |
test [eax + SOCKET.options], SO_NONBLOCK |
jnz .return_err |
call SOCKET_block |
call socket_block |
jmp .loop |
825,7 → 824,7 |
.last_data: |
test ecx, ecx |
jz .return |
call SOCKET_notify ; Call me again! |
call socket_notify ; Call me again! |
jmp .return |
832,7 → 831,7 |
align 4 |
SOCKET_receive_dgram: |
socket_receive_dgram: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: DGRAM\n" |
868,11 → 867,11 |
rep movsd |
.nd: |
call NET_BUFF_free |
call net_buff_free |
pop ecx eax ; return number of bytes copied to application |
cmp [eax + SOCKET_QUEUE_LOCATION + queue.size], 0 |
je @f |
call SOCKET_notify ; Queue another network event |
call socket_notify ; Queue another network event |
@@: |
xor ebx, ebx ; errorcode = 0 (no error) |
ret |
900,7 → 899,7 |
align 4 |
SOCKET_receive_local: |
socket_receive_local: |
; does this socket have a PID yet? |
cmp [eax + SOCKET.PID], 0 |
913,12 → 912,12 |
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :( |
@@: |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream |
mov [eax + SOCKET.rcv_proc], socket_receive_stream |
; ... continue to SOCKET_receive_stream |
align 4 |
SOCKET_receive_stream: |
socket_receive_stream: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: STREAM\n" |
934,8 → 933,8 |
push eax |
add eax, STREAM_SOCKET.rcv |
call SOCKET_ring_read ; copy data from kernel buffer to application buffer |
call SOCKET_ring_free ; free read memory |
call socket_ring_read ; copy data from kernel buffer to application buffer |
call socket_ring_free ; free read memory |
pop eax |
cmp [eax + STREAM_SOCKET.rcv + RING_BUFFER.size], 0 |
944,7 → 943,7 |
ret |
.more_data: |
call SOCKET_notify ; Queue another network event |
call socket_notify ; Queue another network event |
xor ebx, ebx ; errorcode = 0 (no error) |
ret |
962,7 → 961,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_send: Send some data to the remote end. ; |
; socket_send: Send some data to the remote end. ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to data ; |
975,11 → 974,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_send: |
socket_send: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: socknum=%u data ptr=%x length=%u flags=%x\n", ecx, edx, esi, edi |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
995,12 → 994,12 |
align 4 |
SOCKET_send_udp: |
socket_send_udp: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: UDP\n" |
mov [esp+32], ecx |
call UDP_output |
call udp_output |
cmp eax, -1 |
je .error |
ret |
1012,19 → 1011,19 |
align 4 |
SOCKET_send_tcp: |
socket_send_tcp: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: TCP\n" |
push eax |
add eax, STREAM_SOCKET.snd |
call SOCKET_ring_write |
call socket_ring_write |
pop eax |
mov [esp+32], ecx |
mov [eax + SOCKET.errorcode], 0 |
push eax |
call TCP_output ; FIXME: this doesnt look pretty, does it? |
call tcp_output ; FIXME: this doesnt look pretty, does it? |
pop eax |
mov eax, [eax + SOCKET.errorcode] |
mov [esp+20], eax |
1032,12 → 1031,12 |
align 4 |
SOCKET_send_ip: |
socket_send_ip: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: IPv4\n" |
mov [esp+32], ecx |
call IPv4_output_raw |
call ipv4_output_raw |
cmp eax, -1 |
je .error |
ret |
1049,12 → 1048,12 |
align 4 |
SOCKET_send_icmp: |
socket_send_icmp: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: ICMP\n" |
mov [esp+32], ecx |
call ICMP_output_raw |
call icmp_output_raw |
cmp eax, -1 |
je .error |
ret |
1066,7 → 1065,7 |
align 4 |
SOCKET_send_pppoe: |
socket_send_pppoe: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n" |
1073,7 → 1072,7 |
mov [esp+32], ecx |
mov ebx, [eax + SOCKET.device] |
call PPPoE_discovery_output ; FIXME: errorcodes |
call pppoe_discovery_output ; FIXME: errorcodes |
cmp eax, -1 |
je .error |
ret |
1086,7 → 1085,7 |
align 4 |
SOCKET_send_local: |
socket_send_local: |
; does this socket have a PID yet? |
cmp [eax + SOCKET.PID], 0 |
1098,22 → 1097,22 |
mov [eax + SOCKET.PID], ebx |
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :( |
@@: |
mov [eax + SOCKET.snd_proc], SOCKET_send_local_ |
mov [eax + SOCKET.snd_proc], socket_send_local_initialized |
align 4 |
SOCKET_send_local_: |
socket_send_local_initialized: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: LOCAL\n" |
; get the other side's socket and check if it still exists |
mov eax, [eax + SOCKET.device] |
call SOCKET_check |
call socket_check |
jz .invalid |
; allright, shove in the data! |
push eax |
add eax, STREAM_SOCKET.rcv |
call SOCKET_ring_write |
call socket_ring_write |
pop eax |
; return the number of written bytes (or errorcode) to application |
1120,7 → 1119,7 |
mov [esp+32], ecx |
; and notify the other end |
call SOCKET_notify |
call socket_notify |
ret |
1132,7 → 1131,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_get_options: Read a socket option ; |
; socket_get_opt: Read a socket option ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to socket options struct ; |
1143,7 → 1142,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_get_opt: |
socket_get_opt: |
; FIXME: |
; At moment, uses only pseudo-optname -2 for get last_ack_number for TCP. |
1152,7 → 1151,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n" |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
1194,7 → 1193,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_set_options: Set a socket option. ; |
; socket_set_options: Set a socket option. ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to socket options struct ; |
1205,11 → 1204,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_set_opt: |
socket_set_opt: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_set_opt\n" |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
1272,7 → 1271,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_pair: Allocate a pair of linked local sockets. ; |
; socket_pair: Allocate a pair of linked local sockets. ; |
; ; |
; IN: / ; |
; ; |
1283,11 → 1282,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_pair: |
socket_pair: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_pair\n" |
call SOCKET_alloc |
call socket_alloc |
test eax, eax |
jz .nomem1 |
mov [esp+32], edi ; application's eax |
1295,12 → 1294,12 |
mov [eax + SOCKET.Domain], AF_LOCAL |
mov [eax + SOCKET.Type], SOCK_STREAM |
mov [eax + SOCKET.Protocol], 0 ;;; CHECKME |
mov [eax + SOCKET.snd_proc], SOCKET_send_local |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_local |
mov [eax + SOCKET.snd_proc], socket_send_local |
mov [eax + SOCKET.rcv_proc], socket_receive_local |
mov [eax + SOCKET.PID], 0 |
mov ebx, eax |
call SOCKET_alloc |
call socket_alloc |
test eax, eax |
jz .nomem2 |
mov [esp+20], edi ; application's ebx |
1308,8 → 1307,8 |
mov [eax + SOCKET.Domain], AF_LOCAL |
mov [eax + SOCKET.Type], SOCK_STREAM |
mov [eax + SOCKET.Protocol], 0 ;;; CHECKME |
mov [eax + SOCKET.snd_proc], SOCKET_send_local |
mov [eax + SOCKET.rcv_proc], SOCKET_receive_local |
mov [eax + SOCKET.snd_proc], socket_send_local |
mov [eax + SOCKET.rcv_proc], socket_receive_local |
mov [eax + SOCKET.PID], 0 |
; Link the two sockets to eachother |
1317,12 → 1316,12 |
mov [ebx + SOCKET.device], eax |
lea eax, [eax + STREAM_SOCKET.rcv] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .nomem2 |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .nomem2 |
1330,11 → 1329,11 |
.nomem2: |
mov eax, [esp+20] |
call SOCKET_free |
call socket_free |
.nomem1: |
mov eax, [esp+32] |
call SOCKET_free |
call socket_free |
mov dword[esp+32], -1 |
mov dword[esp+20], ENOMEM |
1344,7 → 1343,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_debug: Copy socket variables to application buffer. ; |
; socket_debug: Copy socket variables to application buffer. ; |
; ; |
; IN: ecx = socket number ; |
; edx = pointer to application buffer ; |
1355,7 → 1354,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_debug: |
socket_debug: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_debug\n" |
1364,7 → 1363,7 |
test ecx, ecx |
jz .returnall |
call SOCKET_num_to_ptr |
call socket_num_to_ptr |
test eax, eax |
jz .invalid |
1407,7 → 1406,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_find_port: ; |
; socket_find_port: ; |
; Fill in the local port number for TCP and UDP sockets ; |
; This procedure always works because the number of sockets is ; |
; limited to a smaller number then the number of possible ports ; |
1418,7 → 1417,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_find_port: |
socket_find_port: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_find_port\n" |
1459,7 → 1458,7 |
add bh, 1 |
adc bl, 0 |
call SOCKET_check_port |
call socket_check_port |
jz .findit |
ret |
1467,11 → 1466,10 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_check_port (to be used with AF_INET only!) ; |
; ; |
; socket_check_port: (to be used with AF_INET only!) ; |
; Checks if a local port number is unused ; |
; If the proposed port number is unused, it is filled in in the ; |
; socket structure ; |
; socket structure. ; |
; ; |
; IN: eax = socket ptr ; |
; bx = proposed socket number (network byte order) ; |
1480,7 → 1478,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_check_port: |
socket_check_port: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check_port: " |
1530,7 → 1528,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_input: Update a (stateless) socket with received data. ; |
; socket_input: Update a (stateless) socket with received data. ; |
; ; |
; Note: The socket's mutex should already be set ! ; |
; ; |
1543,7 → 1541,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_input: |
socket_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx |
1551,7 → 1549,7 |
push esi |
mov esi, esp |
add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full |
add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, .full |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: success\n" |
add esp, sizeof.socket_queue_entry |
1561,7 → 1559,7 |
call mutex_unlock |
popa |
jmp SOCKET_notify |
jmp socket_notify |
.full: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: socket %x is full!\n", eax |
1572,13 → 1570,13 |
popa |
add esp, 8 |
call NET_BUFF_free |
call net_buff_free |
ret |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_ring_create: Create a ringbuffer for sockets. ; |
; socket_ring_create: Create a ringbuffer for sockets. ; |
; ; |
; IN: eax = ptr to ring struct ; |
; ; |
1587,7 → 1585,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_ring_create: |
socket_ring_create: |
push esi |
mov esi, eax |
1623,7 → 1621,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_ring_write: Write data to ring buffer. ; |
; socket_ring_write: Write data to ring buffer. ; |
; ; |
; IN: eax = ptr to ring struct ; |
; ecx = data size ; |
1633,7 → 1631,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_ring_write: |
socket_ring_write: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_ring_write: ringbuff=%x ptr=%x size=%u\n", eax, esi, ecx |
1693,7 → 1691,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_ring_read: Read from ring buffer ; |
; socket_ring_read: Read from ring buffer ; |
; ; |
; IN: eax = ring struct ptr ; |
; ecx = bytes to read ; |
1708,7 → 1706,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_ring_read: |
socket_ring_read: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_ring_read: ringbuff=%x ptr=%x size=%u offset=%x\n", eax, edi, ecx, edx |
1767,7 → 1765,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_ring_free: Free data from a ringbuffer ; |
; socket_ring_free: Free data from a ringbuffer. ; |
; ; |
; IN: eax = ptr to ring struct ; |
; ecx = data size ; |
1776,7 → 1774,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_ring_free: |
socket_ring_free: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_ring_free: %u bytes from ring %x\n", ecx, eax |
1817,7 → 1815,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_block: Suspend the thread attached to a socket. ; |
; socket_block: Suspend the thread attached to a socket. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
1825,7 → 1823,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_block: |
socket_block: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_block: %x\n", eax |
1859,7 → 1857,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_notify: Wake up socket owner thread. ; |
; socket_notify: Wake up socket owner thread. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
1867,11 → 1865,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_notify: |
socket_notify: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_notify: %x\n", eax |
call SOCKET_check |
call socket_check |
jz .error |
; Find the associated thread's TASK_DATA |
1927,10 → 1925,9 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_alloc: ; |
; Allocate memory for socket and put new socket into the list. ; |
; Newly created socket is initialized with calling PID and socket ; |
; number. ; |
; socket_alloc: Allocate memory for socket and put new socket ; |
; into the list. Newly created socket is initialized with calling ; |
; PID and given a socket number. ; |
; ; |
; IN: / ; |
; ; |
1940,7 → 1937,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_alloc: |
socket_alloc: |
push ebx |
2045,9 → 2042,8 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_free: ; |
; Free socket data memory and remove socket from the list. ; |
; Caller should lock and unlock socket_mutex. ; |
; socket_free: Free socket data memory and remove socket from ; |
; the list. Caller should lock and unlock socket_mutex. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2055,11 → 2051,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_free: |
socket_free: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_free: %x\n", eax |
call SOCKET_check |
call socket_check |
jz .error |
push ebx |
2117,7 → 2113,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_fork: Create a child socket. ; |
; socket_fork: Create a child socket. ; |
; ; |
; IN: ebx = socket number ; |
; ; |
2126,7 → 2122,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_fork: |
socket_fork: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_fork: %x\n", ebx |
2137,7 → 2133,7 |
; Allocate new socket |
push ebx |
call SOCKET_alloc |
call socket_alloc |
pop ebx |
test eax, eax |
jz .fail |
2160,7 → 2156,7 |
; Notify owner of parent socket |
push eax |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
pop eax |
ret |
2175,7 → 2171,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_num_to_ptr: Get socket structure address by its number. ; |
; socket_num_to_ptr: Get socket structure address by its number. ; |
; ; |
; IN: ecx = socket number ; |
; ; |
2184,7 → 2180,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_num_to_ptr: |
socket_num_to_ptr: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_num_to_ptr: num=%u ", ecx |
2222,7 → 2218,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_ptr_to_num: Get socket number by its address. ; |
; socket_ptr_to_num: Get socket number by its address. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2232,11 → 2228,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_ptr_to_num: |
socket_ptr_to_num: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_ptr_to_num: ptr=%x ", eax |
call SOCKET_check |
call socket_check |
jz .error |
mov eax, [eax + SOCKET.Number] |
2251,7 → 2247,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_check: Checks if the given ptr is really a socket ptr. ; |
; socket_check: Checks if the given ptr is really a socket ptr. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2260,7 → 2256,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_check: |
socket_check: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check: %x\n", eax |
2291,7 → 2287,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_check_owner: Check if the caller app owns the socket. ; |
; socket_check_owner: Check if the caller app owns the socket. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2299,7 → 2295,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_check_owner: |
socket_check_owner: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check_owner: %x\n", eax |
2316,10 → 2312,9 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_process_end: ; |
; Kernel calls this function when a certain process ends. ; |
; This function will check if the process had any open sockets, ; |
; and update them accordingly (clean up). ; |
; socket_process_end: Kernel calls this function when a certain ; |
; process ends. This function will check if the process had any ; |
; open sockets and update them accordingly (clean up). ; |
; ; |
; IN: edx = pid ; |
; ; |
2327,7 → 2322,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_process_end: |
socket_process_end: |
ret ; FIXME |
2368,11 → 2363,11 |
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
jne .free |
call TCP_disconnect |
call tcp_disconnect |
jmp .closed |
.free: |
call SOCKET_free |
call socket_free |
.closed: |
popa |
2394,7 → 2389,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_is_connecting: Update socket state. ; |
; socket_is_connecting: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2402,7 → 2397,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_is_connecting: |
socket_is_connecting: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax |
2414,7 → 2409,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_is_connected: Update socket state. ; |
; socket_is_connected: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2422,13 → 2417,13 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_is_connected: |
socket_is_connected: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connected: %x\n", eax |
and [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISDISCONNECTING + SS_ISCONFIRMING) |
or [eax + SOCKET.state], SS_ISCONNECTED |
jmp SOCKET_notify |
jmp socket_notify |
2435,7 → 2430,7 |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_is_disconnecting: Update socket state. ; |
; socket_is_disconnecting: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2443,19 → 2438,19 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_is_disconnecting: |
socket_is_disconnecting: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnecting: %x\n", eax |
and [eax + SOCKET.state], not (SS_ISCONNECTING) |
or [eax + SOCKET.state], SS_ISDISCONNECTING + SS_CANTRCVMORE + SS_CANTSENDMORE |
jmp SOCKET_notify |
jmp socket_notify |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_is_disconnected: Update socket state. ; |
; socket_is_disconnected: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2463,19 → 2458,19 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_is_disconnected: |
socket_is_disconnected: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_disconnected: %x\n", eax |
and [eax + SOCKET.state], not (SS_ISCONNECTING + SS_ISCONNECTED + SS_ISDISCONNECTING) |
or [eax + SOCKET.state], SS_CANTRCVMORE + SS_CANTSENDMORE |
jmp SOCKET_notify |
jmp socket_notify |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_cant_recv_more: Update socket state. ; |
; socket_cant_recv_more: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2483,18 → 2478,18 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_cant_recv_more: |
socket_cant_recv_more: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_cant_recv_more: %x\n", eax |
or [eax + SOCKET.state], SS_CANTRCVMORE |
jmp SOCKET_notify |
jmp socket_notify |
;-----------------------------------------------------------------; |
; ; |
; SOCKET_cant_send_more: Update socket state. ; |
; socket_cant_send_more: Update socket state. ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
2502,13 → 2497,13 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
SOCKET_cant_send_more: |
socket_cant_send_more: |
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax |
or [eax + SOCKET.state], SS_CANTSENDMORE |
mov [eax + SOCKET.snd_proc], .notconn |
jmp SOCKET_notify |
jmp socket_notify |
.notconn: |
mov dword[esp+20], ENOTCONN |
/kernel/branches/Kolibri-acpi/network/stack.inc |
---|
163,8 → 163,8 |
NET_HWACC_TCP_IPv4_OUT = 1 shl 1 |
; Network frame types |
NET_BUFF_LOOPBACK = 0 |
NET_BUFF_ETH = 1 |
NET_BUFF_LOOPBACK = 0 |
NET_BUFF_ETH = 1 |
struct NET_DEVICE |
258,16 → 258,14 |
endg |
;----------------------------------------------------------------- |
; |
; stack_init |
; |
; This function calls all network init procedures |
; |
; IN: / |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; stack_init: Initialize all network variables ; |
; ; |
; IN: / ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
stack_init: |
294,21 → 292,21 |
mov ecx, (NET_DEVICES_MAX + 1) |
rep stosd |
ETH_init |
eth_init |
PPPoE_init |
pppoe_init |
IPv4_init |
; IPv6_init |
ICMP_init |
ipv4_init |
; ipv6_init |
icmp_init |
ARP_init |
UDP_init |
TCP_init |
arp_init |
udp_init |
tcp_init |
SOCKET_init |
socket_init |
LOOP_init |
loop_init |
mov [net_tmr_count], 0 |
ret |
329,16 → 327,14 |
endp |
;----------------------------------------------------------------- |
; |
; stack_handler |
; |
; This function is called in kernel loop |
; |
; IN: / |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; stack_handler: Network handlers called from os_loop. ; |
; ; |
; IN: / ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
stack_handler: |
354,13 → 350,13 |
test [net_10ms], 0x0f ; 160ms |
jnz .exit |
TCP_timer_160ms |
tcp_timer_160ms |
test [net_10ms], 0x3f ; 640ms |
jnz .exit |
ARP_decrease_entry_ttls |
IPv4_decrease_fragment_ttls |
arp_decrease_entry_ttls |
ipv4_decrease_fragment_ttls |
xor edx, edx |
mov eax, [TCP_timer1_event] |
373,7 → 369,8 |
align 4 |
proc NET_BUFF_alloc stdcall, buffersize |
proc net_buff_alloc stdcall, buffersize |
cmp [buffersize], NET_BUFFER_SIZE |
ja .too_large |
387,7 → 384,7 |
spin_unlock_irqrestore |
DEBUGF DEBUG_NETWORK_VERBOSE, "net alloc: 0x%x\n", eax |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_buff_alloc: 0x%x\n", eax |
ret |
.out_of_mem: |
394,20 → 391,20 |
spin_unlock_irqrestore |
xor eax, eax |
DEBUGF DEBUG_NETWORK_ERROR, "NET_BUFF_alloc: out of mem!\n" |
DEBUGF DEBUG_NETWORK_ERROR, "net_buff_alloc: out of mem!\n" |
ret |
.too_large: |
xor eax, eax |
DEBUGF DEBUG_NETWORK_ERROR, "NET_BUFF_alloc: too large!\n" |
DEBUGF DEBUG_NETWORK_ERROR, "net_buff_alloc: too large!\n" |
ret |
endp |
align 4 |
proc NET_BUFF_free stdcall, buffer |
proc net_buff_free stdcall, buffer |
DEBUGF DEBUG_NETWORK_VERBOSE, "net free: 0x%x\n", [buffer] |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_buff_free: 0x%x\n", [buffer] |
spin_lock_irqsave |
423,14 → 420,14 |
align 4 |
NET_link_changed: |
net_link_changed: |
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.link_state] |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.link_state] |
align 4 |
NET_send_event: |
net_send_event: |
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_send_event\n" |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_send_event\n" |
; Send event to all applications |
push edi ecx |
446,21 → 443,20 |
;----------------------------------------------------------------- |
; |
; NET_add_device: |
; |
; This function is called by the network drivers, |
; to register each running NIC to the kernel |
; |
; IN: Pointer to device structure in ebx |
; OUT: Device num in eax, -1 on error |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_add_device: Called by network driver to register interface. ; |
; ; |
; IN: ebx = ptr to device structure ; |
; ; |
; OUT: eax = device num on success ; |
; eax = -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_add_device: |
net_add_device: |
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_Add_Device: %x\n", ebx ;;; TODO: use mutex to lock net device list |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_add_device: %x\n", ebx ;;; TODO: use mutex to lock net device list |
cmp [NET_RUNNING], NET_DEVICES_MAX |
jae .error |
495,7 → 491,7 |
inc [NET_RUNNING] ; Indicate that one more network device is up and running |
call NET_send_event |
call net_send_event |
DEBUGF DEBUG_NETWORK_VERBOSE, "Device number: %u\n", eax |
ret |
507,19 → 503,17 |
;----------------------------------------------------------------- |
; |
; NET_Remove_Device: |
; |
; This function is called by network drivers, |
; to unregister network devices from the kernel |
; |
; IN: Pointer to device structure in ebx |
; OUT: eax: -1 on error |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_remove_device: Called by network driver to unregister dev. ; |
; ; |
; IN: ebx = ptr to device ; |
; ; |
; OUT: eax: -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_remove_device: |
net_remove_device: |
cmp [NET_RUNNING], 0 |
je .error |
541,7 → 535,7 |
mov dword [edi-4], eax |
dec [NET_RUNNING] |
call NET_send_event |
call net_send_event |
xor eax, eax |
ret |
552,18 → 546,20 |
;----------------------------------------------------------------- |
; |
; NET_ptr_to_num |
; |
; IN: ebx = ptr to device struct |
; OUT: edi = -1 on error, device number otherwise |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_ptr_to_num ; |
; ; |
; IN: ebx = ptr to device struct ; |
; ; |
; OUT: edi = device number ; |
; edi = -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_ptr_to_num: |
net_ptr_to_num: |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
ror edi, 2 ; If -1, stay -1 |
; valid device numbers have last two bits 0, so do just shr |
570,7 → 566,7 |
ret |
align 4 |
NET_ptr_to_num4: ; Todo, place number in device structure so we only need to verify? |
net_ptr_to_num4: ; Todo, place number in device structure so we only need to verify? |
test ebx, ebx |
jz .fail |
595,21 → 591,17 |
pop ecx |
ret |
;----------------------------------------------------------------- |
; |
; checksum_1 |
; |
; This is the first of two functions needed to calculate a checksum. |
; |
; IN: edx = start offset for semi-checksum |
; esi = pointer to data |
; ecx = data size |
; OUT: edx = semi-checksum |
; |
; |
; Code was optimized by diamond |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; checksum_1: Calculate semi-checksum for network packets. ; |
; ; |
; IN: edx = start offset for semi-checksum ; |
; esi = pointer to data ; |
; ecx = data size ; |
; ; |
; OUT: edx = semi-checksum ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
checksum_1: |
679,16 → 671,15 |
.end: |
ret |
;----------------------------------------------------------------- |
; |
; checksum_2 |
; |
; This function calculates the final ip/tcp/udp checksum for you |
; |
; IN: edx = semi-checksum |
; OUT: dx = checksum (in INET byte order) |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; checksum_2: Calculate the final ip/tcp/udp checksum. ; |
; ; |
; IN: edx = semi-checksum ; |
; ; |
; OUT: dx = checksum (in INET byte order) ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
checksum_2: |
713,11 → 704,11 |
;---------------------------------------------------------------- |
; |
; System function to work with network devices (74) |
; |
;---------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; System function 74: Low level access to network devices. ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
sys_network: |
736,7 → 727,7 |
and esi, 0x0000ff00 |
shr esi, 6 |
cmp dword [esi + NET_DRV_LIST], 0 ; check if driver is running |
cmp dword[esi + NET_DRV_LIST], 0 ; check if driver is running |
je .doesnt_exist |
mov eax, [esi + NET_DRV_LIST] |
809,16 → 800,16 |
ret |
.bytes_tx: |
mov ebx, dword [eax + NET_DEVICE.bytes_tx + 4] |
mov ebx, dword[eax + NET_DEVICE.bytes_tx + 4] |
mov [esp+20], ebx |
mov eax, dword [eax + NET_DEVICE.bytes_tx] |
mov eax, dword[eax + NET_DEVICE.bytes_tx] |
mov [esp+32], eax |
ret |
.bytes_rx: |
mov ebx, dword [eax + NET_DEVICE.bytes_rx + 4] |
mov ebx, dword[eax + NET_DEVICE.bytes_rx + 4] |
mov [esp+20], ebx |
mov eax, dword [eax + NET_DEVICE.bytes_rx] |
mov eax, dword[eax + NET_DEVICE.bytes_rx] |
mov [esp+32], eax |
ret |
834,11 → 825,11 |
;---------------------------------------------------------------- |
; |
; System function to work with protocols (76) |
; |
;---------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; System function 76: Low level access to protocol handlers. ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
sys_protocols: |
cmp bh, NET_DEVICES_MAX ; Check if device number exists |
856,28 → 847,28 |
shr eax, 16 ; |
cmp ax, API_ETH |
je ETH_api |
je eth_api |
cmp ax, API_IPv4 |
je IPv4_api |
je ipv4_api |
cmp ax, API_ICMP |
je ICMP_api |
je icmp_api |
cmp ax, API_UDP |
je UDP_api |
je udp_api |
cmp ax, API_TCP |
je TCP_api |
je tcp_api |
cmp ax, API_ARP |
je ARP_api |
je arp_api |
cmp ax, API_PPPOE |
je PPPoE_api |
je pppoe_api |
cmp ax, API_IPv6 |
je IPv6_api |
je ipv6_api |
add esp, 4 ; if we reached here, no function was called, so we need to balance stack |
/kernel/branches/Kolibri-acpi/network/tcp.inc |
---|
206,7 → 206,7 |
; TCP_init: Resets all TCP variables. ; |
; ; |
;-----------------------------------------------------------------; |
macro TCP_init { |
macro tcp_init { |
xor eax, eax |
mov edi, TCP_segments_tx |
219,7 → 219,7 |
init_queue TCP_queue |
movi ebx, 1 |
mov ecx, TCP_process_input |
mov ecx, tcp_process_input |
call new_sys_threads |
test eax, eax |
jns @f |
227,7 → 227,7 |
@@: |
movi ebx, 1 |
mov ecx, TCP_timer_640ms |
mov ecx, tcp_timer_640ms |
call new_sys_threads |
test eax, eax |
jns @f |
246,7 → 246,7 |
;------------------------------------------------------------------; |
; ; |
; TCP_api: This function is called by system function 76 ; |
; tcp_api: Part of system function 76 ; |
; ; |
; IN: bl = subfunction number ; |
; bh = device number ; |
256,7 → 256,7 |
; ; |
;------------------------------------------------------------------; |
align 4 |
TCP_api: |
tcp_api: |
movzx eax, bh |
shl eax, 2 |
/kernel/branches/Kolibri-acpi/network/tcp_input.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5976 $ |
$Revision: 6011 $ |
;-----------------------------------------------------------------; |
; ; |
31,7 → 31,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_input: |
tcp_input: |
; record the current time |
push [timer_ticks] ; in 1/100 seconds |
57,17 → 57,17 |
pop edi |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP incoming queue is full, discarding packet!\n" |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [TCP_segments_missed + edi] |
add esp, sizeof.TCP_queue_entry - 4 |
call NET_BUFF_free |
call net_buff_free |
ret |
align 4 |
proc TCP_process_input |
proc tcp_process_input |
locals |
dataoffset dd ? |
111,7 → 111,7 |
push ecx esi |
pushw [esi + TCP_header.Checksum] |
mov [esi + TCP_header.Checksum], 0 |
TCP_checksum (edi+IPv4_header.SourceAddress), (edi+IPv4_header.DestinationAddress) |
tcp_checksum (edi+IPv4_header.SourceAddress), (edi+IPv4_header.DestinationAddress) |
pop cx ; previous checksum |
cmp cx, dx |
pop edx ecx |
234,7 → 234,7 |
popa |
push ecx edx esi edi |
call SOCKET_fork |
call socket_fork |
pop edi esi edx ecx |
test eax, eax |
312,7 → 312,7 |
lodsw |
rol ax, 8 |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Maxseg=%u\n", eax |
call TCP_mss |
call tcp_mss |
@@: |
jmp .opt_loop |
473,7 → 473,7 |
pusha |
mov ecx, eax |
lea eax, [ebx + STREAM_SOCKET.snd] |
call SOCKET_ring_free |
call socket_ring_free |
popa |
; Update RTT estimators |
483,7 → 483,7 |
mov eax, [timestamp] |
sub eax, [ebx + TCP_SOCKET.ts_ecr] |
inc eax |
call TCP_xmit_timer |
call tcp_xmit_timer |
jmp .rtt_done |
.no_timestamp_rtt: |
493,7 → 493,7 |
cmp eax, [ebx + TCP_SOCKET.t_rtseq] |
jbe .rtt_done |
mov eax, [ebx + TCP_SOCKET.t_rtt] |
call TCP_xmit_timer |
call tcp_xmit_timer |
.rtt_done: |
; update window pointers |
511,10 → 511,10 |
; Awaken waiting processes |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
; Generate more output |
call TCP_output |
call tcp_output |
jmp .drop_no_socket |
540,11 → 540,11 |
mov esi, [dataoffset] |
add esi, edx |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_write ; Add the data to the socket buffer |
call socket_ring_write ; Add the data to the socket buffer |
add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
or [ebx + TCP_SOCKET.t_flags], TF_DELACK ; Set delayed ack flag |
661,7 → 661,7 |
jz .not_terminated |
mov eax, ebx |
call TCP_close |
call tcp_close |
inc [TCPS_rcvafterclose] |
jmp .respond_seg_reset |
691,7 → 691,7 |
; cmp edx, [edx + TCP_header.SequenceNumber] |
; add edx, 64000 ; TCP_ISSINCR FIXME |
mov eax, ebx |
call TCP_close |
call tcp_close |
jmp .findpcb ; FIXME: skip code for unscaling window, ... |
.no_new_request: |
779,7 → 779,7 |
mov [ebx + TCP_SOCKET.t_state], TCPS_CLOSED |
;;; TODO: update stats (tcp drops) |
mov eax, ebx |
call TCP_close |
call tcp_close |
jmp .drop_no_socket |
.rst_close: |
786,7 → 786,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Closing with reset\n" |
mov eax, ebx |
call TCP_close |
call tcp_close |
jmp .drop_no_socket |
.no_rst: |
799,7 → 799,7 |
mov eax, ebx |
mov ebx, ECONNRESET |
call TCP_drop |
call tcp_drop |
jmp .drop_with_reset |
.not_syn_full: |
824,7 → 824,7 |
;;; TODO: update stats |
mov eax, ebx |
call SOCKET_is_connected |
call socket_is_connected |
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
; Do window scaling? |
838,7 → 838,7 |
pop word [ebx + TCP_SOCKET.SND_SCALE] |
@@: |
call TCP_reassemble |
call tcp_reassemble |
mov eax, [edx + TCP_header.SequenceNumber] |
dec eax |
916,7 → 916,7 |
; retransmit missing segment |
mov eax, [esp] |
call TCP_output |
call tcp_output |
; Lock the socket again |
mov ecx, [esp] |
955,7 → 955,7 |
; retransmit missing segment |
mov eax, [esp] |
call TCP_output |
call tcp_output |
; Lock the socket again |
mov ecx, [esp] |
1005,7 → 1005,7 |
mov eax, [timestamp] |
sub eax, [ebx + TCP_SOCKET.ts_ecr] |
inc eax |
call TCP_xmit_timer |
call tcp_xmit_timer |
jmp .rtt_done_ |
; If no timestamp but transmit timer is running and timed sequence number was acked, |
1020,7 → 1020,7 |
mov eax, [ebx + TCP_SOCKET.t_rtt] |
test eax, eax |
jz .rtt_done_ |
call TCP_xmit_timer |
call tcp_xmit_timer |
.rtt_done_: |
1085,7 → 1085,7 |
mov ecx, [ebx + STREAM_SOCKET.snd.size] |
lea eax, [ebx + STREAM_SOCKET.snd] |
sub [ebx + TCP_SOCKET.SND_WND], ecx |
call SOCKET_ring_free |
call socket_ring_free |
pop ebx edx ecx |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: our FIN is acked\n" |
1097,7 → 1097,7 |
push ecx edx ebx |
mov ecx, edi |
lea eax, [ebx + STREAM_SOCKET.snd] |
call SOCKET_ring_free |
call socket_ring_free |
pop ebx |
sub [ebx + TCP_SOCKET.SND_WND], ecx |
pop edx ecx |
1109,7 → 1109,7 |
.wakeup: |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
; Update TCPS |
mov eax, [edx + TCP_header.AckNumber] |
1147,7 → 1147,7 |
test [ebx + SOCKET.state], SS_CANTRCVMORE |
jnz @f |
mov eax, ebx |
call SOCKET_is_disconnected |
call socket_is_disconnected |
mov [ebx + TCP_SOCKET.timer_timed_wait], TCP_time_max_idle |
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
@@: |
1160,11 → 1160,11 |
mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
mov eax, ebx |
call TCP_cancel_timers |
call tcp_cancel_timers |
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
mov eax, ebx |
call SOCKET_is_disconnected |
call socket_is_disconnected |
jmp .ack_processed |
.ack_la: |
1177,7 → 1177,7 |
pop ebx |
mov eax, ebx |
call TCP_close |
call tcp_close |
jmp .drop_no_socket |
.ack_tw: |
1224,8 → 1224,8 |
mov [ebx + TCP_SOCKET.ISS], eax |
mov [ebx + TCP_SOCKET.SND_NXT], eax |
TCP_sendseqinit ebx |
TCP_rcvseqinit ebx |
tcp_sendseqinit ebx |
tcp_rcvseqinit ebx |
mov [ebx + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED |
or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
1233,12 → 1233,12 |
or [ebx + TCP_SOCKET.timer_flags], timer_flag_keepalive |
lea eax, [ebx + STREAM_SOCKET.snd] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .drop |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .drop |
1246,7 → 1246,7 |
pusha |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
popa |
jmp .trim |
1278,7 → 1278,7 |
mov eax, ebx |
mov ebx, ECONNREFUSED |
call TCP_drop |
call tcp_drop |
jmp .drop |
@@: |
1306,7 → 1306,7 |
push [edx + TCP_header.SequenceNumber] |
pop [ebx + TCP_SOCKET.IRS] |
TCP_rcvseqinit ebx |
tcp_rcvseqinit ebx |
or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
1324,7 → 1324,7 |
; set socket state to connected |
push eax |
mov eax, ebx |
call SOCKET_is_connected |
call socket_is_connected |
pop eax |
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
1334,8 → 1334,8 |
cmp eax, TF_REQ_SCALE or TF_RCVD_SCALE |
jne .no_scaling |
mov ax, word [ebx + TCP_SOCKET.requested_s_scale] |
mov word [ebx + TCP_SOCKET.SND_SCALE], ax |
mov ax, word[ebx + TCP_SOCKET.requested_s_scale] |
mov word[ebx + TCP_SOCKET.SND_SCALE], ax |
.no_scaling: |
;;; TODO: reassemble packets queue |
1343,7 → 1343,7 |
mov eax, [ebx + TCP_SOCKET.t_rtt] |
test eax, eax |
je .trim |
call TCP_xmit_timer |
call tcp_xmit_timer |
jmp .trim |
.simultaneous_open: |
1485,13 → 1485,13 |
mov esi, [dataoffset] |
add esi, edx |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_write ; Add the data to the socket buffer |
call socket_ring_write ; Add the data to the socket buffer |
add [ebx + TCP_SOCKET.RCV_NXT], ecx ; Update sequence number with number of bytes we have copied |
popa |
; Wake up the sleeping process |
mov eax, ebx |
call SOCKET_notify |
call socket_notify |
jmp .data_done |
1501,7 → 1501,7 |
; Uh-oh, some data is out of order, lets call TCP reassemble for help |
call TCP_reassemble |
call tcp_reassemble |
; Generate ACK immediately, to let the other end know that a segment was received out of order, |
; and to tell it what sequence number is expected. This aids the fast-retransmit algorithm. |
1522,7 → 1522,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: First FIN for this connection\n" |
mov eax, ebx |
call SOCKET_cant_recv_more |
call socket_cant_recv_more |
or [ebx + TCP_SOCKET.t_flags], TF_ACKNOW |
inc [ebx + TCP_SOCKET.RCV_NXT] |
1556,8 → 1556,8 |
.fin_wait2: |
mov [ebx + TCP_SOCKET.t_state], TCPS_TIMED_WAIT |
mov eax, ebx |
call TCP_cancel_timers |
call SOCKET_is_disconnected |
call tcp_cancel_timers |
call socket_is_disconnected |
.fin_timed: |
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
1583,12 → 1583,12 |
.need_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: need output\n" |
call TCP_output |
call tcp_output |
.done: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
jmp .loop |
1621,7 → 1621,7 |
test [edx + TCP_header.Flags], TH_RST |
jnz .done |
;;; if its a multicast/broadcast, also drop |
; TODO: if its a multicast/broadcast, also drop |
test [edx + TCP_header.Flags], TH_ACK |
jnz .respond_ack |
1636,7 → 1636,7 |
.respond_ack: |
push ebx |
mov cl, TH_RST |
call TCP_respond |
call tcp_respond |
pop ebx |
jmp .destroy_new_socket |
1643,7 → 1643,7 |
.respond_syn: |
push ebx |
mov cl, TH_RST + TH_ACK |
call TCP_respond |
call tcp_respond |
pop ebx |
jmp .destroy_new_socket |
1660,7 → 1660,7 |
test [edx + TCP_header.Flags], TH_RST |
jnz .drop_no_socket |
;;; TODO: if its a multicast/broadcast, also drop |
; TODO: if its a multicast/broadcast, also drop |
test [edx + TCP_header.Flags], TH_ACK |
jnz .respond_seg_ack |
1673,13 → 1673,13 |
.respond_seg_ack: |
mov cl, TH_RST |
xor ebx, ebx ; FIXME: find a way to get the receiving device ptr |
call TCP_respond_segment |
call tcp_respond_segment |
jmp .drop_no_socket |
.respond_seg_syn: |
mov cl, TH_RST + TH_ACK |
xor ebx, ebx ; FIXME: find a way to get the receiving device ptr |
call TCP_respond_segment |
call tcp_respond_segment |
jmp .drop_no_socket |
;------------------------------------------------ |
1701,7 → 1701,7 |
jz .drop_no_socket |
mov eax, ebx |
call SOCKET_free |
call socket_free |
;------------------ |
; Drop the segment |
1709,7 → 1709,7 |
.drop_no_socket: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Drop (no socket)\n" |
call NET_BUFF_free |
call net_buff_free |
jmp .loop |
endp |
/kernel/branches/Kolibri-acpi/network/tcp_output.inc |
---|
14,11 → 14,11 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5584 $ |
$Revision: 6011 $ |
;-----------------------------------------------------------------; |
; ; |
; TCP_output ; |
; tcp_output ; |
; ; |
; IN: eax = socket pointer ; |
; ; |
26,7 → 26,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
proc TCP_output |
proc tcp_output |
locals |
temp_bits db ? |
72,7 → 72,7 |
mov ecx, [eax + TCP_SOCKET.SND_CWND] ; |
@@: ; |
call TCP_outflags ; flags in dl |
call tcp_outflags ; flags in dl |
;------------------------ |
; data being forced out ? |
279,7 → 279,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: Entering persist state\n" |
mov [eax + TCP_SOCKET.t_rxtshift], 0 |
call TCP_set_persist |
call tcp_set_persist |
@@: |
;---------------------------- |
509,7 → 509,7 |
mov edi, [eax + IP_SOCKET.RemoteIP] ; dest ip |
mov al, [eax + IP_SOCKET.ttl] |
mov ah, IP_PROTO_TCP |
call IPv4_output |
call ipv4_output |
jz .ip_error |
;------------------------------------------ |
549,7 → 549,7 |
add [eax + TCP_SOCKET.SND_NXT], ecx ; update sequence number |
sub edx, [eax + TCP_SOCKET.SND_UNA] ; offset |
add eax, STREAM_SOCKET.snd |
call SOCKET_ring_read |
call socket_ring_read |
.nodata: |
pop edi |
pop esi ; begin of data |
606,7 → 606,7 |
test [ebx + NET_DEVICE.hwacc], NET_HWACC_TCP_IPv4_OUT |
jnz .checksum_ok |
TCP_checksum (eax + IP_SOCKET.LocalIP), (eax + IP_SOCKET.RemoteIP) |
tcp_checksum (eax + IP_SOCKET.LocalIP), (eax + IP_SOCKET.RemoteIP) |
.checksum_ok: |
mov [esi + TCP_header.Checksum], dx |
624,7 → 624,7 |
pop ecx |
pop eax |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [TCP_segments_tx + edi] |
inc [TCPS_sndtotal] |
658,7 → 658,7 |
; Check if we need more output |
test [temp_bits], TCP_BIT_SENDALOT |
jnz TCP_output.again |
jnz tcp_output.again |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_send: success!\n" |
/kernel/branches/Kolibri-acpi/network/tcp_subr.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5584 $ |
$Revision: 6011 $ |
align 4 |
iglobal |
21,7 → 21,7 |
TCP_backoff db 0,1,2,3,4,5,6,6,6,6,6,6,6 |
endg |
macro TCP_checksum IP1, IP2 { |
macro tcp_checksum IP1, IP2 { |
;------------- |
; Pseudoheader |
60,9 → 60,9 |
macro TCP_sendseqinit ptr { |
macro tcp_sendseqinit ptr { |
push edi ;;;; i dont like this static use of edi |
push edi ;;;; FIXME: i dont like this static use of edi |
mov edi, [ptr + TCP_SOCKET.ISS] |
mov [ptr + TCP_SOCKET.SND_UP], edi |
mov [ptr + TCP_SOCKET.SND_MAX], edi |
74,7 → 74,7 |
macro TCP_rcvseqinit ptr { |
macro tcp_rcvseqinit ptr { |
push edi |
mov edi, [ptr + TCP_SOCKET.IRS] |
87,7 → 87,7 |
macro TCP_init_socket socket { |
macro tcp_init_socket socket { |
mov [socket + TCP_SOCKET.t_maxseg], TCP_mss_default |
mov [socket + TCP_SOCKET.t_flags], TF_REQ_SCALE or TF_REQ_TSTMP |
106,7 → 106,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_pull_out_of_band ; |
; tcp_pull_out_of_band ; |
; ; |
; IN: eax = ? ; |
; ebx = socket ptr ; |
116,9 → 116,9 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_pull_out_of_band: |
tcp_pull_out_of_band: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_pull_out_of_band\n" |
DEBUGF DEBUG_NETWORK_VERBOSE, "tcp_pull_out_of_band\n" |
;;;; 1282-1305 |
128,7 → 128,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_drop ; |
; tcp_drop ; |
; ; |
; IN: eax = socket ptr ; |
; ebx = error number ; |
137,9 → 137,9 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_drop: ; FIXME CHECKME TODO |
tcp_drop: ; FIXME CHECKME TODO |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_drop: %x\n", eax |
DEBUGF DEBUG_NETWORK_VERBOSE, "tcp_drop: %x\n", eax |
cmp [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED |
jb .no_syn_received |
147,12 → 147,12 |
mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED |
push eax |
call TCP_output |
call tcp_output |
pop eax |
;;; TODO: update stats |
jmp TCP_close |
jmp tcp_close |
.no_syn_received: |
167,7 → 167,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_disconnect ; |
; tcp_disconnect ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
175,22 → 175,22 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_disconnect: |
tcp_disconnect: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_disconnect: %x\n", eax |
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
jb TCP_close ; Connection not yet synchronised, just get rid of the socket |
jb tcp_close ; Connection not yet synchronised, just get rid of the socket |
; TODO: implement LINGER |
call SOCKET_is_disconnecting |
call TCP_usrclosed |
call socket_is_disconnecting |
call tcp_usrclosed |
test eax, eax |
jz @f |
push eax |
call TCP_output |
call tcp_output |
pop eax |
@@: |
ret |
198,7 → 198,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_close ; |
; tcp_close ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
206,7 → 206,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_close: |
tcp_close: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_close: %x\n", eax |
213,8 → 213,8 |
;;; TODO: update RTT and mean deviation |
;;; TODO: update slow start threshold |
call SOCKET_is_disconnected |
call SOCKET_free |
call socket_is_disconnected |
call socket_free |
xor eax, eax |
ret |
223,7 → 223,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_outflags ; |
; tcp_outflags ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
231,10 → 231,10 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_outflags: |
tcp_outflags: |
mov edx, [eax + TCP_SOCKET.t_state] |
movzx edx, byte [edx + .flaglist] |
movzx edx, byte[edx + .flaglist] |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_outflags: socket=%x flags=%x\n", eax, dl |
270,7 → 270,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_respond: |
tcp_respond: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_respond_socket: socket=%x flags=%x\n", ebx, cl |
284,7 → 284,7 |
mov ah, IP_PROTO_TCP |
mov ecx, sizeof.TCP_header |
mov ebx, [ebx + IP_SOCKET.device] |
call IPv4_output |
call ipv4_output |
jz .error |
pop esi cx |
push eax |
320,7 → 320,7 |
sub edi, sizeof.TCP_header |
mov ecx, sizeof.TCP_header |
xchg esi, edi |
TCP_checksum (edi + IP_SOCKET.LocalIP), (edi + IP_SOCKET.RemoteIP) |
tcp_checksum (edi + IP_SOCKET.LocalIP), (edi + IP_SOCKET.RemoteIP) |
mov [esi+TCP_header.Checksum], dx |
;-------------------- |
329,7 → 329,7 |
call [ebx + NET_DEVICE.transmit] |
test eax, eax |
jnz @f |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [TCP_segments_tx + edi] |
@@: |
ret |
343,7 → 343,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_respond_segment ; |
; tcp_respond_segment ; |
; ; |
; IN: ebx = device ptr ; |
; edx = segment ptr (a previously received segment) ; |
354,7 → 354,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_respond_segment: |
tcp_respond_segment: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_respond_segment: frame=%x flags=%x\n", edx, cl |
366,7 → 366,7 |
mov edi, [edi + IPv4_header.SourceAddress] |
mov ecx, sizeof.TCP_header |
mov ax, IP_PROTO_TCP shl 8 + 128 |
call IPv4_output |
call ipv4_output |
jz .error |
pop esi cx |
399,7 → 399,7 |
lea esi, [edi - sizeof.TCP_header] |
mov ecx, sizeof.TCP_header |
TCP_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\ ; FIXME |
tcp_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\ ; FIXME |
(esi - sizeof.IPv4_header + IPv4_header.SourceAddress) |
mov [esi + TCP_header.Checksum], dx |
409,7 → 409,7 |
call [ebx + NET_DEVICE.transmit] |
test eax, eax |
jnz @f |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [TCP_segments_tx + edi] |
@@: |
ret |
421,7 → 421,7 |
ret |
macro TCPT_RANGESET timer, value, min, max { |
macro tcpt_rangeset timer, value, min, max { |
local .min |
local .max |
448,11 → 448,11 |
;-----------------------------------------------------------------; |
; ; |
; TCP_set_persist ; |
; tcp_set_persist ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_set_persist: |
tcp_set_persist: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_set_persist\n" |
473,7 → 473,7 |
; Start/restart persistance timer. |
TCPT_RANGESET [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max |
tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max |
or [ebx + TCP_SOCKET.timer_flags], timer_flag_persist |
pop ebx |
489,7 → 489,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_xmit_timer: Calculate new smoothed RTT. ; |
; tcp_xmit_timer: Calculate new smoothed RTT. ; |
; ; |
; IN: eax = rtt ; |
; ebx = socket ptr ; |
498,7 → 498,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_xmit_timer: |
tcp_xmit_timer: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_xmit_timer: socket=0x%x rtt=%d0ms\n", ebx, eax |
563,7 → 563,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_mss: Update maximum segment size ; |
; tcp_mss: Update maximum segment size ; |
; ; |
; IN: eax = max segment size ; |
; ebx = socket ptr ; |
572,7 → 572,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_mss: |
tcp_mss: |
cmp eax, 1420 ; FIXME |
jbe @f |
587,7 → 587,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_reassemble ; |
; tcp_reassemble ; |
; ; |
; IN: ebx = socket ptr ; |
; edx = segment ptr ; |
596,7 → 596,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_reassemble: |
tcp_reassemble: |
;;;;; TODO |
/kernel/branches/Kolibri-acpi/network/tcp_timer.inc |
---|
14,7 → 14,7 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5442 $ |
$Revision: 6011 $ |
timer_flag_retransmission = 1 shl 0 |
timer_flag_keepalive = 1 shl 1 |
23,7 → 23,7 |
timer_flag_wait = 1 shl 4 |
macro TCP_timer_160ms { |
macro tcp_timer_160ms { |
local .loop |
local .exit |
45,10 → 45,7 |
push ebx |
mov cl, TH_ACK |
call TCP_respond |
; and [ebx + TCP_SOCKET.t_flags], TF_ACKNOW ;; |
; mov eax, ebx ;; |
; call TCP_output ;; |
call tcp_respond |
pop ebx |
inc [TCPS_delack] ; update stats |
61,7 → 58,7 |
align 4 |
proc TCP_timer_640ms ; TODO: implement timed wait timer! |
proc tcp_timer_640ms |
xor esi, esi |
mov ecx, MANUAL_DESTROY |
77,8 → 74,8 |
add [TCP_sequence_num], 64000 |
; scan through all the active TCP sockets, decrementing ALL timers |
; When a timer reaches zero, we'll check wheter it was active or not |
; Scan through all the active TCP sockets, decrementing all active timers |
; When a timer reaches zero, run its handler. |
mov eax, net_sockets |
.loop: |
95,22 → 92,22 |
inc [eax + TCP_SOCKET.t_idle] |
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission |
jz .check_more2 |
dec [eax + TCP_SOCKET.timer_retransmission] |
jnz .check_more2 |
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission |
jz .check_more2 |
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Retransmission timer expired\n", eax |
push eax |
call TCP_output |
call tcp_output |
pop eax |
.check_more2: |
test [eax + TCP_SOCKET.timer_flags], timer_flag_keepalive |
jz .check_more3 |
dec [eax + TCP_SOCKET.timer_keepalive] |
jnz .check_more3 |
test [eax + TCP_SOCKET.timer_flags], timer_flag_keepalive |
jz .check_more3 |
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Keepalive expired\n", eax |
118,7 → 115,7 |
ja .dont_kill |
push eax |
call TCP_disconnect |
call tcp_disconnect |
pop eax |
jmp .loop |
129,7 → 126,7 |
push eax |
mov ebx, eax |
xor cl, cl |
call TCP_respond ; send keepalive |
call tcp_respond ; send keepalive |
pop eax |
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_interval |
jmp .check_more3 |
138,38 → 135,38 |
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle |
.check_more3: |
test [eax + TCP_SOCKET.timer_flags], timer_flag_2msl |
jz .check_more5 |
dec [eax + TCP_SOCKET.timer_timed_wait] |
jnz .check_more5 |
test [eax + TCP_SOCKET.timer_flags], timer_flag_2msl |
jz .check_more5 |
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: 2MSL timer expired\n", eax |
.check_more5: |
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist |
jz .check_more6 |
dec [eax + TCP_SOCKET.timer_persist] |
jnz .check_more6 |
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist |
jz .check_more6 |
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: persist timer expired\n", eax |
call TCP_set_persist |
call tcp_set_persist |
mov [eax + TCP_SOCKET.t_force], 1 |
push eax |
call TCP_output |
call tcp_output |
pop eax |
mov [eax + TCP_SOCKET.t_force], 0 |
.check_more6: |
test [eax + TCP_SOCKET.timer_flags], timer_flag_wait |
jz .loop |
dec [eax + TCP_SOCKET.timer_timed_wait] |
jnz .loop |
test [eax + TCP_SOCKET.timer_flags], timer_flag_wait |
jz .loop |
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: timed wait timer expired\n", eax |
push [eax + SOCKET.NextPtr] |
call TCP_close |
call tcp_close |
pop eax |
jmp .check_only |
187,7 → 184,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_cancel_timers: |
tcp_cancel_timers: |
mov [eax + TCP_SOCKET.timer_flags], 0 |
/kernel/branches/Kolibri-acpi/network/tcp_usreq.inc |
---|
14,12 → 14,12 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 5442 $ |
$Revision: 6011 $ |
;-----------------------------------------------------------------; |
; ; |
; TCP_usrclosed ; |
; tcp_usrclosed ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
27,7 → 27,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_usrclosed: |
tcp_usrclosed: |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_usrclosed: %x\n", eax |
51,7 → 51,7 |
.close: |
mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED |
call TCP_close |
call tcp_close |
pop ebx |
ret |
66,7 → 66,7 |
ret |
.disc: |
call SOCKET_is_disconnected |
call socket_is_disconnected |
.ret: |
pop ebx |
ret |
74,7 → 74,7 |
;-----------------------------------------------------------------; |
; ; |
; TCP_connect ; |
; tcp_connect ; |
; ; |
; IN: eax = socket ptr ; |
; ; |
84,7 → 84,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
TCP_connect: |
tcp_connect: |
test [eax + SOCKET.state], SS_ISCONNECTED |
jnz .eisconn |
112,7 → 112,7 |
; Find a local port, if user didnt define one |
cmp [eax + TCP_SOCKET.LocalPort], 0 |
jne @f |
call SOCKET_find_port |
call socket_find_port |
@@: |
; Start the TCP sequence |
124,16 → 124,16 |
pop [eax + TCP_SOCKET.ISS] |
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_init |
TCP_sendseqinit eax |
tcp_sendseqinit eax |
mov ebx, eax |
lea eax, [ebx + STREAM_SOCKET.snd] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .nomem |
lea eax, [ebx + STREAM_SOCKET.rcv] |
call SOCKET_ring_create |
call socket_ring_create |
test eax, eax |
jz .nomem |
142,11 → 142,11 |
call mutex_unlock |
pop eax |
call SOCKET_is_connecting |
call socket_is_connecting |
; Now send the SYN packet to remote end |
push eax |
call TCP_output |
call tcp_output |
pop eax |
.block: |
183,7 → 183,7 |
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
je .established |
call SOCKET_block |
call socket_block |
jmp .loop |
.timeout: |
190,7 → 190,7 |
mov eax, [esp+4] |
mov [eax + SOCKET.errorcode], ETIMEDOUT |
and [eax + SOCKET.state], not SS_ISCONNECTING |
call SOCKET_notify |
call socket_notify |
ret 4 |
.fail: |
/kernel/branches/Kolibri-acpi/network/udp.inc |
---|
38,10 → 38,10 |
;-----------------------------------------------------------------; |
; ; |
; UDP_init: This function resets all UDP variables ; |
; udp_init: This function resets all UDP variables ; |
; ; |
;-----------------------------------------------------------------; |
macro UDP_init { |
macro udp_init { |
xor eax, eax |
mov edi, UDP_PACKETS_TX |
50,7 → 50,7 |
} |
macro UDP_checksum IP1, IP2 { ; esi = ptr to udp packet, ecx = packet size, destroys: ecx, edx |
macro udp_checksum IP1, IP2 { ; esi = ptr to udp packet, ecx = packet size, destroys: ecx, edx |
; Pseudoheader |
mov edx, IP_PROTO_UDP |
98,7 → 98,7 |
;-----------------------------------------------------------------; |
; ; |
; UDP_input: Inject the UDP data in the application sockets. ; |
; udp_input: Inject the UDP data in the application sockets. ; |
; ; |
; IN: [esp] = ptr to buffer ; |
; ebx = ptr to device struct ; |
111,7 → 111,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
UDP_input: |
udp_input: |
DEBUGF DEBUG_NETWORK_VERBOSE, "UDP_input: size=%u\n", ecx |
123,7 → 123,7 |
; otherwise, we will re-calculate the checksum and add it to this value, thus creating 0 when it is correct |
mov eax, edx |
UDP_checksum (eax+IPv4_header.SourceAddress), (eax+IPv4_header.DestinationAddress) |
udp_checksum (eax+IPv4_header.SourceAddress), (eax+IPv4_header.DestinationAddress) |
jnz .checksum_mismatch |
.no_checksum: |
194,7 → 194,7 |
sub ecx, sizeof.UDP_header |
add esi, sizeof.UDP_header |
jmp SOCKET_input |
jmp socket_input |
.updateport: |
pusha |
220,7 → 220,7 |
.dump: |
DEBUGF DEBUG_NETWORK_VERBOSE, "UDP_input: dumping\n" |
call NET_BUFF_free |
call net_buff_free |
ret |
227,7 → 227,7 |
;-----------------------------------------------------------------; |
; ; |
; UDP_output: Create an UDP packet. ; |
; udp_output: Create an UDP packet. ; |
; ; |
; IN: eax = socket pointer ; |
; ecx = number of bytes to send ; |
238,7 → 238,7 |
;-----------------------------------------------------------------; |
align 4 |
UDP_output: |
udp_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "UDP_output: socket=%x bytes=%u data_ptr=%x\n", eax, ecx, esi |
256,7 → 256,7 |
mov al, [eax + IP_SOCKET.ttl] |
mov ah, IP_PROTO_UDP |
add ecx, sizeof.UDP_header |
call IPv4_output |
call ipv4_output |
jz .fail |
mov [esp + 8], eax ; pointer to buffer start |
279,13 → 279,13 |
; Checksum |
mov esi, edi |
mov [edi + UDP_header.Checksum], 0 |
UDP_checksum (edi-4), (edi-8) ; FIXME: IPv4 packet could have options.. |
udp_checksum (edi-4), (edi-8) ; FIXME: IPv4 packet could have options.. |
DEBUGF DEBUG_NETWORK_VERBOSE, "UDP_output: sending with device %x\n", ebx |
call [ebx + NET_DEVICE.transmit] |
test eax, eax |
jnz @f |
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
inc [UDP_PACKETS_TX + edi] |
@@: |
302,7 → 302,7 |
;-----------------------------------------------------------------; |
; ; |
; UDP_connect ; |
; udp_connect ; |
; ; |
; IN: eax = socket pointer ; |
; ; |
312,11 → 312,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
UDP_connect: |
udp_connect: |
test [eax + SOCKET.state], SS_ISCONNECTED |
jz @f |
call UDP_disconnect |
call udp_disconnect |
@@: |
push eax edx |
340,7 → 340,7 |
; Find a local port, if user didnt define one |
cmp [eax + UDP_SOCKET.LocalPort], 0 |
jne @f |
call SOCKET_find_port |
call socket_find_port |
@@: |
push eax |
348,7 → 348,7 |
call mutex_unlock |
pop eax |
call SOCKET_is_connected |
call socket_is_connected |
xor eax, eax |
ret |
364,11 → 364,11 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
UDP_disconnect: |
udp_disconnect: |
; TODO: remove the pending received data |
call SOCKET_is_disconnected |
call socket_is_disconnected |
ret |
378,7 → 378,7 |
;-----------------------------------------------------------------; |
; ; |
; UDP_api: This function is called by system function 76 ; |
; UDP_api: Part of system function 76 ; |
; ; |
; IN: bl = subfunction number in bl ; |
; bh = device number in bh ; |
388,7 → 388,7 |
; ; |
;-----------------------------------------------------------------; |
align 4 |
UDP_api: |
udp_api: |
movzx eax, bh |
shl eax, 2 |