/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: |