Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6078 → Rev 5984

/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+0x99000)
add eax, (OS_BASE+0x9A000)
push ecx esi
mov esi, eax
mov ecx, 512/4
207,14 → 207,12
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 + 0x99000
mov edi, OS_BASE + 0x9A000
movzx ecx, [cache_chain_size]
push ecx
shl ecx, 9-2
242,7 → 240,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], 99000000h ; buffer 9900:0000
mov dword [OS_BASE + 514h], 9A000000h ; buffer 9A00:0000
mov dword [OS_BASE + 518h], eax
and dword [OS_BASE + 51Ch], 0
push ebx ecx esi edi
269,7 → 267,7
@@:
mov word [ebx+v86_regs.esi], 510h
mov word [ebx+v86_regs.ss], 9000h
mov word [ebx+v86_regs.esp], 09000h
mov word [ebx+v86_regs.esp], 0A000h
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,60 → 504,30
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
mov ecx, [esp+4]
cmp [IDE_common_irq_param], 0
jz .exit
pushfd
cli
pushad
mov ecx, [IDE_controller_pointer]
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
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:
jz @f
mov [IDE_common_irq_param], 0
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.BAR0_val]
mov edx, [hdbase]
add edx, 7
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
564,6 → 534,51
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/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/sync.inc
144,6 → 144,7
 
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]
 
150,7 → 151,6
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], eax
mov [esp+MUTEX_WAITER.task], ebx
lea esi, [ebp+FUTEX.wait_list]
 
list_add_tail esp, esi ;esp= new waiter, esi= list head
/kernel/branches/Kolibri-acpi/core/dll.inc
747,13 → 747,12
test eax, eax
jnz @F
 
; 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 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/irq.inc
203,8 → 203,6
; 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/v86.inc
89,10 → 89,10
mov byte [0x504], 0x10
mov byte [0x505], 0xF4
 
mov eax, 0x98000+PG_UWR
mov edi, page_tabs+0x98*4
mov eax, 0x99000+PG_UWR
mov edi, page_tabs+0x99*4
mov edx, 0x1000
mov ecx, 8
mov ecx, 7
@@:
stosd
add eax, edx
/kernel/branches/Kolibri-acpi/detect/init_ata.inc
378,11 → 378,9
je .end_set_interrupts
 
push ecx
stdcall attach_int_handler, 14, IDE_irq_14_handler, ecx
pop ecx
stdcall attach_int_handler, 14, IDE_irq_14_handler, 0
DEBUGF 1, "K : Set IDE IRQ14 return code %x\n", eax
push ecx
stdcall attach_int_handler, 15, IDE_irq_15_handler, ecx
stdcall attach_int_handler, 15, IDE_irq_15_handler, 0
DEBUGF 1, "K : Set IDE IRQ15 return code %x\n", eax
pop ecx
 
402,18 → 400,20
; 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, ecx
stdcall attach_int_handler, eax, IDE_common_irq_handler, 0
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,8 → 129,6
* Значение переменной _skinh доступно как результат вызова
подфункции 4 функции 48
 
---------------------- Константы для регистров: ----------------------
eax - SF_CREATE_WINDOW (0)
======================================================================
================= Функция 1 - поставить точку в окне. ================
======================================================================
144,8 → 142,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_PIXEL (1)
======================================================================
============== Функция 2 - получить код нажатой клавиши. =============
======================================================================
182,8 → 178,6
* Поступает информация только о тех горячих клавишах, которые были
определены этим потоком подфункцией 4 функции 66.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_KEY (2)
======================================================================
================ Функция 3 - получить системное время. ===============
======================================================================
199,8 → 193,6
поскольку возвращает просто DWORD-значение счетчика времени.
* Системное время можно установить функцией 22.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SYS_TIME (3)
======================================================================
================ Функция 4 - нарисовать строку текста. ===============
======================================================================
237,8 → 229,6
Ysize dd
picture rb Xsize*Ysize*4 ; 32 бита
 
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_TEXT (4)
======================================================================
========================= Функция 5 - пауза. =========================
======================================================================
255,8 → 245,6
(закончить текущий квант времени), используйте подфункцию 1
функции 68.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SLEEP (5)
======================================================================
=============== Функция 7 - вывести изображение в окно. ==============
======================================================================
272,8 → 260,6
изображения относительно окна.
* Размер изображения в байтах есть 3*xsize*ysize.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_IMAGE (7)
======================================================================
=============== Функция 8 - определить/удалить кнопку. ===============
======================================================================
307,8 → 293,6
* Общее количество кнопок для всех приложений ограничено
числом 4095.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEFINE_BUTTON (8)
======================================================================
============= Функция 9 - информация о потоке выполнения. ============
======================================================================
409,8 → 393,6
размером 1 Кб для будущей совместимости, в будущем могут быть
добавлены некоторые поля.
 
---------------------- Константы для регистров: ----------------------
eax - SF_THREAD_INFO (9)
======================================================================
==================== Функция 10 - ожидать события. ===================
======================================================================
430,8 → 412,6
Чтобы ждать не более определенного времени, используйте
функцию 23.
 
---------------------- Константы для регистров: ----------------------
eax - SF_WAIT_EVENT (10)
======================================================================
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
======================================================================
450,8 → 430,6
Чтобы ждать не более определенного времени, используйте
функцию 23.
 
---------------------- Константы для регистров: ----------------------
eax - SF_CHECK_EVENT (11)
======================================================================
=========== Функция 12 - начать/закончить перерисовку окна. ==========
======================================================================
473,9 → 451,6
* Функция начала перерисовки удаляет все определённые
функцией 8 кнопки, их следует определить повторно.
 
---------------------- Константы для регистров: ----------------------
eax - SF_REDRAW (12)
ebx - SSF_BEGIN_DRAW (1), SSF_END_DRAW (2)
======================================================================
============ Функция 13 - нарисовать прямоугольник в окне. ===========
======================================================================
490,8 → 465,6
* Под координатами понимаются координаты левого верхнего угла
прямоугольника относительно окна.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_RECT (13)
======================================================================
================ Функция 14 - получить размеры экрана. ===============
======================================================================
507,8 → 480,6
* Смотри также подфункцию 5 функции 48 - получить размеры рабочей
области экрана.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SCREEN_SIZE (14)
======================================================================
= Функция 15, подфункция 1 - установить размер фонового изображения. =
======================================================================
526,9 → 497,6
* Есть парная функция получения размеров фонового изображения -
подфункция 1 функции 39.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_SIZE_BG (1)
======================================================================
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
======================================================================
549,9 → 517,6
* Есть парная функция получения точки с фонового изображения -
подфункция 2 функции 39.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_PIXEL_BG (2)
======================================================================
============ Функция 15, подфункция 3 - перерисовать фон. ============
======================================================================
561,9 → 526,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_REDRAW_BG (3)
======================================================================
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
======================================================================
581,9 → 543,6
* Есть парная команда получения режима отрисовки фона -
подфункция 4 функции 39.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_MODE_BG (4)
======================================================================
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
======================================================================
604,9 → 563,6
* Для обновления экрана (после завершения серии команд, работающих с
фоном) вызывайте подфункцию 3 перерисовки фона.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_IMAGE_BG (5)
======================================================================
====================== Функция 15, подфункция 6 ======================
==== Спроецировать данные фона на адресное пространство процесса. ====
624,9 → 580,6
* Пиксели фонового изображения записываются последовательно
слева направо, сверху вниз.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_MAP_BG (6)
======================================================================
====================== Функция 15, подфункция 7 ======================
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
638,9 → 591,6
Возвращаемое значение:
* eax = 1 при успехе, 0 при ошибке
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_UNMAP_BG (7)
======================================================================
====================== Функция 15, подфункция 8 ======================
=========== Получить координаты последней отрисовки фона. ============
658,9 → 608,6
функцию сразу после получения события:
5 = завершилась перерисовка фона рабочего стола
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_LAST_DRAW (8)
======================================================================
====================== Функция 15, подфункция 9 ======================
=============== Перерисовать прямоугольную часть фона. ===============
677,9 → 624,6
(right,bottom) - координаты правого нижнего.
* Если параметры установлены некорректно - фон не перерисовывается.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_SET (15)
ebx - SSF_REDRAW_RECT (9)
======================================================================
============= Функция 16 - сохранить рамдиск на дискету. =============
======================================================================
690,8 → 634,6
* eax = 0 - успешно
* eax = 1 - ошибка
 
---------------------- Константы для регистров: ----------------------
eax - SF_RD_TO_FLOPPY (16)
======================================================================
============== Функция 17 - получить код нажатой кнопки. =============
======================================================================
716,9 → 658,6
в формате подфункции 2 функции 37 в момент начала нажатия
на кнопку, за исключением младшего бита (соответствующего левой
кнопке мыши), который сбрасывается.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_BUTTON (17)
======================================================================
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
======================================================================
729,9 → 668,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_UNFOCUS_WINDOW (1)
======================================================================
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
======================================================================
747,9 → 683,6
* Смотри также подфункцию 18 - завершение
процесса/потока с заданным идентификатором.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_TERMINATE_THREAD (2)
======================================================================
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
======================================================================
764,9 → 697,6
какое-то окно.
* Узнать, какое окно является активным, можно вызовом подфункции 7.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_FOCUS_WINDOW (3)
======================================================================
Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
======================================================================
779,9 → 709,6
Возвращаемое значение:
* eax = значение счётчика пустых тактов в секунду
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_IDLE_COUNT (4)
======================================================================
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
======================================================================
791,9 → 718,6
Возвращаемое значение:
* eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_CPU_REQUENCY (5)
======================================================================
Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
======================================================================
809,9 → 733,6
* Все папки в указанном пути должны существовать, иначе вернётся
значение 5, "файл не найден".
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_RD_TO_HDD (6)
======================================================================
====== Функция 18, подфункция 7 - получить номер активного окна. =====
======================================================================
826,9 → 747,6
сообщения обо всём вводе с клавиатуры.
* Сделать окно активным можно вызовом подфункции 3.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_ACTIVE_WINDOW (7)
======================================================================
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
======================================================================
852,10 → 770,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SPEAKER (8)
ecx - SSSF_GET_STATE (1), SSSF_TOGGLE (2)
======================================================================
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
======================================================================
873,9 → 787,6
* Не следует полагаться на возвращаемое значение при неверном
вызове, оно может измениться в последующих версиях ядра.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SHUTDOWN (9)
======================================================================
========= Функция 18, подфункция 10 - свернуть активное окно. ========
======================================================================
896,9 → 807,6
функцией 0, для окон без скина её можно определить функцией 8),
восстановление - приложением @taskbar.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_MINIMIZE_WINDOW (10)
======================================================================
====================== Функция 18, подфункция 11 =====================
============= Получить информацию о дисковой подсистеме. =============
966,9 → 874,6
* Таблица может быть использована для получения информации
об имеющихся устройствах.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_INFO_DISC_SYS (11)
======================================================================
========== Функция 18, подфункция 13 - получить версию ядра. =========
======================================================================
988,9 → 893,6
db 0
dd 1675
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_KERNEL_VERSION (13)
======================================================================
====================== Функция 18, подфункция 14 =====================
======= Ожидать начала обратного хода луча развёртки монитора. =======
1005,9 → 907,6
высокопроизводительных графических приложений; используется для
плавного вывода графики.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_WAIT_RETRACE (14)
======================================================================
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
======================================================================
1017,9 → 916,6
Возвращаемое значение:
* eax = 0 как признак успеха
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_CURSOR_CENTER (15)
======================================================================
====================== Функция 18, подфункция 16 =====================
============ Получить размер свободной оперативной памяти. ===========
1030,9 → 926,6
Возвращаемое значение:
* eax = размер свободной памяти в килобайтах
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_FREE_RAM (16)
======================================================================
====================== Функция 18, подфункция 17 =====================
============ Получить размер имеющейся оперативной памяти. ===========
1043,9 → 936,6
Возвращаемое значение:
* eax = общий размер имеющейся памяти в килобайтах
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_TOTAL_RAM (17)
======================================================================
====================== Функция 18, подфункция 18 =====================
============= Завершить процесс/поток по идентификатору. =============
1063,9 → 953,6
* Смотри также подфункцию 2 - завершение
процесса/потока по заданному слоту.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_TERMINATE_THREAD_ID (18)
======================================================================
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
======================================================================
1149,12 → 1036,6
 
Замечание: настройки мыши можно регулировать в приложении 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 =====================
============= Получить информацию об оперативной памяти. =============
1180,9 → 1061,6
* +32: dword: размер наибольшего выделенного блока в куче ядра
(зарезервировано)
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_RAM_INFO (20)
======================================================================
====================== Функция 18, подфункция 21 =====================
======= Получить номер слота процесса/потока по идентификатору. ======
1195,9 → 1073,6
* eax = 0 - ошибка (неверный идентификатор)
* иначе eax = номер слота
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_GET_THREAD_SLOT (21)
======================================================================
Функция 18, подфункция 22 - операции с окном другого процесса/потока.
======================================================================
1218,11 → 1093,6
* Восстановление окна с одновременной активизацией осуществляется
подфункции 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 - минимизировать все окна. =========
======================================================================
1235,9 → 1105,6
Замечания:
* Окна спец. потоков (имя начинается с символа @) не сворачиваются.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_MINIMIZE_ALL (23)
======================================================================
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
======================================================================
1254,9 → 1121,6
* Размеры указываемые в функции не должны превышать размеры текущего
видеорежима, иначе функция ничего не изменит.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_SET_SCREEN_LIMITS (24)
======================================================================
===================== Функция 18, подфункция 25 ======================
======== Управление положением окна относительно других окон. ========
1288,10 → 1152,6
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. ====================
======================================================================
1313,9 → 1173,6
* Предварительно должен быть определён базовый порт вызовом
подфункции 1 функции 21.
 
---------------------- Константы для регистров: ----------------------
eax - SF_MIDI (20)
ebx - SSF_RESET (1), SSF_OUTPUT (2)
======================================================================
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
======================================================================
1332,9 → 1189,6
* Получить установленный базовый порт можно вызовом
подфункции 1 функции 26.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_MPU_MIDI_BASE (1)
======================================================================
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
======================================================================
1369,9 → 1223,6
соответствующую текущей стране иконку.
* Приложение @taskbar переключает раскладки по запросу пользователя.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_KEYBOARD_LAYOUT (2)
======================================================================
========= Функция 21, подфункция 5 - установить язык системы. ========
======================================================================
1389,9 → 1240,6
переменную не использует.
* Получить язык системы можно вызовом подфункции 5 функции 26.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_SYS_LANG (5)
======================================================================
====================== Функция 21, подфункция 11 =====================
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1407,9 → 1255,6
* Текущая реализация использует только младший бит ecx.
* Получить текущее состояние можно вызовом подфункции 11 функции 26.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_ACCESS_HD_LBA (11)
======================================================================
====================== Функция 21, подфункция 12 =====================
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1425,9 → 1270,6
* Текущая реализация использует только младший бит ecx.
* Получить текущее состояние можно вызовом подфункции 12 функции 26.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_SET (21)
ebx - SSF_ACCESS_PCI (12)
======================================================================
============ Функция 22 - установить системную дату/время. ===========
======================================================================
1467,8 → 1309,6
автоматически отменяет предыдущую установку. Впрочем, на данный
момент ни одна программа его не использует.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SET_TIME_DATE (22)
======================================================================
============== Функция 23 - ожидать события с таймаутом. =============
======================================================================
1492,8 → 1332,6
с eax=0, если сложение ebx с текущим значением счётчика времени
вызовет 32-битное переполнение.
 
---------------------- Константы для регистров: ----------------------
eax - SF_WAIT_EVENT_TIMEOUT (23)
======================================================================
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
======================================================================
1514,9 → 1352,6
устройства.
* Примером использования функции является приложение CD_tray.
 
---------------------- Константы для регистров: ----------------------
eax - SF_CD (24)
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
======================================================================
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
======================================================================
1533,9 → 1368,6
* Функция поддерживается только для ATAPI-устройств (CD и DVD).
* Примером использования функции является приложение CD_tray.
 
---------------------- Константы для регистров: ----------------------
eax - SF_CD (24)
ebx - SSF_EJECT_TRAY (4), SSF_INSERT_TRAY (5)
======================================================================
========== Функция 25 - записать область на слой фона. ===============
======================================================================
1556,8 → 1388,6
* Функция размещает изображение не на фоновое изображение (ф.15),
а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SCREEN_PUT_IMAGE (25)
======================================================================
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
======================================================================
1570,9 → 1400,6
* Установить базовый порт можно вызовом
подфункции 1 функции 21.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_MPU_MIDI_BASE (1)
======================================================================
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
======================================================================
1611,9 → 1438,6
(используя описываемую функцию).
* Приложение @taskbar переключает раскладки по запросу пользователя.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_KEYBOARD_LAYOUT (2)
======================================================================
========== Функция 26, подфункция 5 - получить язык системы. =========
======================================================================
1628,9 → 1452,6
соответствующую иконку (используя описываемую функцию).
* Установить язык системы можно вызовом подфункции 5 функции 21.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_SYS_LANG (5)
======================================================================
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
======================================================================
1645,9 → 1466,6
497 суток.
* Системное время можно получить функцией 3.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_TIME_COUNT (9)
======================================================================
===================== Функция 26, подфункция 10 ======================
========== Получить значение высокоточного счётчика времени. =========
1664,9 → 1482,6
счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
наносекунд.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_TIME_COUNT_PRO (10)
======================================================================
====================== Функция 26, подфункция 11 =====================
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1681,9 → 1496,6
* Установить текущее состояние можно вызовом
подфункции 11 функции 21.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_ACCESS_HD_LBA (11)
======================================================================
====================== Функция 26, подфункция 12 =====================
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1699,9 → 1511,6
* Установить текущее состояние можно вызовом
подфункции 12 функции 21.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYSTEM_GET (26)
ebx - SSF_ACCESS_PCI (12)
======================================================================
================ Функция 29 - получить системную дату. ===============
======================================================================
1716,8 → 1525,6
Замечания:
* Системную дату можно установить функцией 22.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_SYS_DATE (29)
======================================================================
================ Функция 30 - работа с текущей папкой. ===============
======================================================================
1763,9 → 1570,6
Замечания:
* Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
 
---------------------- Константы для регистров: ----------------------
eax - SF_CURRENT_FOLDER (30)
ebx - SSF_SET_CF (1), SSF_GET_CF (2), SSF_ADD_SYS_FOLDER (3)
======================================================================
========= Функция 34 - узнать кому принадлежит точка экрана. =========
======================================================================
1779,8 → 1583,6
При некорректных значениях ebx и ecx функция возвращает 0
* Функция берет значения из области [_WinMapAddress]
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_PIXEL_OWNER (34)
======================================================================
============ Функция 35 - прочитать цвет точки на экране. ============
======================================================================
1798,8 → 1600,6
функций) через селектор gs. Параметры текущего видеорежима
можно получить функцией 61.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_PIXEL (35)
======================================================================
=============== Функция 36 - прочитать область экрана. ===============
======================================================================
1816,8 → 1616,6
области относительно экрана.
* Размер изображения в байтах есть 3*xsize*ysize.
 
---------------------- Константы для регистров: ----------------------
eax - SF_GET_IMAGE (36)
======================================================================
==================== Функция 37 - работа с мышью. ====================
======================================================================
1940,11 → 1738,6
* После прочтения значения обнуляются.
* Данные имеют знаковые значения.
 
---------------------- Константы для регистров: ----------------------
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 - нарисовать отрезок. ==================
======================================================================
1963,8 → 1756,6
* Координаты берутся относительно окна.
* Конечная точка также рисуется.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_LINE (38)
======================================================================
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
======================================================================
1978,8 → 1769,6
подфункция 1 функции 15. После которой, разумеется, следует
заново определить само изображение.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
======================================================================
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
======================================================================
1998,8 → 1787,6
* Есть парная функция установки точки на фоновом изображении -
подфункция 2 функции 15.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
======================================================================
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
======================================================================
2013,8 → 1800,6
* Есть парная функция установки режима отрисовки фона -
подфункция 4 функции 15.
 
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39)
======================================================================
======== Функция 40 - установить маску для ожидаемых событий. ========
======================================================================
2043,8 → 1828,7
* Функции работы с событиями учитывают маску на момент
вызова функции, а не на момент поступления сообщения.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SET_EVENTS_MASK (40)
 
======================================================================
=================== Функция 43 - ввод/вывод в порт. ==================
======================================================================
2074,8 → 1858,7
быстрее и несколько короче и проще. Из незарезервированных
портов читать всё равно нельзя.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PORT_IN_OUT (43)
 
======================================================================
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
======================================================================
2110,8 → 1893,6
* При завершении потока автоматически освобождаются все
зарезервированные им порты.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SET_PORTS (46)
======================================================================
================= Функция 47 - вывести число в окно. =================
======================================================================
2146,8 → 1927,6
таким количеством цифр, "лишние" ведущие цифры обрезаются.
* Параметры шрифтов указаны в описании функции 4 (вывода текста).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DRAW_NUMBER (47)
======================================================================
======= Функция 48, подфункция 0 - применить настройки экрана. =======
======================================================================
2164,9 → 1943,6
игнорируется.
* Вызов функции с ненулевым ecx игнорируется.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_APPLY (0)
======================================================================
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
======================================================================
2183,9 → 1959,6
подфункцией 0.
* Тип кнопок влияет только на их прорисовку функцией 8.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_BUTTON_STYLE (1)
======================================================================
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
======================================================================
2209,9 → 1982,6
* Таблицу цветов можно просматривать/изменять интерактивно с помощью
приложения desktop.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_COLORS (2)
======================================================================
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
======================================================================
2256,9 → 2026,6
* Стандартные цвета можно просматривать/изменять интерактивно
с помощью приложения desktop.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_COLORS (3)
======================================================================
========== Функция 48, подфункция 4 - получить высоту скина. =========
======================================================================
2272,9 → 2039,6
использующих скин.
* Смотри также общую структуру окна в описании функции 0.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SKIN_HEIGHT (4)
======================================================================
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
======================================================================
2297,9 → 2061,6
позволяющую определить размеры всего экрана.
* Есть парная функция установки рабочей области - подфункция 6.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SCREEN_AREA (5)
======================================================================
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
======================================================================
2331,9 → 2092,6
обновляет координаты и размеры максимизированных окон.
Все окна извещаются о необходимости перерисовки (событие 1).
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_SCREEN_AREA (6)
======================================================================
====================== Функция 48, подфункция 7 ======================
============ Получить область скина для текста заголовка. ============
2354,9 → 2112,6
какого-нибудь заменителя текста заголовка
(по усмотрению приложения).
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_SKIN_MARGINS (7)
======================================================================
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
======================================================================
2376,9 → 2131,6
* Пользователь может изменять скин статически, создав свой
default.skn, или динамически с помощью приложения desktop.
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_SKIN (8)
======================================================================
= Функция 48, подфункция 9 - получить настройку сглаживания шрифтов. =
======================================================================
2388,9 → 2140,6
Возвращаемое значение:
* eax = 2 - субпиксельное, 1 - обычное, 0 - выключить
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_FONT_SMOOTH (9)
======================================================================
===== Функция 48, подфункция 10 - настроить сглаживание шрифтов. =====
======================================================================
2399,9 → 2148,6
* ebx = 10 - номер подфункции
* cl = 2 - субпиксельное, 1 - обычное, 0 - выключить
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_FONT_SMOOTH (10)
======================================================================
======== Функция 48, подфункция 11 - получить размер шрифтов. ========
======================================================================
2411,9 → 2157,6
Возвращаемое значение:
* eax = текущая высота шрифта в пикселях
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_GET_FONT_SIZE (11)
======================================================================
======= Функция 48, подфункция 12 - установить размер шрифтов. =======
======================================================================
2422,9 → 2165,6
* ebx = 10 - номер подфункции
* cl = новая высота шрифта в пикселях
 
---------------------- Константы для регистров: ----------------------
eax - SF_STYLE_SETTINGS (48)
ebx - SSF_SET_FONT_SIZE (12)
======================================================================
============ Функция 49 - Advanced Power Management (APM). ===========
======================================================================
2446,8 → 2186,6
(http://www.pobox.com/~ralf/files.html,
ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
 
---------------------- Константы для регистров: ----------------------
eax - SF_APM (49)
======================================================================
================= Функция 50 - установка формы окна. =================
======================================================================
2493,8 → 2231,6
* Вызов подфункции 0 с нулевым указателем приводит к возврату
к прямоугольной форме.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SET_WINDOW_SHAPE (50)
======================================================================
===================== Функция 51 - создать поток. ====================
======================================================================
2507,8 → 2243,6
* eax = -1 - ошибка (в системе слишком много потоков)
* иначе eax = TID - идентификатор потока
 
---------------------- Константы для регистров: ----------------------
eax - SF_CREATE_THREAD (51)
======================================================================
====================== Функция 54, подфункция 0 ======================
============== Узнать количество слотов в буфере обмена. =============
2520,9 → 2254,6
* eax = количество слотов в буфере
* eax = -1 - отсутствует область главного списка
 
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_GET_SLOT_COUNT (0)
======================================================================
====================== Функция 54, подфункция 1 ======================
================== Считать данные из буфера обмена. ==================
2536,9 → 2267,6
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_READ_CB (1)
======================================================================
====================== Функция 54, подфункция 2 ======================
================== Записать данные в буфер обмена. ===================
2553,9 → 2281,6
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
 
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_WRITE_CB (2)
======================================================================
====================== Функция 54, подфункция 3 ======================
========= Удалить последний слот с данными в буфере обмена ===========
2568,9 → 2293,6
* eax = 1 - ошибка
* eax = -1 - отсутствует область главного списка
 
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_DEL_SLOT (3)
======================================================================
====================== Функция 54, подфункция 4 ======================
=================== Аварийный сброс блокировки буфера ================
2585,9 → 2307,6
* Используется в исключительных случаях, когда зависшее или убитое
приложение заблокировало работу с буфером обмена.
 
---------------------- Константы для регистров: ----------------------
eax - SF_CLIPBOARD (54)
ebx - SSF_UNLOCK_BUFFER (4)
======================================================================
====================== Функция 55, подфункция 55 =====================
========== Начать проигрывать данные на встроенном спикере. ==========
2621,8 → 2340,6
* Данные должны сохраняться в памяти по крайней мере
до конца проигрывания.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SPEAKER_PLAY (55)
======================================================================
======================= Функция 57 - PCI BIOS. =======================
======================================================================
2641,8 → 2358,6
* Если BIOS не поддерживает это расширение, поведение функции
эмулируется (через аналоги подфункций функции 62 режима ядра).
 
---------------------- Константы для регистров: ----------------------
eax - SF_PCI_BIOS (57)
======================================================================
=========== Функция 60 - Inter Process Communication (IPC). ==========
======================================================================
2694,9 → 2409,6
* Система сразу после записи IPC-сообщения в буфер посылает
потоку-приёмнику событие с кодом 7 (см. коды событий).
 
---------------------- Константы для регистров: ----------------------
eax - SF_IPC (60)
ebx - SSF_SET_AREA (1), SSF_SEND_MESSAGE (2)
======================================================================
=== Функция 61 - получить параметры для прямого доступа к графике. ===
======================================================================
2759,10 → 2471,6
* 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-интерфейса. =====
======================================================================
2778,9 → 2486,6
для приложений подфункцией 12 функции 21.
* Если PCI BIOS не поддерживается, то значение ax неопределено.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_VERSION (0)
======================================================================
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
======================================================================
2795,9 → 2500,6
для приложений подфункцией 12 функции 21.
* Если PCI BIOS не поддерживается, то значение al неопределено.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_LAST_BUS (1)
======================================================================
====================== Функция 62, подфункция 2 ======================
== Получить механизм обращения к конфигурационному пространству PCI. =
2816,9 → 2518,6
* Подфункции чтения и записи автоматически работают
с выбранным механизмом.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_GET_ADRR_MODE (2)
======================================================================
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
======================================================================
2850,9 → 2549,6
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-регистр. ======
======================================================================
2883,9 → 2579,6
входит, например, в известный Interrupt List by Ralf Brown;
список вторых должен быть указан в документации по устройству.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PCI (62)
ebx - SSF_WRITE_BYTE (8), SSF_WRITE_WORD (9), SSF_WRITE_DWORD (10)
======================================================================
================ Функция 63 - работа с доской отладки. ===============
======================================================================
2932,9 → 2625,6
* eax = ebx = 0 - буфер пуст
* eax = байт, ebx = 1 - байт успешно прочитан
 
---------------------- Константы для регистров: ----------------------
eax - SF_BOARD (63)
ebx - SSF_DEBUG_WRITE (1), SSF_DEBUG_READ (2)
======================================================================
========== Функция 64 - перераспределить память приложения. ==========
======================================================================
2952,8 → 2642,6
Вызов функции будет игнорироваться, если приложение создаст
локальную кучу вызовом 68.11.
 
---------------------- Константы для регистров: ----------------------
eax - SF_MEMORY_RESIZE (64)
======================================================================
========= Функция 65 - вывести изображение с палитрой в окно. ========
======================================================================
3002,8 → 2690,6
* Вызов функции 7 эквивалентен вызову этой функции с параметрами
esi=24, ebp=0.
 
---------------------- Константы для регистров: ----------------------
eax - SF_PUT_IMAGE_EXT (65)
======================================================================
================= Функция 66 - работа с клавиатурой. =================
======================================================================
3113,11 → 2799,6
* Разблокирование результатов ф. 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 - изменить положение/размеры окна. ===========
======================================================================
3142,8 → 2823,6
получены вызовом функции 9.
* Функция посылает окну событие перерисовки (с кодом 1).
 
---------------------- Константы для регистров: ----------------------
eax - SF_CHANGE_WINDOW (67)
======================================================================
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
======================================================================
3154,9 → 2833,6
* eax = число переключений задач с момента загрузки системы
(по модулю 2^32)
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_GET_TASK_SWITCH_COUNT (0)
======================================================================
====================== Функция 68, подфункция 1 ======================
============ Переключиться на следующий поток выполнения. ============
3172,9 → 2848,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SWITCH_TASK (1)
======================================================================
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
======================================================================
3197,11 → 2870,6
* для 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-регистр. =========
======================================================================
3223,9 → 2891,6
командой cpuid. Иначе возникнет уже другое исключение в ядре,
которое всё равно прибьёт поток.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_READ_MSR (3)
======================================================================
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
======================================================================
3248,9 → 2913,6
командой cpuid. Иначе возникнет уже другое исключение в ядре,
которое всё равно прибьёт поток.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_WRITE_MSR (4)
======================================================================
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
======================================================================
3268,9 → 2930,6
размер существующей кучи.
* После создания кучи вызовы функции 64 игнорируются.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_HEAP_INIT (11)
======================================================================
========== Функция 68, подфункция 12 - выделить блок памяти. =========
======================================================================
3286,9 → 2945,6
* Функция выделяет целое число страниц (4 Кб) так, что фактический
размер выделенного блока больше или равен запрошенному.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_ALLOC (12)
======================================================================
========= Функция 68, подфункция 13 - освободить блок памяти. ========
======================================================================
3303,9 → 2959,6
* Блок памяти должен быть ранее выделен подфункцией 12
или подфункцией 20.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE (13)
======================================================================
====================== Функция 68, подфункция 14 =====================
====== Ожидать получения сигнала от других приложений/драйверов. =====
3321,9 → 2974,6
* +4: данные принятого сигнала (20 байт), формат которых
определяется первым dword-ом
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_WAIT_SIGNAL (14)
======================================================================
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
======================================================================
3342,9 → 2992,6
нулевой символ, остальные символы игнорируются.
* Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER (16)
======================================================================
========== Функция 68, подфункция 17 - управление драйвером. =========
======================================================================
3365,9 → 3012,6
определяются драйвером.
* Предварительно должен быть получен хэндл драйвера подфункцией 16.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_CONTROL_DRIVER (17)
======================================================================
============= Функция 68, подфункция 19 - загрузить DLL. =============
======================================================================
3383,9 → 3027,6
заканчивающийся нулём. Первый dword в структуре является
указателем на имя функции, второй содержит адрес функции.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DLL (19)
======================================================================
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
======================================================================
3410,9 → 3051,6
* Содержимое памяти вплоть до наименьшего из старого и нового
размеров сохраняется.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_REALLOC (20)
======================================================================
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
======================================================================
3428,9 → 3066,6
* Если драйвер ещё не загружен, он загружается;
если драйвер уже загружен, ничего не меняется.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER_PE (21)
======================================================================
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
======================================================================
3470,9 → 3105,6
с кодом ошибки E_ACCESS.
* Процесс, создавший область, всегда имеет доступ на запись.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_OPEN (22)
======================================================================
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
======================================================================
3489,9 → 3121,6
* При завершении потока освобождаются все открытые им
области памяти.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_CLOSE (23)
======================================================================
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
======================================================================
3522,9 → 3151,6
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также
возлагается на обработчик пользователя.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_HANDLER (24)
======================================================================
= Функция 68, подфункция 25 - изменить состояние активности сигнала. =
======================================================================
3541,9 → 3167,6
обработчика исключений, установленного подфункцией 24. При этом
номер сигнала соответствует номеру исключения.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_STATE (25)
======================================================================
= Функция 68, подфункция 26 - освободить страницы памяти ============
======================================================================
3557,9 → 3180,6
* функция освобождает страницы с ecx+edx по ecx+edx+esi
и устанавливает виртуальную память в зарезервированное состояние.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE_EXT (26)
======================================================================
= Функция 68, подфункция 27 - загрузить файл ===================
======================================================================
3573,9 → 3193,6
Примечания:
* функция загружает и, при необходимости, распаковывает файл (kunpack)
 
---------------------- Константы для регистров: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_FILE (27)
======================================================================
======================== Функция 69 - отладка. =======================
======================================================================
3624,12 → 3241,6
* подфункция 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 ======================
========= Определить область данных для отладочных сообщений. ========
3653,9 → 3264,6
* Данные в буфере трактуются как массив элементов переменной длины -
сообщений. Формат сообщения указан в общем описании.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SET_MESSAGE_AREA (0)
======================================================================
====================== Функция 69, подфункция 1 ======================
========= Получить состояние регистров отлаживаемого потока. =========
3685,9 → 3293,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_GET_REGISTERS (1)
======================================================================
====================== Функция 69, подфункция 2 ======================
======== Установить состояние регистров отлаживаемого потока. ========
3707,9 → 3312,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SET_REGISTERS (2)
======================================================================
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
======================================================================
3722,9 → 3324,6
Замечания:
* Если процесс был приостановлен, он возобновляет выполнение.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_DETACH (3)
======================================================================
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
======================================================================
3738,9 → 3337,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_SUSPEND (4)
======================================================================
====================== Функция 69, подфункция 5 ======================
============ Возобновить выполнение отлаживаемого потока. ============
3755,9 → 3351,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_RESUME (5)
======================================================================
====================== Функция 69, подфункция 6 ======================
============= Прочитать из памяти отлаживаемого процесса. ============
3777,9 → 3370,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_READ_MEMORY (6)
======================================================================
Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
======================================================================
3798,9 → 3388,6
* Процесс должен быть загружен для отладки (как указано в
общем описании).
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_WRITE_MEMORY (7)
======================================================================
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
======================================================================
3817,9 → 3404,6
требуется выполнение первого замечания и принимается PID,
а не номер слота.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_TERMINATE (8)
======================================================================
====================== Функция 69, подфункция 9 ======================
============= Установить/снять аппаратную точку останова. ============
3863,9 → 3447,6
* Точка останова на запись и чтение/запись срабатывает после
выполнения вызвавшей её инструкции.
 
---------------------- Константы для регистров: ----------------------
eax - SF_DEBUG (69)
ebx - SSF_DEFINE_BREAKPOINT (9)
======================================================================
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
======================================================================
3936,12 → 3517,6
Разблокировка осуществляется при обращении подфункции 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 - чтение файла с поддержкой длинных имён. =
======================================================================
3970,9 → 3545,6
* Функция не позволяет читать папки
(вернётся eax=10, access denied).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_READ_FILE (0)
======================================================================
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
======================================================================
4072,9 → 3644,6
0x10, а времена и даты обнулены. Альтернативный способ получения
информации об оборудовании - подфункция 11 функции 18.
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_READ_FOLDER (1)
======================================================================
====================== Функция 70, подфункция 2 ======================
======== Создание/перезапись файла с поддержкой длинных имён. ========
4103,9 → 3672,6
сколько сможет, после чего вернёт код ошибки 8.
* Функция не поддерживается для CD (вернётся код ошибки 2).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_CREATE_FILE (2)
======================================================================
====================== Функция 70, подфункция 3 ======================
======== Запись в существующий файл с поддержкой длинных имён. =======
4136,9 → 3702,6
необходимого размера нулевыми символами.
* Функция не поддерживается для CD (вернётся код ошибки 2).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_WRITE_FILE (3)
======================================================================
========= Функция 70, подфункция 4 - установка размера файла. ========
======================================================================
4170,9 → 3733,6
код ошибки 8.
* Функция не поддерживается для CD (вернётся код ошибки 2).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_SET_END (4)
======================================================================
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
======================================================================
4202,9 → 3762,6
* Функция не поддерживает виртуальные папки типа /, /rd и
корневые папки типа /rd/1.
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_GET_INFO (5)
======================================================================
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
======================================================================
4235,9 → 3792,6
корневые папки типа /rd/1.
* Функция не поддерживается для CD (вернётся код ошибки 2).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_SET_INFO (6)
======================================================================
============ Функция 70, подфункция 7 - запуск программы. ============
======================================================================
4271,9 → 3825,6
в замороженном состоянии; для запуска используйте
подфункцию 5 функции 69.
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_START_APP (7)
======================================================================
========== Функция 70, подфункция 8 - удаление файла/папки. ==========
======================================================================
4299,9 → 3850,6
* Можно удалять только пустые папки (попытка удаления непустой папки
приведёт к ошибке с кодом 10, "доступ запрещён").
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_DELETE (8)
======================================================================
============= Функция 70, подфункция 9 - создание папки. =============
======================================================================
4327,9 → 3875,6
* Родительская папка должна уже существовать.
* Если папка уже существует, функция завершится успешно (eax=0).
 
---------------------- Константы для регистров: ----------------------
eax - SF_FILE (70)
[ebx] - SSF_CREATE_FOLDER (9)
======================================================================
=== Функция 71, подфункция 1 - установить заголовок окна программы. ==
======================================================================
4349,8 → 3894,6
иначе будет использоваться cp866.
* Чтобы убрать заголовок, передайте NULL в ecx.
 
---------------------- Константы для регистров: ----------------------
eax - SF_SET_CAPTION (71)
======================================================================
================ Функция 72 - послать сообщение окну. ================
======================================================================
4365,8 → 3908,6
* eax = 0 - успешно
* eax = 1 - буфер заполнен
 
---------------------- Константы для регистров: ----------------------
eax - SF_SEND_MESSAGE (72)
======================================================================
===================== Функция 73 - blit bitmap =====================
======================================================================
4407,8 → 3948,6
Возвращаемое значение:
* функция не возвращает значения
 
---------------------- Константы для регистров: ----------------------
eax - SF_BLITTER (73)
======================================================================
=================== Функция 74, подфункция -1 ========================
=========== Получить количество активных сетевых устройств. ==========
4419,9 → 3958,6
Возвращаемое значение:
* eax = количество активных сетевых устройств
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_COUNT (255)
======================================================================
==== Функция 74, подфункция 0, Получить тип сетевого устройства. =====
======================================================================
4432,9 → 3968,6
Возвращаемое значение:
* eax = тип устройства
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_TYPE (0)
======================================================================
==== Функция 74, подфункция 1, Получить имя сетевого устройства. =====
======================================================================
4447,9 → 3980,6
* eax = -1 для ошибки
* В случае успеха в буфер записывается имя сетевого устройства
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_NAME (1)
======================================================================
======= Функция 74, подфункция 2, Сброс сетевого устройства. =========
======================================================================
4460,9 → 3990,6
Возвращаемое значение:
* eax = -1 для ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RESET_DEVICE (2)
======================================================================
====== Функция 74, подфункция 3, Остановить сетевое устройство. ======
======================================================================
4473,9 → 4000,6
Возвращаемое значение:
* eax = -1 для ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_STOP_DEVICE (3)
======================================================================
===== Функция 74, подфункция 4, Получить указатель на устройство =====
======================================================================
4486,9 → 4010,6
Возвращаемое значение:
* eax = указатель, -1 для ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_DEVICE_POINER (4)
======================================================================
=== Функция 74, подфункция 6, Получить количество посланых пакетов ===
======================================================================
4499,9 → 4020,6
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_TX_PACKET_COUNT (6)
======================================================================
=== Функция 74, подфункция 7, Получить количество принятых пакетов ===
======================================================================
4512,9 → 4030,6
Возвращаемое значение:
* eax = количество с момента старта устройства, -1 для ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RX_PACKET_COUNT (7)
======================================================================
==== Функция 74, подфункция 8, Получить количество посланых байт. ====
======================================================================
4526,9 → 4041,6
* eax = количество с момента старта устройства, -1 для ошибки
* ebx = старшая часть
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_TX_BYTE_COUNT (8)
======================================================================
==== Функция 74, подфункция 9, Получить количество принятых байт. ====
======================================================================
4540,9 → 4052,6
* eax = количество с момента старта устройства, -1 для ошибки
* ebx = старшая часть
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_RX_BYTE_COUNT (9)
======================================================================
======= Функция 74, подфункция 10, Получить статус соединения. =======
======================================================================
4561,9 → 4070,6
12 = 1 Гбит
10b = флаг полного дуплекса
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_GET (74)
bl - SSF_LINK_STATUS (10)
======================================================================
======= Функция 75, подфункция 0, Open socket (Открыть сокет). =======
======================================================================
4577,9 → 4083,6
* eax = номер сокета, -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_OPEN (0)
======================================================================
======= Функция 75, подфункция 1, Close socket (Закрыть сокет). ======
======================================================================
4591,9 → 4094,6
* eax = -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CLOSE (1)
======================================================================
============= Функция 75, подфункция 2, Bind (Привязка). =============
======================================================================
4607,9 → 4107,6
* eax = -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_BIND (2)
======================================================================
============ Функция 75, подфункция 3, Listen (Слушать). =============
======================================================================
4622,9 → 4119,6
* eax = -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_LISTEN (3)
======================================================================
========== Функция 75, подфункция 4, Connect (Соединение). ===========
======================================================================
4638,9 → 4132,6
* eax = -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CONNECT (4)
======================================================================
=========== Функция 75, подфункция 5, Accept (Соглашение). ===========
======================================================================
4654,9 → 4145,6
* eax = номер сокета из принятого сокета, -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_ACCEPT (5)
======================================================================
============= Функция 75, подфункция 6, Send (Послать). ==============
======================================================================
4671,9 → 4159,6
* eax = количество скопированных байтов, -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_SEND (6)
======================================================================
============ Функция 75, подфункция 7, Receive (Получить). ===========
======================================================================
4688,9 → 4173,6
* eax = количество скопированных байтов, -1 для ошибки
* ebx = код ошибки
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_RECEIVE (7)
======================================================================
= Функция 75, подфункция 8, Set socket options (Задать опции сокета) =
======================================================================
4709,9 → 4191,6
dd optlength
db options...
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_SET_OPTIONS (8)
======================================================================
= Функция 75, подфункция 9, Get socket options(Получить опции сокета)
======================================================================
4730,9 → 4209,6
dd optlength
db options...
 
---------------------- Константы для регистров: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_GET_OPTIONS (9)
======================================================================
= Функция 75, подфункция 10, Get socketpair (Получить парный сокет). =
======================================================================
4743,59 → 4219,7
* 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 - завершить выполнение потока/процесса =========
======================================================================
Параметры:
4810,8 → 4234,6
* Эта функция завершает текущий поток. Другой поток можно прибить
вызовом подфункции 2 функции 18.
 
---------------------- Константы для регистров: ----------------------
eax - SF_TERMINATE_PROCESS (-1)
======================================================================
=========================== Список событий ===========================
======================================================================
/kernel/branches/Kolibri-acpi/docs/sysfuncs.txt
126,8 → 126,6
* 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. ===============
======================================================================
141,8 → 139,6
Returned value:
* function does not return value
 
---------------------- Constants for registers: ----------------------
eax - SF_PUT_PIXEL (1)
======================================================================
============ Function 2 - get the code of the pressed key. ===========
======================================================================
180,8 → 176,6
* 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. ===================
======================================================================
197,8 → 191,6
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. ===================
======================================================================
233,8 → 225,6
Ysize dd
picture rb Xsize*Ysize*4 ; 32 bpp
 
---------------------- Constants for registers: ----------------------
eax - SF_DRAW_TEXT (4)
======================================================================
========================= Function 5 - delay. ========================
======================================================================
250,8 → 240,6
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. ===============
======================================================================
267,8 → 255,6
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. ===============
======================================================================
301,8 → 287,6
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. ===========
======================================================================
401,8 → 385,6
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. ===================
======================================================================
421,8 → 403,6
* 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. ==============
======================================================================
440,8 → 420,6
* 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. ===============
======================================================================
463,9 → 441,6
* 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. ===========
======================================================================
480,8 → 455,6
* 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. ===================
======================================================================
497,8 → 470,6
* 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. ==
======================================================================
517,9 → 488,6
* 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. ==
======================================================================
540,9 → 508,6
* 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. ==========
======================================================================
552,9 → 517,6
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. =
======================================================================
572,9 → 534,6
* 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. ============
596,9 → 555,6
* 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. ========
616,9 → 572,6
* 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. =====
======================================================================
629,9 → 582,6
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 ============
649,9 → 599,6
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 ===========
668,9 → 615,6
(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. ==============
======================================================================
681,8 → 625,6
* eax = 0 - success
* eax = 1 - error
 
---------------------- Constants for registers: ----------------------
eax - SF_RD_TO_FLOPPY (16)
======================================================================
======= Function 17 - get the identifier of the pressed button. ======
======================================================================
706,8 → 648,6
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. ==========
719,9 → 659,6
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. =
======================================================================
738,9 → 675,6
* 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. ============
756,9 → 690,6
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. ===========
772,9 → 703,6
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. ==========
======================================================================
784,9 → 712,6
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.
======================================================================
802,9 → 727,6
* 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. ==========
======================================================================
819,9 → 741,6
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. =
======================================================================
846,10 → 765,6
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. ==
======================================================================
868,9 → 783,6
* 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. =======
======================================================================
892,9 → 804,6
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.
======================================================================
963,9 → 872,6
* 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. =========
======================================================================
985,9 → 891,6
db 0
dd 1675
 
---------------------- Constants for registers: ----------------------
eax - SF_SYSTEM (18)
ebx - SSF_KERNEL_VERSION (13)
======================================================================
======= Function 18, subfunction 14 - wait for screen retrace. =======
======================================================================
1002,9 → 905,6
* 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. ==
======================================================================
1014,9 → 914,6
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. ========
======================================================================
1026,9 → 923,6
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. =======
======================================================================
1038,9 → 932,6
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. ============
1058,9 → 949,6
* 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. =======
======================================================================
1144,12 → 1032,6
 
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. =======
======================================================================
1174,9 → 1056,6
* +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. ========
1189,9 → 1068,6
* 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. =============
1213,11 → 1089,6
* 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. ==========
======================================================================
1230,9 → 1101,6
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. ==========
======================================================================
1251,9 → 1119,6
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. ======
1285,10 → 1150,6
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. ===================
======================================================================
1310,9 → 1171,6
* 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. ========
======================================================================
1328,9 → 1186,6
* 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. =========
======================================================================
1364,9 → 1219,6
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. =========
======================================================================
1384,9 → 1236,6
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.
======================================================================
1401,9 → 1250,6
* 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.
======================================================================
1418,9 → 1264,6
* 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. ================
======================================================================
1459,8 → 1302,6
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. =============
======================================================================
1484,8 → 1325,6
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. =======
======================================================================
1506,9 → 1345,6
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. =======
======================================================================
1525,9 → 1361,6
* 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. ========
======================================================================
1548,8 → 1381,6
* 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. ========
======================================================================
1561,9 → 1392,6
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. =========
======================================================================
1600,9 → 1428,6
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. =========
======================================================================
1617,9 → 1442,6
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. ==
======================================================================
1633,9 → 1455,6
than 497 days.
* 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. =========
1650,9 → 1469,6
* 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. ==========
1666,9 → 1482,6
* 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. =========
1683,9 → 1496,6
* 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. ===================
======================================================================
1700,8 → 1510,6
Remarks:
* To set system date use function 22.
 
---------------------- Constants for registers: ----------------------
eax - SF_GET_SYS_DATE (29)
======================================================================
============= Function 30 - work with the current folder. ============
======================================================================
1746,9 → 1554,6
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. ===========
======================================================================
1762,8 → 1567,6
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. =======
======================================================================
1781,8 → 1584,6
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. ==================
======================================================================
1799,8 → 1600,6
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. ===================
======================================================================
1923,11 → 1722,6
* 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. ======================
======================================================================
1946,8 → 1740,6
* 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. ==
======================================================================
1961,8 → 1753,6
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. =
======================================================================
1982,8 → 1772,6
* 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. =
======================================================================
1997,8 → 1785,6
* 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. ==========
======================================================================
2026,8 → 1812,7
* 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. ===============
======================================================================
2056,8 → 1841,7
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. =====
======================================================================
2090,8 → 1874,6
* 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. =============
======================================================================
2126,8 → 1908,6
* 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. ========
======================================================================
2144,9 → 1924,6
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. ===========
======================================================================
2163,9 → 1940,6
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. ======
======================================================================
2189,9 → 1963,6
* 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. ======
======================================================================
2237,9 → 2008,6
* 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. ===========
======================================================================
2254,9 → 2022,6
* 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. =======
======================================================================
2279,9 → 2044,6
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. =======
======================================================================
2312,9 → 2074,6
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. ===========
======================================================================
2333,9 → 2092,6
(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. ============
======================================================================
2356,9 → 2112,6
* 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. ======
======================================================================
2368,9 → 2121,6
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. =========
======================================================================
2379,9 → 2129,6
* 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. ============
======================================================================
2391,9 → 2138,6
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. ============
======================================================================
2402,9 → 2146,6
* 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). ===========
======================================================================
2427,8 → 2168,6
(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. ==================
======================================================================
2475,8 → 2214,6
* 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. ====================
======================================================================
2488,9 → 2225,8
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. =============
2502,9 → 2238,6
* 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. ==================
2518,9 → 2251,6
* 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. ===================
2535,9 → 2265,6
* 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 ===============
2550,9 → 2277,6
* 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 ====================
2567,9 → 2291,6
* 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.
======================================================================
2603,8 → 2324,6
* 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. ======================
======================================================================
2623,8 → 2342,6
* 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). ==========
======================================================================
2674,9 → 2391,6
* 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. ====
======================================================================
2736,10 → 2450,6
* 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. =====
======================================================================
2755,9 → 2465,6
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. ====
======================================================================
2772,9 → 2479,6
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. ====
2793,9 → 2497,6
* 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. ========
======================================================================
2828,9 → 2529,6
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. =====
======================================================================
2861,9 → 2559,6
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. ==============
======================================================================
2909,9 → 2604,6
* 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. ==============
======================================================================
2929,8 → 2621,6
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. ========
======================================================================
2975,8 → 2665,6
* 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. =================
======================================================================
3085,11 → 2773,6
* 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. =========
======================================================================
3114,8 → 2797,6
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. =====
======================================================================
3126,9 → 2807,6
* 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. ======
======================================================================
3142,9 → 2820,6
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. ============
======================================================================
3167,11 → 2842,6
* 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. ==========
======================================================================
3196,9 → 2866,6
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. ========
======================================================================
3224,9 → 2891,6
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. =======
======================================================================
3244,9 → 2908,6
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. ========
======================================================================
3263,9 → 2924,6
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. ==========
======================================================================
3280,9 → 2938,6
* 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. ============
3297,9 → 2952,6
* +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. =============
======================================================================
3318,9 → 2970,6
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. ===========
======================================================================
3341,9 → 2990,6
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. ==============
======================================================================
3359,9 → 3005,6
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. =======
======================================================================
3385,9 → 3028,6
* 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. ============
======================================================================
3403,9 → 3043,6
* 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. =======
======================================================================
3444,9 → 3081,6
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. =======
======================================================================
3462,9 → 3096,6
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. ========
======================================================================
3497,9 → 3128,6
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 ========
======================================================================
3516,9 → 3144,6
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 ============
======================================================================
3532,9 → 3157,6
* 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 ===================
======================================================================
3548,9 → 3170,6
Remarks:
* function loads file and unpacks, if necessary
 
---------------------- Constants for registers: ----------------------
eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_FILE (27)
======================================================================
====================== Function 69 - debugging. ======================
======================================================================
3597,12 → 3216,6
* 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. =
======================================================================
3626,9 → 3239,6
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. ===========
3658,9 → 3268,6
* 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. ===========
3680,9 → 3287,6
* 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. =====
======================================================================
3695,9 → 3299,6
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. =======
======================================================================
3711,9 → 3312,6
* 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. ========
======================================================================
3727,9 → 3325,6
* 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. =
======================================================================
3748,9 → 3343,6
* 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. =
======================================================================
3769,9 → 3361,6
* 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. ======
======================================================================
3788,9 → 3377,6
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. ====
======================================================================
3832,9 → 3418,6
* 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. ====
======================================================================
3903,12 → 3486,6
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. ==
======================================================================
3936,9 → 3513,6
* 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. =
======================================================================
4036,9 → 3610,6
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. ============
4067,9 → 3638,6
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. ==========
4100,9 → 3668,6
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. ===========
======================================================================
4134,9 → 3699,6
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. ====
======================================================================
4165,9 → 3727,6
* 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. ====
======================================================================
4198,9 → 3757,6
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. ==========
======================================================================
4233,9 → 3789,6
* 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. ==========
======================================================================
4261,9 → 3814,6
* 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. ============
======================================================================
4289,9 → 3839,6
* 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. ==========
======================================================================
4310,8 → 3857,6
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. ==============
======================================================================
4326,8 → 3871,6
* eax = 0 - success
* eax = 1 - buffer is full
 
---------------------- Constants for registers: ----------------------
eax - SF_SEND_MESSAGE (72)
======================================================================
===================== Function 73 - blit bitmap =====================
======================================================================
4367,8 → 3910,6
Returned value:
* function does not return value
 
---------------------- Constants for registers: ----------------------
eax - SF_BLITTER (73)
======================================================================
= Function 74, Subfunction 255, Get number of active network devices. =
======================================================================
4378,9 → 3919,6
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. ========
======================================================================
4391,9 → 3929,6
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. ========
======================================================================
4406,9 → 3941,6
* 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. ==========
======================================================================
4419,9 → 3951,6
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. ==========
======================================================================
4432,9 → 3961,6
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. ==========
======================================================================
4445,9 → 3971,6
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. =========
======================================================================
4458,9 → 3981,6
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. =========
======================================================================
4471,9 → 3991,6
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. ==========
======================================================================
4486,9 → 4003,6
-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. ==========
======================================================================
4501,9 → 4015,6
-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. =============
======================================================================
4522,9 → 4033,6
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. ==============
======================================================================
4538,9 → 4046,6
* 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. ==============
======================================================================
4552,9 → 4057,6
* eax = -1 on error
* ebx = errorcode
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CLOSE (1)
======================================================================
================== Function 75, Subfunction 2, Bind. =================
======================================================================
4568,9 → 4070,6
* eax = -1 on error
* ebx = errorcode
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_BIND (2)
======================================================================
================= Function 75, Subfunction 3, Listen. ================
======================================================================
4583,9 → 4082,6
* eax = -1 on error
* ebx = errorcode
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_LISTEN (3)
======================================================================
================ Function 75, Subfunction 4, Connect. ================
======================================================================
4599,9 → 4095,6
* eax = -1 on error
* ebx = errorcode
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_CONNECT (4)
======================================================================
================= Function 75, Subfunction 5, Accept. ================
======================================================================
4615,9 → 4108,6
* 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. =================
======================================================================
4632,9 → 4122,6
* 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. ================
======================================================================
4649,9 → 4136,6
* 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. ==========
======================================================================
4671,9 → 4155,6
dd optlength
db options...
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_SET_OPTIONS (8)
======================================================================
=========== Function 75, Subfunction 9, Get socket options. ==========
======================================================================
4693,9 → 4174,6
dd optlength
db options...
 
---------------------- Constants for registers: ----------------------
eax - SF_NETWORK_SOCKET (75)
bl - SSF_GET_OPTIONS (9)
======================================================================
============ Function 75, Subfunction 10, Get socketpair. ===========
======================================================================
4706,9 → 4184,6
* 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. ============
======================================================================
4722,7 → 4197,7
0 - Read MAC
 
IPv4 (1)
0 - Read # IP packets sent
0 - Read # IP packets send
1 - Read # IP packets received
2 - Read IP
3 - Write IP
4734,20 → 4209,20
9 - Write gateway
 
ICMP (2)
0 - Read # ICMP packets sent
0 - Read # ICMP packets send
1 - Read # ICMP packets received
3 - enable/disable ICMP echo reply
 
UDP (3)
0 - Read # UDP packets sent
0 - Read # UDP packets send
1 - Read # UDP packets received
 
TCP (4)
0 - Read # TCP packets sent
0 - Read # TCP packets send
1 - Read # TCP packets received
 
ARP (5)
0 - Read # ARP packets sent
0 - Read # ARP packets send
1 - Read # ARP packets received
2 - Read # ARP entry's
3 - Read ARP entry
4756,53 → 4231,7
6 - Send ARP announce on specified interface
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,8 → 1808,6
mov ebx, [ebx+16] ; buffer
push ebx
push 0
test ecx, ecx
jz .done
mov eax, [edi+28]
sub eax, edx
jb .fileEnd
1922,7 → 1920,7
jnz .noaccess3
pop ecx
xor edx, edx
jecxz .done
jcxz .done
jmp .alignedCluster
.readEnd:
add ecx, edi
/kernel/branches/Kolibri-acpi/fs/ntfs.inc
37,8 → 37,6
recordFlags = 16h
recordRealSize = 18h
recordAllocatedSize = 1ch
baseRecordReference = 20h ; for auxiliary records
baseRecordReuse = 26h
newAttributeID = 28h
; attribute header
attributeType = 0
46,10 → 44,9
nonResidentFlag = 8
nameLength = 9
nameOffset = 10
attributeFlags = 12
attributeID = 14
sizeWithoutHeader = 16
indexedFlag = 16h
attributeFlags = 16h
; non resident attribute header
lastVCN = 18h
dataRunsOffset = 20h
114,8 → 111,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 ?
146,7 → 143,7
dd ntfs_ReadFile
dd ntfs_ReadFolder
dd ntfs_CreateFile
dd ntfs_WriteFile
dd ntfs_Write
dd ntfs_SetFileEnd
dd ntfs_GetFileInfo
dd ntfs_SetFileInfo
273,10 → 270,13
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,7 → 544,6
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
993,18 → 992,6
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
1034,7 → 1021,15
mov [ebp+NTFS.ntfsLastRead], eax
push ecx
xor edx, edx
call dword[esp+18h]
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:
pop ecx
test eax, eax
jnz .errread2
1049,7 → 1044,7
xor edx, edx
cmp [ebp+NTFS.ntfs_cur_size], 0
jnz .readloop
add esp, 14h
add esp, 10h
mov eax, [ebp+NTFS.ntfs_cur_tail]
test eax, eax
jz @f
1060,11 → 1055,11
ret
.errread2:
pop ecx
add esp, 14h
add esp, 10h
stc
ret
.break:
add esp, 14h ; CF=0
add esp, 10h ; CF=0
mov [ebp+NTFS.ntfs_bCanContinue], 1
ret
 
1162,14 → 1157,6
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
1224,8 → 1211,8
; in: [esi]+[esp+4] = name
; out:
; [ebp+NTFS.ntfs_cur_iRecord] = number of MFT fileRecord
; eax -> index in the parent index node
; CF=1 -> file not found, eax=0 -> error
; eax = pointer in parent index node
; CF=1 -> file not found (or just error)
mov [ebp+NTFS.ntfs_cur_iRecord], 5 ; start parse from root cluster
.doit2:
mov [ebp+NTFS.ntfs_cur_attr], 0x90 ; $INDEX_ROOT
1235,11 → 1222,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
1358,6 → 1345,7
add esi, 0x18
jmp .scanloop
.notfound:
mov [ebp+NTFS.ntfsNotFound], 1
mov [esp+1Ch], esi
.err:
popad
1482,6 → 1470,7
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
1561,7 → 1550,7
test eax, eax
jz .notfound
or ebx, -1
push ERROR_DEVICE
push 11
jmp .pop_ret
.ok:
cmp [ebp+NTFS.ntfs_cur_read], 0x20
1598,7 → 1587,7
call ntfs_unlock
popad
or ebx, -1
movi eax, ERROR_OUT_OF_MEMORY
movi eax, 12
ret
@@:
mov [ebp+NTFS.cur_index_buf], eax
1987,7 → 1976,6
ntfs_CreateFolder:
mov [ebp+NTFS.ntfsFolder], 1
jmp @f
 
ntfs_CreateFile:
mov [ebp+NTFS.ntfsFolder], 0
@@:
1994,57 → 1982,36
cmp byte [esi], 0
jnz @f
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
movi eax, ERROR_ACCESS_DENIED ; root directory itself
ret
@@: ; 1. Search file
call ntfs_lock
mov [ebp+NTFS.ntfsNotFound], 0
stdcall ntfs_find_lfn, [esp+4]
jnc .found
jnc @f ; found; rewrite
cmp [ebp+NTFS.ntfsFragmentCount], 1
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
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
cmp dword [esp+4], 0
jnz ntfsNotFound
jnz .bad
cmp byte [esi], 0
jz ntfsNotFound
; 2. Prepare directory record
jnz @f
.bad: ; path folder not found
push ERROR_FILE_NOT_FOUND
jmp ntfsError
@@: ; 2. Prepair directory record
mov ecx, esi
@@: ; count characters
inc ecx
cmp byte [ecx], '/'
jz ntfsNotFound
jz .bad
cmp byte [ecx], 0
jnz @b
sub ecx, esi
2055,15 → 2022,16
mov edi, [ebp+NTFS.cur_index_buf]
push esi
push ecx
cmp dword [edi], 'INDX'
cmp dword [edi], 'INDX' ; where are we?
jz .indexRecord
mov esi, [ebp+NTFS.frs_buffer] ; indexRoot
mov esi, [ebp+NTFS.frs_buffer] ; mftRecord
mov edx, [esi+recordRealSize]
add edx, ecx
cmp [esi+recordAllocatedSize], edx
jnc @f
add esp, 12
jmp ntfsUnsupported ; indexAllocation required
push ERROR_UNSUPPORTED_FS ; indexAllocation required
jmp ntfsError
@@: ; index fits in the indexRoot
mov [esi+recordRealSize], edx
mov ecx, edx
2075,7 → 2043,7
mov esi, [esp]
add [edi+sizeWithHeader], esi
add [edi+sizeWithoutHeader], esi
mov cl, [edi+attributeOffset]
mov cx, [edi+attributeOffset]
add edi, ecx
add [edi+16+nodeRealSize], esi
add [edi+16+nodeAllocatedSize], esi
2087,15 → 2055,16
jmp .common
 
.indexRecord:
mov edx, [edi+28]
mov edx, [edi+1ch]
add edx, ecx
cmp [edi+32], edx
cmp [edi+20h], edx
jnc @f
add esp, 12
jmp ntfsUnsupported ; new node required
push ERROR_UNSUPPORTED_FS ; new node required
jmp ntfsError
@@: ; index fits in the node
mov [edi+28], edx
lea edi, [edi+edx+24-4]
mov [edi+1ch], edx
lea edi, [edi+edx+14h]
.common:
mov esi, edi
sub esi, [esp]
2163,10 → 2132,12
jz .small
push eax ; bitmap dwords
add edi, 4
xor edx, edx
.start:
mov ecx, [ebp+NTFS.BitmapSize]
add ecx, [ebp+NTFS.BitmapBuffer]
sub ecx, edi
mov eax, edi
sub eax, [ebp+NTFS.BitmapBuffer]
sub ecx, eax
shr ecx, 2
@@:
xor eax, eax
2188,7 → 2159,6
jnz .start
sub esi, 4
mov eax, [esi]
xor edx, edx
bsr edx, eax
inc edx
push edx ; starting bit
2269,34 → 2239,36
mov [esp+4], ecx
@@:
mov edi, [esp]
xor eax, eax
dec eax
shr eax, cl
shl eax, cl
mov esi, [ebp+NTFS.fileDataSize]
mov edx, [edi]
ror edx, cl
neg ecx
add ecx, 32
sub ecx, [ebp+NTFS.fileDataSize]
jc @f
shl eax, cl ; fits inside dword
shr eax, cl
or [edi], eax
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
jmp .writeData
 
@@:
or [edi], eax
neg ecx
push ecx
shrd edx, eax, cl
mov [edi], edx
mov ecx, esi
shr ecx, 5
add edi, 4
xor eax, eax
dec eax
rep stosd
pop ecx
mov ecx, esi
and ecx, 31
shr eax, cl
shl eax, cl
not eax
or [edi], eax
mov edx, [edi]
shr edx, cl
shld edx, eax, cl
mov [edi], edx
.writeData:
pop edx
sub edx, [ebp+NTFS.BitmapBuffer]
2312,7 → 2284,10
mov ebx, [ebx+16]
call fs_write64_app
test eax, eax
jnz ntfsDevice
jz .mftBitmap
push 11
jmp ntfsError
 
; 4. MFT record
.mftBitmap: ; search for free record
mov edi, [ebp+NTFS.mftBitmapBuffer]
2325,8 → 2300,13
movzx eax, byte [edi]
not al
bsf ecx, eax
jz ntfsUnsupported ; no free records
bts [edi], ecx
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
sub edi, [ebp+NTFS.mftBitmapBuffer]
shl edi, 3
2347,21 → 2327,18
; 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 ntfsUnsupported ; auxiliary record
jnz ntfsError ; 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
adc byte [edi+initialDataSize+4], 0
movzx eax, byte [edi+dataRunsOffset]
add edi, eax
mov al, [edi]
add edi, [edi+dataRunsOffset]
movzx eax, byte [edi]
inc edi
shl eax, 4
shr al, 4
2371,13 → 2348,13
add ah, al
shr eax, 8
cmp byte [edi+eax], 0
jnz ntfsUnsupported ; $MFT fragmented
jnz ntfsError ; $MFT fragmented
mov al, 8
mov edx, [edi]
rol eax, cl
rol edx, cl
add eax, edx
jc ntfsUnsupported
jc ntfsError
ror eax, cl
shr edx, cl
mov [edi], eax
2387,16 → 2364,17
and ecx, 7
shr edx, 3
add edx, [ebp+NTFS.BitmapBuffer]
mov ax, [edx]
shr ax, cl
test al, al
jnz ntfsUnsupported
dec al
movzx eax, word [edx]
shr eax, cl
jnz ntfsError
mov al, -1
xchg [edx], al
mov [edx+1], al
pop eax
push 12
stdcall kernel_alloc, ebx
test eax, eax
jz ntfsNoMemory
jz ntfsError
mov ecx, ebx
shr ecx, 2
mov edi, eax
2410,6 → 2388,8
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
2420,12 → 2400,12
xor edx, edx
call fs_write64_app ; partition bitmap
test eax, eax
jnz ntfsDevice
jnz ntfsError
mov eax, [ebp+NTFS.frs_buffer]
mov [ebp+NTFS.ntfs_cur_buf], eax
call writeRecord ; $MFT
test eax, eax
jnz ntfsDevice
jnz ntfsError
mov eax, [ebp+NTFS.mftmirr_cluster]
mul [ebp+NTFS.sectors_per_cluster]
mov ebx, [ebp+NTFS.frs_buffer]
2433,7 → 2413,8
dec ecx
call fs_write64_sys ; $MFTMirr
test eax, eax
jnz ntfsDevice
jnz ntfsError
pop eax
mov eax, [ebp+NTFS.ntfs_cur_offs]
add [ebp+NTFS.ntfsLastRead], eax
.mftRecord:
2473,7 → 2454,7
add ecx, 8
mov [edi+sizeWithHeader], ecx
mov byte [edi+attributeOffset], 18h
mov byte [edi+indexedFlag], 1
mov byte [edi+attributeFlags], 1
add edi, 18h
add esi, 16
sub ecx, 18h
2516,17 → 2497,19
mov byte [edi+attributeOffset], 20h
mov dword[edi+18h], 490024h ; unicode $I30
mov dword[edi+18h+4], 300033h
mov byte [edi+20h+attributeType], 30h
mov byte [edi+20h+collationRule], 1
add edi, 20h
mov byte [edi+attributeType], 30h
mov byte [edi+collationRule], 1
mov eax, [ebp+NTFS.sectors_per_cluster]
shl eax, 9
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 [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 al, 3
.writeMftRecord:
mov byte [edi+sizeWithHeader], 50h
2537,7 → 2520,10
mov [ebp+NTFS.ntfs_cur_buf], edi
call writeRecord
test eax, eax
jnz ntfsDevice
jz @f
push 11
jmp ntfsError
@@:
mov esi, [ebp+PARTITION.Disk]
call disk_sync
; write MFT bitmap
2551,8 → 2537,10
xor edx, edx
call fs_write64_sys
test eax, eax
jnz ntfsDevice
; 5. Write partition bitmap
jz @f
push 11
jmp ntfsError
@@: ; 5. Write partition bitmap
cmp [ebp+NTFS.ntfsFolder], 0
jnz @f
cmp [ebp+NTFS.fileRealSize], 0
2571,7 → 2559,9
xor edx, edx
call fs_write64_app
test eax, eax
jnz ntfsDevice
jz @f
push 11
jmp ntfsError
@@:
mov esi, [ebp+PARTITION.Disk]
call disk_sync
2584,14 → 2574,12
mov eax, [ebp+NTFS.cur_index_buf]
mov [ebp+NTFS.ntfs_cur_buf], eax
call writeRecord
test eax, eax
jnz ntfsDevice
mov ebx, [ebp+NTFS.fileRealSize]
ntfsDone:
push eax
mov esi, [ebp+PARTITION.Disk]
call disk_sync
call ntfs_unlock
xor eax, eax
pop eax
mov ebx, [ebp+NTFS.fileRealSize]
ret
 
writeRecord:
2624,8 → 2612,6
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]
2655,8 → 2641,9
mov [ebp+NTFS.BitmapSize], eax
@@:
mov ecx, [ebp+NTFS.BitmapSize]
add ecx, [ebp+NTFS.BitmapBuffer]
sub ecx, edi
mov eax, edi
sub eax, [ebp+NTFS.BitmapBuffer]
sub ecx, eax
shr ecx, 2
pop ebx
ret
2669,327 → 2656,19
.end:
add esp, 12 ; double ret
push ERROR_DISK_FULL
jmp ntfsOut
jmp ntfsError
 
;----------------------------------------------------------------
ntfs_WriteFile:
cmp byte [esi], 0
jnz @f
ntfs_Write:
xor ebx, ebx
movi eax, ERROR_ACCESS_DENIED
mov eax, ERROR_UNSUPPORTED_FS
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:
movi eax, ERROR_UNSUPPORTED_FS
ntfs_Delete:
mov eax, ERROR_UNSUPPORTED_FS
ret
 
;----------------------------------------------------------------
2996,16 → 2675,19
ntfs_GetFileInfo:
cmp byte [esi], 0
jnz @f
movi eax, ERROR_UNSUPPORTED_FS
movi eax, 2
ret
@@:
call ntfs_lock
stdcall ntfs_find_lfn, [esp+4]
jnc .found
jnc .doit
test eax, eax
jz ntfsFail
jmp ntfsNotFound
.found:
push ERROR_FILE_NOT_FOUND
jz ntfsError
pop eax
push 11
jmp ntfsError
.doit:
push esi edi
mov esi, eax
mov edi, [ebx+16]
3016,25 → 2698,8
xor eax, eax
ret
 
ntfsUnsupported:
push ERROR_UNSUPPORTED_FS
ntfsOut:
ntfsError:
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/fs/fs_lfn.inc
20,7 → 20,6
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/gui/font.inc
241,7 → 241,7
.drawPicture:
mov eax, -1
repz scasd
jecxz @f
jcxz @f
mov eax, edx
sub eax, ecx
push ecx
/kernel/branches/Kolibri-acpi/gui/button.inc
1,6 → 1,6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
8,6 → 8,10
 
$Revision$
 
;==============================================================================
;///// public functions ///////////////////////////////////////////////////////
;==============================================================================
 
button.MAX_BUTTONS = 4095
 
struct SYS_BUTTON
21,11 → 25,12
dw ?
ends
 
;---------------------------------------------------------------
syscall_button: ;////////////// system function 8 //////////////
;---------------------------------------------------------------
align 4
;------------------------------------------------------------------------------
syscall_button: ;///// system function 8 //////////////////////////////////////
;------------------------------------------------------------------------------
;? Define/undefine GUI button object
;---------------------------------------------------------------
;------------------------------------------------------------------------------
;; Define button:
;> ebx = pack[16(x), 16(width)]
;> ecx = pack[16(y), 16(height)]
35,12 → 40,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
69,12 → 74,13
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
88,126 → 94,129
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
 
and esi, 0xFFFFFF
xor edi, edi
push ebx ecx esi
dec cx
dec cx
cmp [buttontype], 1
jnz .draw
cmp cx, 65
jnc .draw
; draw button body
 
; 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
pushad
 
; calculate window-relative coordinates
movzx edi, cx
shr ebx, 16
shr ecx, 16
mov eax, [TASK_BASE]
add ebx, [eax - twdw + WDATA.box.left]
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 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
@@:
cmp al, 65
jc @f
mov al, 64
@@:
div cl
shl ax, 8
mov edx, edi
add ebx, 0x00010001
dec edx
jnz .calculate
mov dl, cl
 
.next_line:
call button._.button_dececx
push edi
xor edi, edi
; call [draw_line]
call __sys_draw_line
pop edi
add ebx, 0x00010001
dec edx
shr edx, 1
shr eax, 8
mov edi, eax
mul edx
add esi, eax
jnz .next_line
 
.draw: ; calculate window-relative coordinates
movzx ebp, cx
dec ebp
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
inc eax
mov edx, ebx
add dx, [esp+8]
dec edx
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
shr ecx, 1
and cx, 7F7Fh
push esi
mov esi, edi
xor edi, edi
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
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
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
push edx
mov edx, eax
shr edx, 16
mov ax, dx
mov edx, ebx
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
@@:
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
 
pop ecx ebx
 
.exit:
ret
 
; FIXME: mutex needed
.remove_button:
syscall_button.remove_button:
and edx, 0x00ffffff
mov edi, [BTN_ADDR]
mov ebx, [edi]
247,19 → 256,87
pop ebx
jmp .next_button
 
;---------------------------------------------------------------
sys_button_activate_handler:
sys_button_deactivate_handler:
;---------------------------------------------------------------
.exit:
ret
 
align 4
;------------------------------------------------------------------------------
sys_button_activate_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
;---------------------------------------------------------------
; find system button by specified process slot, id and coordinates
;------------------------------------------------------------------------------
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
;------------------------------------------------------------------------------
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
266,9 → 343,11
add esi, edi
inc ecx
add esi, sizeof.SYS_BUTTON
 
.next_button:
dec ecx
jz .popexit
jz .not_found
 
add esi, -sizeof.SYS_BUTTON
 
; does it belong to our process?
288,58 → 367,147
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
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2]
ret
 
; display button border on press?
bt ebx, 29
jc .exit
;------------------------------------------------------------------------------
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
 
; invert system button border
;------------------------------------------------------------------------------
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
 
pushad
mov esi, eax
mov edi, ebx
 
xchg esi, eax
 
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]
mov ecx, eax
mov edx, ebx
bt edi, 30
jc @f
inc ax
inc bx
dec cx
dec dx
@@:
push eax ebx
pop edx ecx
rol eax, 16
rol ebx, 16
add ax, cx
add bx, dx
mov esi, 1000000h
 
mov esi, 0x01000000
call draw_rectangle.forced
 
popad
 
.exit:
ret
.popexit:
pop edi esi edx ecx
ret
 
;---------------------------------------------------------------
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/skincode.inc
101,6 → 101,7
xor eax, eax
cld
rep stosd
 
mov ebx, [ebp+SKIN_HEADER.params]
add ebx, [skin_data]
mov eax, [ebx+SKIN_PARAMS.skin_height]
126,8 → 127,11
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
138,8 → 142,11
xor eax, eax
mov edx, skin_active.left.data
or ecx, ecx
jnz .next_bitmap
jnz @f
mov edx, skin_inactive.left.data
;--------------------------------------
align 4
@@:
jmp .next_bitmap
;--------------------------------------
align 4
152,8 → 159,11
neg eax
mov edx, skin_active.oper.data
or ecx, ecx
jnz .next_bitmap
jnz @f
mov edx, skin_inactive.oper.data
;--------------------------------------
align 4
@@:
jmp .next_bitmap
;--------------------------------------
align 4
163,9 → 173,12
mov eax, [skin_active.left.width]
mov edx, skin_active.base.data
or ecx, ecx
jnz .next_bitmap
jnz @f
mov eax, [skin_inactive.left.width]
mov edx, skin_inactive.base.data
;--------------------------------------
align 4
@@:
jmp .next_bitmap
;--------------------------------------
align 4
189,6 → 202,8
.end_bitmaps:
mov ebx, [ebp+SKIN_HEADER.buttons]
add ebx, [skin_data]
;--------------------------------------
align 4
.lp2:
cmp dword[ebx], 0
je .end_buttons
230,10 → 245,13
;------------------------------------------------------------------------------
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
242,10 → 260,13
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]
257,7 → 278,9
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
265,6 → 288,8
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]
271,15 → 296,21
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]
286,12 → 317,16
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
;------------------------------------------------------------------------------
299,12 → 334,17
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
322,6 → 362,8
rol ebx, 16
call draw_rectangle
mov ecx, 3
;--------------------------------------
align 4
_dw3l:
add eax, 1*65536-1
add ebx, 0*65536-1
345,6 → 387,8
test [edi + WDATA.fl_wstate], WSTATE_ROLLEDUP
jnz @f
call draw_rectangle
;--------------------------------------
align 4
@@:
mov eax, [skin_data]
cmp [eax], dword 'SKIN'
356,6 → 400,7
inc ecx
mov edx, [_skinh]
mov edi, [common_colours+4]; standard grab color
; call [drawbar]
call vesa20_drawbar
jmp draw_clientbar
;--------------------------------------
363,8 → 408,11
@@:
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]
380,7 → 428,10
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'
392,30 → 443,39
jge no_skin_add_button
inc eax
mov [edi], ax
 
shl eax, 4
add eax, edi
 
mov bx, [CURRENT_TASK]
mov [eax], bx
mov word [eax+2], 1 ; button id
 
add eax, 2 ; save button id number
mov bx, 1
mov [eax], bx
add eax, 2 ; x start
xor ebx, ebx
cmp [skin_btn_close.left], 0
jge @f
jge _bCx_at_right
mov ebx, [esp]
mov ebx, [ebx+WDATA.box.width]
inc ebx
@@:
;--------------------------------------
align 4
_bCx_at_right:
add ebx, [skin_btn_close.left]
mov word [eax+4], bx ; x start
mov [eax], bx
add eax, 2 ; x size
mov ebx, [skin_btn_close.width]
dec ebx
mov word [eax+6], bx ; x size
mov [eax], bx
add eax, 2 ; y start
mov ebx, [skin_btn_close.top]
mov word [eax+8], bx ; y start
mov [eax], bx
add eax, 2 ; y size
mov ebx, [skin_btn_close.height]
dec ebx
mov word [eax+10], bx ; y size
bts word [eax+12], 14
mov [eax], bx
;* minimize button
mov edi, [BTN_ADDR]
movzx eax, word [edi]
423,31 → 483,43
jge no_skin_add_button
inc eax
mov [edi], ax
 
shl eax, 4
add eax, edi
 
mov bx, [CURRENT_TASK]
mov [eax], bx
mov word [eax+2], -1 ; button id
 
add eax, 2 ; save button id number
mov bx, 65535;999
mov [eax], bx
add eax, 2 ; x start
xor ebx, ebx
cmp [skin_btn_minimize.left], 0
jge @f
jge _bMx_at_right
mov ebx, [esp]
mov ebx, [ebx+WDATA.box.width]
inc ebx
@@:
;--------------------------------------
align 4
_bMx_at_right:
add ebx, [skin_btn_minimize.left]
mov word [eax+4], bx ; x start
mov [eax], bx
add eax, 2 ; x size
mov ebx, [skin_btn_minimize.width]
dec ebx
mov word [eax+6], bx ; x size
mov [eax], bx
add eax, 2 ; y start
mov ebx, [skin_btn_minimize.top]
mov word [eax+8], bx ; y start
mov [eax], bx
add eax, 2 ; y size
mov ebx, [skin_btn_minimize.height]
dec ebx
mov word [eax+10], bx ; y size
bts word [eax+12], 14
mov [eax], bx
;--------------------------------------
align 4
no_skin_add_button:
pop edi
popa
ret 4
;------------------------------------------------------------------------------
/kernel/branches/Kolibri-acpi/hid/mousedrv.inc
551,9 → 551,9
endp
 
;-----------------------------------------------------------------------------
; 3 = (x+1)^2 /4
; 2 = (x+2)^2 /8
; 1 = (x+3)^2 /16
; 3 = x^2 /2
; 2 = (x+1)^2 /4
; 1 = (x+2)^2 /8
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, 2
shr eax, 1
adc eax, 0
cmp [mouse_delay], 2
jz .2
jnc .3
/kernel/branches/Kolibri-acpi/kernel.asm
996,6 → 996,8
; 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
2165,7 → 2167,7
pusha
mov edx, [TASK_BASE]
mov edx, [edx+TASKDATA.pid]
call socket_process_end
call SOCKET_process_end
popa
;--------------------------------------
mov ecx, [current_slot]
2295,7 → 2297,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/IPv4.inc
16,7 → 16,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 6011 $
$Revision: 5842 $
 
IPv4_MAX_FRAGMENTS = 64
IPv4_MAX_ROUTES = 64
92,12 → 92,14
endg
 
 
;-----------------------------------------------------------------;
; ;
; ipv4_init: Resets all IPv4 variables ;
; ;
;-----------------------------------------------------------------;
macro ipv4_init {
;-----------------------------------------------------------------
;
; IPv4_init
;
; This function resets all IP variables
;
;-----------------------------------------------------------------
macro IPv4_init {
 
xor eax, eax
mov edi, IP_LIST
107,12 → 109,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
 
139,7 → 141,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
203,22 → 205,24
 
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
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,\
227,7 → 231,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
 
234,7 → 238,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"
300,13 → 304,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
343,7 → 347,7
call mutex_lock
popa
 
jmp socket_input
jmp SOCKET_input
 
.dump_unlock:
 
357,12 → 361,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
 
 
386,7 → 390,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
 
451,7 → 455,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
 
542,7 → 546,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
567,17 → 571,16
 
 
 
;-----------------------------------------------------------------;
; ;
; ipv4_find_fragment_slot ;
; ;
; IN: pointer to fragmented packet in edx ;
; ;
; OUT: pointer to slot in esi, -1 on error ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
 
604,27 → 607,26
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 ;
; 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 ;
; ;
;------------------------------------------------------------------;
;------------------------------------------------------------------
;
; 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
;
;------------------------------------------------------------------
align 4
ipv4_output:
IPv4_output:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u ip=0x%x\n", ecx, eax
 
633,12 → 635,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
651,7 → 653,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
 
672,7 → 674,7
 
pop ecx
 
ipv4_checksum edi
IPv4_checksum edi
add edi, sizeof.IPv4_header
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: success!\n"
ret
702,25 → 704,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
 
727,8 → 729,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
742,7 → 744,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
 
770,7 → 772,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]
789,18 → 791,17
ret
 
 
;-----------------------------------------------------------------;
; ;
; 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
;--------------------------------------------------------
;
;
; 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
 
locals
offset dd ?
909,24 → 910,22
 
 
 
;-----------------------------------------------------------------;
; ;
; 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
962,7 → 961,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
 
983,35 → 982,32
 
 
 
;-----------------------------------------------------------------;
; ;
; ipv4_get_frgmnt_num ;
; ;
; IN: / ;
; ;
; OUT: ax = fragment number ;
; ;
;-----------------------------------------------------------------;
;---------------------------------------------------------------------------
;
; IPv4_get_frgmnt_num
;
; IN: /
; OUT: fragment number in ax
;
;---------------------------------------------------------------------------
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 on success ;
; eax = -1 on error ;
; ebx = error code on error ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; IPv4_connect
;
; IN: eax = socket pointer
; OUT: eax = 0 ok / -1 error
; ebx = error code
;
;-------------------------
align 4
ipv4_connect:
IPv4_connect:
 
push eax edx
lea ecx, [eax + SOCKET.mutex]
1035,19 → 1031,21
ret
 
 
;-----------------------------------------------------------------;
; ;
; ipv4_API: Part of system function 76. ;
; ;
; IN: bl = subfunction number ;
; bh = device number ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: depends on subfunction ;
; ;
;-----------------------------------------------------------------;
;---------------------------------------------------------------------------
;
; 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:
;
;---------------------------------------------------------------------------
align 4
ipv4_api:
IPv4_api:
 
movzx eax, bh
shl eax, 2
1098,9 → 1096,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
 
1110,7 → 1108,7
 
.write_dns:
mov [DNS_LIST + eax], ecx
call net_send_event
call NET_send_event
xor eax, eax
ret
 
1127,7 → 1125,7
or ecx, ebx
mov [BROADCAST_LIST + eax], ecx
 
call net_send_event
call NET_send_event
xor eax, eax
ret
 
1138,6 → 1136,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/icmp.inc
85,6 → 85,7
ICMP_PHOTURIS_DECRYPT_FAILED = 3 ; decrypt failed
 
 
 
struct ICMP_header
 
Type db ?
106,13 → 107,13
 
 
 
;-----------------------------------------------------------------;
; ;
; ICMP_init ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; ICMP_init
;
;-----------------------------------------------------------------
 
macro icmp_init {
macro ICMP_init {
 
xor eax, eax
mov edi, ICMP_PACKETS_TX
122,23 → 123,25
}
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
align 4
icmp_input:
ICMP_input:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "ICMP_input\n"
 
201,7 → 204,7
call mutex_lock
popa
 
jmp socket_input
jmp SOCKET_input
 
 
 
271,7 → 274,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
290,26 → 293,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"
 
361,17 → 364,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
 
381,7 → 384,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
404,7 → 407,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
419,19 → 422,21
 
 
 
;-----------------------------------------------------------------;
; ;
; icmp_api: Part of system function 76. ;
; ;
; IN: bl = subfunction number ;
; bh = device number ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: depends on subfunction ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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:
;
;-----------------------------------------------------------------
align 4
icmp_api:
ICMP_api:
 
movzx eax, bh
shl eax, 2
/kernel/branches/Kolibri-acpi/network/loopback.inc
14,7 → 14,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 6011 $
$Revision: 5976 $
 
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
 
479,6 → 479,7
 
.tcp:
.udp:
 
pushd [edx + 4] ; First, fill in the IP
popd [eax + IP_SOCKET.LocalIP]
 
485,11 → 486,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:
510,7 → 511,7
 
;-----------------------------------------------------------------;
; ;
; socket_connect: Connect to the remote host. ;
; SOCKET_connect: Connect to the remote host. ;
; ;
; IN: ecx = socket number ;
; edx = pointer to sockaddr struct ;
522,11 → 523,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
 
571,7 → 572,7
 
;-----------------------------------------------------------------;
; ;
; socket_listen: Listen for incoming connections. ;
; SOCKET_listen: Listen for incoming connections. ;
; ;
; IN: ecx = socket number ;
; edx = backlog in edx ;
582,11 → 583,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
 
640,7 → 641,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 ;
652,11 → 653,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
 
676,7 → 677,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
693,7 → 694,7
test [eax + SOCKET.options], SO_NONBLOCK
jnz .wouldblock
 
call socket_block
call SOCKET_block
jmp .loop
 
.wouldblock:
713,7 → 714,7
 
;-----------------------------------------------------------------;
; ;
; socket_close: Close the socket (and connection). ;
; SOCKET_close: Close the socket (and connection). ;
; ;
; IN: ecx = socket number ;
; ;
723,11 → 724,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
 
737,7 → 738,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
747,15 → 748,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
 
768,7 → 769,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 ;
782,11 → 783,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
 
807,7 → 808,7
test [eax + SOCKET.options], SO_NONBLOCK
jnz .return_err
 
call socket_block
call SOCKET_block
jmp .loop
 
 
824,7 → 825,7
.last_data:
test ecx, ecx
jz .return
call socket_notify ; Call me again!
call SOCKET_notify ; Call me again!
jmp .return
 
 
831,7 → 832,7
 
 
align 4
socket_receive_dgram:
SOCKET_receive_dgram:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: DGRAM\n"
 
867,11 → 868,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
899,7 → 900,7
 
 
align 4
socket_receive_local:
SOCKET_receive_local:
 
; does this socket have a PID yet?
cmp [eax + SOCKET.PID], 0
912,12 → 913,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"
 
933,8 → 934,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
943,7 → 944,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
 
961,7 → 962,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 ;
974,11 → 975,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
 
994,12 → 995,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
1011,19 → 1012,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
1031,12 → 1032,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
1048,12 → 1049,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
1065,7 → 1066,7
 
 
align 4
socket_send_pppoe:
SOCKET_send_pppoe:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_send: PPPoE\n"
 
1072,7 → 1073,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
1085,7 → 1086,7
 
 
align 4
socket_send_local:
SOCKET_send_local:
 
; does this socket have a PID yet?
cmp [eax + SOCKET.PID], 0
1097,22 → 1098,22
mov [eax + SOCKET.PID], ebx
mov [eax + SOCKET.TID], ebx ; currently TID = PID in kolibrios :(
@@:
mov [eax + SOCKET.snd_proc], socket_send_local_initialized
mov [eax + SOCKET.snd_proc], SOCKET_send_local_
 
align 4
socket_send_local_initialized:
SOCKET_send_local_:
 
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
1119,7 → 1120,7
mov [esp+32], ecx
 
; and notify the other end
call socket_notify
call SOCKET_notify
 
ret
 
1131,7 → 1132,7
 
;-----------------------------------------------------------------;
; ;
; socket_get_opt: Read a socket option ;
; SOCKET_get_options: Read a socket option ;
; ;
; IN: ecx = socket number ;
; edx = pointer to socket options struct ;
1142,7 → 1143,7
; ;
;-----------------------------------------------------------------;
align 4
socket_get_opt:
SOCKET_get_opt:
 
; FIXME:
; At moment, uses only pseudo-optname -2 for get last_ack_number for TCP.
1151,7 → 1152,7
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_get_opt\n"
 
call socket_num_to_ptr
call SOCKET_num_to_ptr
test eax, eax
jz .invalid
 
1193,7 → 1194,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 ;
1204,11 → 1205,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
 
1271,7 → 1272,7
 
;-----------------------------------------------------------------;
; ;
; socket_pair: Allocate a pair of linked local sockets. ;
; SOCKET_pair: Allocate a pair of linked local sockets. ;
; ;
; IN: / ;
; ;
1282,11 → 1283,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
1294,12 → 1295,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
1307,8 → 1308,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
1316,12 → 1317,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
 
1329,11 → 1330,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
1343,7 → 1344,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 ;
1354,7 → 1355,7
; ;
;-----------------------------------------------------------------;
align 4
socket_debug:
SOCKET_debug:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_debug\n"
 
1363,7 → 1364,7
test ecx, ecx
jz .returnall
 
call socket_num_to_ptr
call SOCKET_num_to_ptr
test eax, eax
jz .invalid
 
1406,7 → 1407,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 ;
1417,7 → 1418,7
; ;
;-----------------------------------------------------------------;
align 4
socket_find_port:
SOCKET_find_port:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_find_port\n"
 
1458,7 → 1459,7
add bh, 1
adc bl, 0
 
call socket_check_port
call SOCKET_check_port
jz .findit
ret
 
1466,10 → 1467,11
 
;-----------------------------------------------------------------;
; ;
; 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) ;
1478,7 → 1480,7
; ;
;-----------------------------------------------------------------;
align 4
socket_check_port:
SOCKET_check_port:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check_port: "
 
1528,7 → 1530,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 ! ;
; ;
1541,7 → 1543,7
; ;
;-----------------------------------------------------------------;
align 4
socket_input:
SOCKET_input:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: socket=%x, data=%x size=%u\n", eax, esi, ecx
 
1549,7 → 1551,7
push esi
mov esi, esp
 
add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, .full
add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, sizeof.socket_queue_entry, SOCKET_input.full
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: success\n"
add esp, sizeof.socket_queue_entry
1559,7 → 1561,7
call mutex_unlock
popa
 
jmp socket_notify
jmp SOCKET_notify
 
.full:
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_input: socket %x is full!\n", eax
1570,13 → 1572,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 ;
; ;
1585,7 → 1587,7
; ;
;-----------------------------------------------------------------;
align 4
socket_ring_create:
SOCKET_ring_create:
 
push esi
mov esi, eax
1621,7 → 1623,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 ;
1631,7 → 1633,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
 
1691,7 → 1693,7
 
;-----------------------------------------------------------------;
; ;
; socket_ring_read: Read from ring buffer ;
; SOCKET_ring_read: Read from ring buffer ;
; ;
; IN: eax = ring struct ptr ;
; ecx = bytes to read ;
1706,7 → 1708,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
 
1765,7 → 1767,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 ;
1774,7 → 1776,7
; ;
;-----------------------------------------------------------------;
align 4
socket_ring_free:
SOCKET_ring_free:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_ring_free: %u bytes from ring %x\n", ecx, eax
 
1815,7 → 1817,7
 
;-----------------------------------------------------------------;
; ;
; socket_block: Suspend the thread attached to a socket. ;
; SOCKET_block: Suspend the thread attached to a socket. ;
; ;
; IN: eax = socket ptr ;
; ;
1823,7 → 1825,7
; ;
;-----------------------------------------------------------------;
align 4
socket_block:
SOCKET_block:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_block: %x\n", eax
 
1857,7 → 1859,7
 
;-----------------------------------------------------------------;
; ;
; socket_notify: Wake up socket owner thread. ;
; SOCKET_notify: Wake up socket owner thread. ;
; ;
; IN: eax = socket ptr ;
; ;
1865,11 → 1867,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
1925,9 → 1927,10
 
;-----------------------------------------------------------------;
; ;
; 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. ;
; SOCKET_alloc: ;
; Allocate memory for socket and put new socket into the list. ;
; Newly created socket is initialized with calling PID and socket ;
; number. ;
; ;
; IN: / ;
; ;
1937,7 → 1940,7
; ;
;-----------------------------------------------------------------;
align 4
socket_alloc:
SOCKET_alloc:
 
push ebx
 
2042,8 → 2045,9
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
2051,11 → 2055,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
2113,7 → 2117,7
 
;-----------------------------------------------------------------;
; ;
; socket_fork: Create a child socket. ;
; SOCKET_fork: Create a child socket. ;
; ;
; IN: ebx = socket number ;
; ;
2122,7 → 2126,7
; ;
;-----------------------------------------------------------------;
align 4
socket_fork:
SOCKET_fork:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_fork: %x\n", ebx
 
2133,7 → 2137,7
 
; Allocate new socket
push ebx
call socket_alloc
call SOCKET_alloc
pop ebx
test eax, eax
jz .fail
2156,7 → 2160,7
; Notify owner of parent socket
push eax
mov eax, ebx
call socket_notify
call SOCKET_notify
pop eax
 
ret
2171,7 → 2175,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 ;
; ;
2180,7 → 2184,7
; ;
;-----------------------------------------------------------------;
align 4
socket_num_to_ptr:
SOCKET_num_to_ptr:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_num_to_ptr: num=%u ", ecx
 
2218,7 → 2222,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 ;
; ;
2228,11 → 2232,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]
2247,7 → 2251,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 ;
; ;
2256,7 → 2260,7
; ;
;-----------------------------------------------------------------;
align 4
socket_check:
SOCKET_check:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check: %x\n", eax
 
2287,7 → 2291,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 ;
; ;
2295,7 → 2299,7
; ;
;-----------------------------------------------------------------;
align 4
socket_check_owner:
SOCKET_check_owner:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_check_owner: %x\n", eax
 
2312,9 → 2316,10
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
2322,7 → 2327,7
; ;
;-----------------------------------------------------------------;
align 4
socket_process_end:
SOCKET_process_end:
 
ret ; FIXME
 
2363,11 → 2368,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
2389,7 → 2394,7
 
;-----------------------------------------------------------------;
; ;
; socket_is_connecting: Update socket state. ;
; SOCKET_is_connecting: Update socket state. ;
; ;
; IN: eax = socket ptr ;
; ;
2397,7 → 2402,7
; ;
;-----------------------------------------------------------------;
align 4
socket_is_connecting:
SOCKET_is_connecting:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_is_connecting: %x\n", eax
 
2409,7 → 2414,7
 
;-----------------------------------------------------------------;
; ;
; socket_is_connected: Update socket state. ;
; SOCKET_is_connected: Update socket state. ;
; ;
; IN: eax = socket ptr ;
; ;
2417,13 → 2422,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
 
 
 
2430,7 → 2435,7
 
;-----------------------------------------------------------------;
; ;
; socket_is_disconnecting: Update socket state. ;
; SOCKET_is_disconnecting: Update socket state. ;
; ;
; IN: eax = socket ptr ;
; ;
2438,19 → 2443,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 ;
; ;
2458,19 → 2463,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 ;
; ;
2478,18 → 2483,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 ;
; ;
2497,13 → 2502,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
258,14 → 258,16
endg
 
 
;-----------------------------------------------------------------;
; ;
; stack_init: Initialize all network variables ;
; ;
; IN: / ;
; OUT: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; stack_init
;
; This function calls all network init procedures
;
; IN: /
; OUT: /
;
;-----------------------------------------------------------------
align 4
stack_init:
 
292,21 → 294,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
327,14 → 329,16
endp
 
 
;-----------------------------------------------------------------;
; ;
; stack_handler: Network handlers called from os_loop. ;
; ;
; IN: / ;
; OUT: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; stack_handler
;
; This function is called in kernel loop
;
; IN: /
; OUT: /
;
;-----------------------------------------------------------------
align 4
stack_handler:
 
350,13 → 354,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]
369,8 → 373,7
 
 
align 4
proc net_buff_alloc stdcall, buffersize
 
proc NET_BUFF_alloc stdcall, buffersize
cmp [buffersize], NET_BUFFER_SIZE
ja .too_large
 
384,7 → 387,7
 
spin_unlock_irqrestore
 
DEBUGF DEBUG_NETWORK_VERBOSE, "net_buff_alloc: 0x%x\n", eax
DEBUGF DEBUG_NETWORK_VERBOSE, "net alloc: 0x%x\n", eax
ret
 
.out_of_mem:
391,20 → 394,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_buff_free: 0x%x\n", [buffer]
DEBUGF DEBUG_NETWORK_VERBOSE, "net free: 0x%x\n", [buffer]
 
spin_lock_irqsave
 
420,14 → 423,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
443,20 → 446,21
 
 
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
;
;-----------------------------------------------------------------
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
491,7 → 495,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
503,17 → 507,19
 
 
 
;-----------------------------------------------------------------;
; ;
; net_remove_device: Called by network driver to unregister dev. ;
; ;
; IN: ebx = ptr to device ;
; ;
; OUT: eax: -1 on error ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
;
;-----------------------------------------------------------------
align 4
net_remove_device:
NET_remove_device:
 
cmp [NET_RUNNING], 0
je .error
535,7 → 541,7
mov dword [edi-4], eax
dec [NET_RUNNING]
 
call net_send_event
call NET_send_event
 
xor eax, eax
ret
546,20 → 552,18
 
 
 
;-----------------------------------------------------------------;
; ;
; net_ptr_to_num ;
; ;
; IN: ebx = ptr to device struct ;
; ;
; OUT: edi = device number ;
; edi = -1 on error ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; NET_ptr_to_num
;
; IN: ebx = ptr to device struct
; OUT: edi = -1 on error, device number otherwise
;
;-----------------------------------------------------------------
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
 
566,7 → 570,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
591,17 → 595,21
pop ecx
ret
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
;
;-----------------------------------------------------------------
align 4
checksum_1:
 
671,15 → 679,16
.end:
ret
 
;-----------------------------------------------------------------;
; ;
; checksum_2: Calculate the final ip/tcp/udp checksum. ;
; ;
; IN: edx = semi-checksum ;
; ;
; OUT: dx = checksum (in INET byte order) ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; checksum_2
;
; This function calculates the final ip/tcp/udp checksum for you
;
; IN: edx = semi-checksum
; OUT: dx = checksum (in INET byte order)
;
;-----------------------------------------------------------------
align 4
checksum_2:
 
704,11 → 713,11
 
 
 
;-----------------------------------------------------------------;
; ;
; System function 74: Low level access to network devices. ;
; ;
;-----------------------------------------------------------------;
;----------------------------------------------------------------
;
; System function to work with network devices (74)
;
;----------------------------------------------------------------
align 4
sys_network:
 
825,11 → 834,11
 
 
 
;-----------------------------------------------------------------;
; ;
; System function 76: Low level access to protocol handlers. ;
; ;
;-----------------------------------------------------------------;
;----------------------------------------------------------------
;
; System function to work with protocols (76)
;
;----------------------------------------------------------------
align 4
sys_protocols:
cmp bh, NET_DEVICES_MAX ; Check if device number exists
847,28 → 856,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: Part of system function 76 ;
; TCP_api: This function is called by 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: 6011 $
$Revision: 5976 $
 
;-----------------------------------------------------------------;
; ;
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
 
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
 
; TODO: if its a multicast/broadcast, also drop
;;; 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: 6011 $
$Revision: 5584 $
 
;-----------------------------------------------------------------;
; ;
; 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: 6011 $
$Revision: 5584 $
 
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 ;;;; FIXME: i dont like this static use of edi
push edi ;;;; 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,7 → 231,7
; ;
;-----------------------------------------------------------------;
align 4
tcp_outflags:
TCP_outflags:
 
mov edx, [eax + TCP_SOCKET.t_state]
movzx edx, byte[edx + .flaglist]
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: 6011 $
$Revision: 5442 $
 
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,7 → 45,10
 
push ebx
mov cl, TH_ACK
call tcp_respond
call TCP_respond
; and [ebx + TCP_SOCKET.t_flags], TF_ACKNOW ;;
; mov eax, ebx ;;
; call TCP_output ;;
pop ebx
 
inc [TCPS_delack] ; update stats
58,7 → 61,7
 
 
align 4
proc tcp_timer_640ms
proc TCP_timer_640ms ; TODO: implement timed wait timer!
 
xor esi, esi
mov ecx, MANUAL_DESTROY
74,8 → 77,8
 
add [TCP_sequence_num], 64000
 
; Scan through all the active TCP sockets, decrementing all active timers
; When a timer reaches zero, run its handler.
; scan through all the active TCP sockets, decrementing ALL timers
; When a timer reaches zero, we'll check wheter it was active or not
 
mov eax, net_sockets
.loop:
92,22 → 95,22
 
inc [eax + TCP_SOCKET.t_idle]
 
dec [eax + TCP_SOCKET.timer_retransmission]
jnz .check_more2
test [eax + TCP_SOCKET.timer_flags], timer_flag_retransmission
jz .check_more2
dec [eax + TCP_SOCKET.timer_retransmission]
jnz .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:
dec [eax + TCP_SOCKET.timer_keepalive]
jnz .check_more3
test [eax + TCP_SOCKET.timer_flags], timer_flag_keepalive
jz .check_more3
dec [eax + TCP_SOCKET.timer_keepalive]
jnz .check_more3
 
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Keepalive expired\n", eax
 
115,7 → 118,7
ja .dont_kill
 
push eax
call tcp_disconnect
call TCP_disconnect
pop eax
jmp .loop
 
126,7 → 129,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
135,38 → 138,38
mov [eax + TCP_SOCKET.timer_keepalive], TCP_time_keep_idle
 
.check_more3:
dec [eax + TCP_SOCKET.timer_timed_wait]
jnz .check_more5
test [eax + TCP_SOCKET.timer_flags], timer_flag_2msl
jz .check_more5
dec [eax + TCP_SOCKET.timer_timed_wait]
jnz .check_more5
 
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: 2MSL timer expired\n", eax
 
.check_more5:
dec [eax + TCP_SOCKET.timer_persist]
jnz .check_more6
test [eax + TCP_SOCKET.timer_flags], timer_flag_persist
jz .check_more6
dec [eax + TCP_SOCKET.timer_persist]
jnz .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:
dec [eax + TCP_SOCKET.timer_timed_wait]
jnz .loop
test [eax + TCP_SOCKET.timer_flags], timer_flag_wait
jz .loop
dec [eax + TCP_SOCKET.timer_timed_wait]
jnz .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
184,7 → 187,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: 6011 $
$Revision: 5442 $
 
 
;-----------------------------------------------------------------;
; ;
; 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: Part of system function 76 ;
; UDP_api: This function is called by 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
/kernel/branches/Kolibri-acpi/network/ARP.inc
70,12 → 70,14
 
 
 
;-----------------------------------------------------------------;
; ;
; arp_init: Resets all ARP variables. ;
; ;
;-----------------------------------------------------------------;
macro arp_init {
;-----------------------------------------------------------------
;
; ARP_init
;
; This function resets all ARP variables
;
;-----------------------------------------------------------------
macro ARP_init {
 
xor eax, eax
mov edi, ARP_entries_num
84,13 → 86,14
 
}
 
;-----------------------------------------------------------------;
; ;
; arp_decrease_entry_ttls ;
; ;
;-----------------------------------------------------------------;
macro arp_decrease_entry_ttls {
;---------------------------------------------------------------------------
;
; ARP_decrease_entry_ttls
;
;---------------------------------------------------------------------------
 
macro ARP_decrease_entry_ttls {
 
local .loop
local .exit
 
132,7 → 135,7
je .response_timeout
 
push esi edi ecx
call arp_del_entry
call ARP_del_entry
pop ecx edi esi
 
jmp .next
151,21 → 154,20
}
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
align 4
arp_input:
ARP_input:
 
;-----------------------------------------
; Check validity and print some debug info
173,7 → 175,7
cmp ecx, sizeof.ARP_header
jb .exit
 
call net_ptr_to_num4
call NET_ptr_to_num4
cmp edi, -1
jz .exit
 
292,21 → 294,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
 
316,7 → 318,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
331,7 → 333,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
352,23 → 354,19
ret
 
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
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]
423,22 → 421,19
ret
 
 
;-----------------------------------------------------------------;
; ;
; arp_del_entry: Remove an entry from the ARP table. ;
; ;
; IN: esi = ptr to arp entry ;
; edi = device number ;
; ;
; OUT: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; ARP_del_entry
;
; IN: esi = ptr to arp entry
; edi = device number
; OUT: /
;
;-----------------------------------------------------------------
align 4
arp_del_entry:
ARP_del_entry:
 
; 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: entry=%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
 
468,22 → 463,22
 
 
 
;-----------------------------------------------------------------;
; ;
; 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 ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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
;
;-----------------------------------------------------------------
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
518,11 → 513,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
539,7 → 534,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?
581,19 → 576,21
ret
 
 
;-----------------------------------------------------------------;
; ;
; arp_api: Part of system function 76. ;
; ;
; IN: bl = subfunction number ;
; bh = device number ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: depends on subfunction ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: ?
;
;-----------------------------------------------------------------
align 4
arp_api:
ARP_api:
 
movzx eax, bh
shl eax, 2
653,7 → 650,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:
664,12 → 661,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/ethernet.inc
14,7 → 14,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 6011 $
$Revision: 5522 $
 
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,18 → 62,20
 
}
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
align 4
eth_input:
ETH_input:
 
pop eax
pushf
107,22 → 109,14
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
169,46 → 163,44
 
; 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
 
219,7 → 211,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
265,19 → 257,21
 
 
 
;-----------------------------------------------------------------;
; ;
; eth_api: Part of system function 76. ;
; ;
; IN: bl = subfunction number ;
; bh = device number ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: depends on subfunction ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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:
;
;-----------------------------------------------------------------
align 4
eth_api:
ETH_api:
 
cmp bh, NET_DEVICES_MAX
ja .error
/kernel/branches/Kolibri-acpi/network/IPv6.inc
14,7 → 14,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 6011 $
$Revision: 5522 $
 
 
struct IPv6_header
45,12 → 45,14
endg
 
 
;-----------------------------------------------------------------;
; ;
; ipv6_init: Resets all IPv6 variables ;
; ;
;-----------------------------------------------------------------;
macro ipv6_init {
;-----------------------------------------------------------------
;
; IPv6_init
;
; This function resets all IP variables
;
;-----------------------------------------------------------------
macro IPv6_init {
 
xor eax, eax
mov edi, IPv6
61,23 → 63,25
 
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
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,\
143,7 → 147,7
 
.dump:
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv6_input - dumping\n"
call net_buff_free
call NET_BUFF_free
ret
 
.dump_options:
241,19 → 245,21
 
 
 
;-----------------------------------------------------------------;
; ;
; ipv6_api: Part of system function 76 ;
; ;
; IN: bl = subfunction number ;
; bh = device number ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: depends on subfunction ;
; ;
;-----------------------------------------------------------------;
;---------------------------------------------------------------------------
;
; 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:
;
;---------------------------------------------------------------------------
align 4
ipv6_api:
IPv6_api:
 
movzx eax, bh
shl eax, 2
/kernel/branches/Kolibri-acpi/network/PPPoE.inc
14,7 → 14,7
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision: 6011 $
$Revision: 5522 $
 
 
struct PPPoE_frame
33,33 → 33,37
 
endg
 
;-----------------------------------------------------------------;
; ;
; pppoe_init: Reset all pppoe variables ;
; ;
;-----------------------------------------------------------------;
macro pppoe_init {
;-----------------------------------------------------------------
;
; PPPoE_init
;
; This function resets all IP variables
;
;-----------------------------------------------------------------
macro PPPoE_init {
 
call pppoe_stop_connection
call PPPoE_stop_connection
 
}
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
align 4
pppoe_discovery_input:
PPPoE_discovery_input:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_input\n"
 
93,7 → 97,7
mov ecx, [esp + 4]
mov esi, [esp]
 
jmp socket_input
jmp SOCKET_input
 
.dump:
pusha
102,21 → 106,22
popa
 
DEBUGF DEBUG_NETWORK_VERBOSE, 'PPPoE_discovery_input: dumping\n'
call net_buff_free
call NET_BUFF_free
ret
 
 
;-----------------------------------------------------------------;
; ;
; pppoe_discovery_output ;
; ;
; IN: eax = socket pointer ;
; ecx = number of bytes to send ;
; esi = pointer to data ;
; ;
;-----------------------------------------------------------------;
;--------------------------------------
;
; Send discovery packet
;
; 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
 
142,7 → 147,7
 
; Create packet.
push ecx esi
;;;; FIXME stdcall kernel_alloc, 1500
stdcall kernel_alloc, 1500
pop esi ecx
test eax, eax
jz .bad
180,21 → 185,23
ret
 
 
;-----------------------------------------------------------------;
; ;
; 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: / ;
; ;
;-----------------------------------------------------------------;
;-----------------------------------------------------------------
;
; 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: /
;
;-----------------------------------------------------------------
align 4
pppoe_session_input:
PPPoE_session_input:
 
cmp [edx + PPPoE_frame.VersionAndType], 0x11
jne .dump
214,39 → 221,38
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 ;
; eax = 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 / 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
 
256,7 → 262,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
281,9 → 287,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
302,7 → 308,7
 
 
align 4
pppoe_stop_connection:
PPPoE_stop_connection:
 
DEBUGF DEBUG_NETWORK_VERBOSE, "PPPoE_stop_connection\n"
 
314,19 → 320,21
ret
 
 
;-----------------------------------------------------------------;
; ;
; pppoe_api: Part of system function 76 ;
; ;
; IN: subfunction number in bl ;
; device number in bh ;
; ecx, edx, .. depends on subfunction ;
; ;
; OUT: ;
; ;
;-----------------------------------------------------------------;
;---------------------------------------------------------------------------
;
; 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:
;
;---------------------------------------------------------------------------
align 4
pppoe_api:
PPPoE_api:
 
movzx eax, bh
shl eax, 2
337,8 → 345,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: