diff --git a/programs/network/icq/trunk/CMDIPC.INC b/programs/network/icq/trunk/CMDIPC.INC new file mode 100644 index 0000000000..03db8bfeab --- /dev/null +++ b/programs/network/icq/trunk/CMDIPC.INC @@ -0,0 +1,221 @@ +include "MACROS.INC" + +initipc: + mov eax,9 + mov ebx,prc + mov ecx,-1 + int 0x40 + + mov ecx,eax +loop1: + push ecx + + mov eax,9 + mov ebx,prc + int 0x40 + + cmp word [prc+10],'CM' + jne no_cmd + cmp byte [prc+12],'D' + jne no_cmd + + mov ebx,[prc+30] + mov dword [cmdpid],ebx + + mov dword [cmdnumb],ecx + +no_cmd: + pop ecx + loop loop1 + + cmp dword [cmdpid],0 + jne no_exit + + jmp exit + +no_exit: + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,printf + mov esi,4 + int 0x40 + + call initcmd + +waitcmdinit: + mov eax,40 + mov ebx,01000000b + int 0x40 + + mov eax,23 + mov ebx,100 + int 0x40 + + cmp eax,7 + je cmd_ok + + jmp exit + +cmd_ok: + cmp byte [ipcb+16],'.' + jne exit + + mov eax,18 + mov ebx,3 + mov ecx,dword [cmdnumb] + int 0x40 + + ret + +pause1: + mov eax,5 + mov ebx,1 + int 0x40 + ret + +exit: + mov eax,-1 + int 0x40 + +cls: + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,ipccls + mov esi,4 + int 0x40 + + call pause1 + + ret + +print: + mov ecx,84 +loopprt: + mov edi,stripc + add edi,ecx + mov esi,fill_symbol + movsb + + loop loopprt + + cld + mov ecx,4 + mov edi,stripc + mov esi,printf + rep movsb + + cld + mov edx,79 + sub edx,eax + mov ecx,79 + sub ecx,edx + mov edi,stripc+4 + mov esi,ebx + rep movsb + + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,stripc + mov esi,84 + int 0x40 + + call pause1 + + ret + +eol: + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,ipceol + mov esi,4 + int 0x40 + + call pause1 + + ret + +initcmd: + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,ipckey + mov esi,4 + int 0x40 + + mov eax,60 + mov ebx,1 + mov ecx,ipcb + mov edx,28 + int 0x40 + + cld + mov ecx,28 + mov edi,ipcb + mov esi,ipcc + rep movsb + + ret + +getkey: + call initcmd + +waitagain: + mov eax,40 + mov ebx,01000000b + int 0x40 + + mov eax,10 + int 0x40 + + cmp eax,7 + jne waitagain + + mov edi,key + mov esi,ipcb+16 + movsb + + ret + +endipc: + mov eax,60 + mov ebx,2 + mov ecx,dword [cmdpid] + mov edx,ipcend + mov esi,4 + int 0x40 + + jmp exit + +cmdpid dd 0 +cmdnumb dd 0 + +printf db '~ppp' +ipceol db '~lll' +ipcend db '~eee' +ipccls db '~ccc' +ipckey db '~kkk' + +key db 0 + +ipcb: + db 0 + db 0,0,0 + dd 8 +times 20 db 0 + +ipcc: + db 0 + db 0,0,0 + dd 8 +times 20 db 0 + +stripc: times 84 db 0 + +fill_symbol db 0 + +prc: times 52 db 0 + diff --git a/programs/network/icq/trunk/README.TXT b/programs/network/icq/trunk/README.TXT index dbedb85211..43b096303d 100644 --- a/programs/network/icq/trunk/README.TXT +++ b/programs/network/icq/trunk/README.TXT @@ -5,7 +5,7 @@ v 0.01 ш т√тюф Єё  юЄырфюўэ√х ёююс∙хэш  ╧юффхЁцштрхЄё : -* ╦юъры№э√щ ъюэЄръЄ-ышёЄ, яюър цхёЄъю чр°шЄ т ъюф +* ╤хЁтхЁэ√щ ╩╦ * яхЁхфрўр/яЁшхь ёююс∙хэшщ plain-text * ╧хЁхъюфшЁютър CP866<->CP1251 * ╧Ёшхь offline ёююс∙хэшщ @@ -13,7 +13,7 @@ v 0.01 /UIN ╤ююс∙хэшх ═хфюЁрсюЄъш: ╠эюую :-) -* ╬Єъы■ўхэю чръЁ√Єшх ёюъхЄют - ью  VM (Parallels) эруыєїю тшёэхЄ, яЁш +* ╬Єъы■ўхэю чръЁ√Єшх ёюъхЄют -  фЁю тшёэхЄ, яЁш яюя√Єъх чръЁ√Є№ ёюъхЄ * ┬ёх ёююс∙хэш  юЄ Ёрчэ√ї ■чхЁют т юфэюь яюых т√тюфр @@ -24,37 +24,14 @@ v 0.01 * editbox шэюуфр тхфхЄ ёхс  ёЄЁрээю :-) * .......... -─ы  шчьхэхэш  єшэр/ярЁюы  эрфю яхЁхъюьяшышЁютрЄ№ яЁюуЁрььє - - Їрщы ki.asm, яхЁхьхээ√х UIN ш PASS - - - -─ы  тэхёхэш  ■чхЁют т ╩╦ - Їрщы comp.inc, ЇєэъЎш  loaduin, -яхЁхьээ√х U1, U2, U3 .... -(╤ъюЁхх тёхую, яюЄюь сєфхЄ яхЁхяшёрэю фы  чруЁєчъш шч Їрщыр) - -╥.ъ.   ЄхёЄшЁютры яЁюуЁрььє Єюы№ъю яюф VM, тючьюцэю, ўЄю эшўхую ш эх чрЁрсюЄрхЄ -╥хёЄшЁютрэшх яЁютюфшыюё№ ё ыюъры№э√ь ёхЁтхЁюь SIQ яюф Windows, VM Parallels -ш ё юёэютэ√ь ёхЁтхЁюь рёш яюф Menuet, VM VMware (Є.ъ. т parallels эхЄ яюффхЁцъш NAT, - р Kolibri эх яюффхЁцштрхЄ ёхЄхтє■ ърЁЄє т VMware, ьюцхЄ,   ш ю°шср■ё№ :-)) - - - - ┬√Ёрцр■ сыруюфрЁэюёЄ№ тёхь ЁрчЁрсюЄўшърь OS Kolibri чр яЁхъЁрёэ√х шэёЄЁєьхэЄ√ ш фюъєьхэЄрЎш■, схч ъюЄюЁющ   с√ -эшўхую эх эряшёры :-) +эшўхую эх эряшёры :-), р Єръцх яЁюхъЄє iserverd.khstu.ru, +ёхЁтхЁ ш юяшёрэш  яЁюЄюъюыют ъюЄюЁюую   шёяюы№чютры. - - - - - - -┬ёх яюцхырэш  ю фры№эхщ°хщ ёєф№сх яЁюхъЄр (чръЁ√Є№, эряЁшьхЁ :-))°ышЄх эр lv4evil@ya.ru - -;╥юы№ъю чр ъЁштющ ъюф ш єцрёэ√щ рэуышщёъшщ эюурьш эх схщЄх :-) \ No newline at end of file +хёыш є трё хёЄ№ ъръшх-эшсєф№ яЁхфыюцхэш , яЁшё√ырщЄх эр lv4evil@yandex.ru + diff --git a/programs/network/icq/trunk/SSI_INFO.txt b/programs/network/icq/trunk/SSI_INFO.txt new file mode 100644 index 0000000000..4357350721 --- /dev/null +++ b/programs/network/icq/trunk/SSI_INFO.txt @@ -0,0 +1,56 @@ +00 00 08 00 07 36 32 31 38 38 39 37 0A 1E 43 18 .....6218897..C. +^^ byte Version number of SSI protocol (currently 0x00) + ^^ ^^ word Number of items in this snac + ^^ ^^ word Length of the item name + ^^ ^^ ^^ ^^ ^^ ^^ ^^ string Item name string + ^^ ^^ word Group ID# + ^^ ^^ word Item ID# + + + +00 00 00 0A 01 31 00 06 46 75 6E 42 6F 6F 00 09 .....1..FunBoo.. +^^ ^^ word Type of item flag (see list bellow) + ^^ ^^ word Length of the additional data + ^^ ^^ word TLV.Type (TLV #1) + ^^ ^^ word TLV.Length + ^^ ^^ ^^ ^^ ^^ ^^ TLV.Value + + + + + + +31 37 36 33 33 33 30 37 38 17 B7 2A 18 00 00 00 176333078..*.... +09 01 31 00 05 45 2E 53 2E 56 00 07 36 32 31 38 ..1..E.S.V..6218 +38 39 38 23 8C 12 A1 00 00 00 09 01 31 00 05 74 898#........1..t +68 6F 72 64 00 07 46 72 69 65 6E 64 73 7F ED 00 hord..Friends... +00 00 01 00 00 00 0A 43 6F 2D 57 6F 72 6B 65 72 .......Co-Worker +73 55 7F 00 00 00 01 00 00 00 07 36 32 31 38 38 sU.........62188 +39 35 23 8C 08 80 00 00 00 0D 01 31 00 09 52 65 95#........1..Re +67 72 65 73 73 6F 72 00 07 36 32 35 31 37 32 33 gressor..6251723 +23 8C 05 83 00 00 00 0D 01 31 00 05 47 68 6F 73 #........1..Ghos +74 00 66 00 00 00 07 36 32 31 33 39 34 39 23 8C t.f....6213949#. +26 9A 00 00 00 0D 01 31 00 05 6D 69 63 6B 79 00 &......1..micky. +66 00 00 3B B7 4B 7D + + + + + + 0x0000 Buddy record (name: uin for ICQ and screenname for AIM) + 0x0001 Group record + 0x0002 Permit record ("Allow" list in AIM, and "Visible" list in ICQ) + 0x0003 Deny record ("Block" list in AIM, and "Invisible" list in ICQ) + 0x0004 Permit/deny settings or/and bitmask of the AIM classes + 0x0005 Presence info (if others can see your idle status, etc) + 0x0009 Unknown. ICQ2k shortcut bar items ? + 0x000E Ignore list record. + 0x000F Last update date (name: "LastUpdateDate"). + 0x0010 Non-ICQ contact (to send SMS). Name: 1#EXT, 2#EXT, etc + 0x0013 Item that contain roster import time (name: "Import time") + 0x0014 Own icon (avatar) info. Name is an avatar id number as text + + + + +[TLV(0x0131), itype 0x00, size XX] - This stores the name that the contact should show up as in the contact list. It should initially be set to the contact's nick name, and can be changed to anything by the client. \ No newline at end of file diff --git a/programs/network/icq/trunk/STDCALL.INC b/programs/network/icq/trunk/STDCALL.INC new file mode 100644 index 0000000000..1ba36da275 Binary files /dev/null and b/programs/network/icq/trunk/STDCALL.INC differ diff --git a/programs/network/icq/trunk/build_ru.bat b/programs/network/icq/trunk/build_ru.bat index 3e8ceeff32..348c888209 100644 --- a/programs/network/icq/trunk/build_ru.bat +++ b/programs/network/icq/trunk/build_ru.bat @@ -1,5 +1,2 @@ -@erase lang.inc -@echo lang fix ru >lang.inc @fasm ki.asm ki -@erase lang.inc -@pause \ No newline at end of file + diff --git a/programs/network/icq/trunk/comp.inc b/programs/network/icq/trunk/comp.inc index cb5481f72a..9a7df2128a 100644 --- a/programs/network/icq/trunk/comp.inc +++ b/programs/network/icq/trunk/comp.inc @@ -9,49 +9,53 @@ { pushad - mov edx, color + ;mov edx, color ; ------------ - mov eax, 38 + ;mov eax, 38 mov ebx, x1 shl ebx, 16 add ebx, x2 mov ecx, y1 shl ecx, 16 add ecx, y1 - int 40h + ;int 40h + mcall 38, ebx, ecx, color ; ------------ - mov eax, 38 + ;mov eax, 38 mov ebx, x1 shl ebx, 16 add ebx, x2 mov ecx, y2 shl ecx, 16 add ecx, y2 - int 40h + ;int 40h + mcall 38, ebx, ecx, color ; | ; | ; | - mov eax, 38 + ;mov eax, 38 mov ebx, x1 shl ebx, 16 add ebx, x1 mov ecx, y1 shl ecx, 16 add ecx, y2 - int 40h + ;int 40h + mcall 38, ebx, ecx, color ; | ; | ; | - mov eax, 38 + ;mov eax, 38 mov ebx, x2 shl ebx, 16 add ebx, x2 mov ecx, y1 shl ecx, 16 add ecx, y2 - int 40h - + ;int 40h + mcall 38, ebx, ecx, color + popad } @@ -59,9 +63,9 @@ ; Вывод на экран буфера со строками ; -scbuff db 512*128 dup 0 -; 512 - длина строки -; 128 - количество строк +scbuff db 80*41 dup 0 +; 60 - длина строки +; 41 - количество строк ; ind db 0 ; Текущий индекс ; @@ -72,7 +76,7 @@ y_s dw 38 ; ; Высота строки SH = 10 -xlen dw 512 ; длина строки +xlen dw 80 ; длина строки ;ylen dw 128 ; количество строк ylen dw 40 @@ -84,11 +88,12 @@ ylen dw 40 ; ; Нарисуем белый прямоугольник ; - mov eax, 13 - mov ebx, 15*65536+480 - mov ecx, 31*65536+418 - mov edx, 0FFFFFFh - int 40h + ;mov eax, 13 + ;mov ebx, 15*65536+480 + ;mov ecx, 31*65536+418 + ;mov edx, 0FFFFFFh + ;int 40h + mcall 13, (15 * 65536 + 480), (31 * 65536 + 418), 0x00FFFFFF @@ -142,9 +147,10 @@ ylen dw 40 xor ecx, ecx mov ecx, dword [edx+eax] ; Последние 4 Байта с цветом or ecx, 0x80000000 ; Выводить ASCIIZ - mov eax, 4 - mov esi, -1 ; For Menuet - int 40h + ;mov eax, 4 + ;mov esi, -1 ; For Menuet + ;int 40h + mcall 4, ebx, ecx, edx pop ecx inc ecx jmp pb_loop @@ -159,7 +165,7 @@ ylen dw 40 ; macro write_debug str { - local ..string, ..label, ..end, ..loop, ..fin + local ..string, ..label, ..end, ..loop, ..fin, ..n_inc jmp ..label ..string db str, 0 @@ -176,6 +182,16 @@ ylen dw 40 imul ebx, eax add ebx, scbuff + ; + ; Черный цвет вывода + ; + mov edx, ebx + lea edx, [edx+eax] + sub edx, 4 ;4 байта с цветом + mov dword [edx], dword 0 + xor edx, edx + + ..loop: mov dl, [..string+ecx] cmp dl, 0 @@ -189,14 +205,14 @@ ylen dw 40 xor ebx, ebx mov bl, [ind] cmp bx, [ylen] - jz @f + jz ..n_inc inc bl jmp ..fin - @@: + ..n_inc: xor bl, bl ..fin: - mov [ind], bl + mov [ind], bl call printbuff ;call draw_window popad @@ -213,19 +229,10 @@ ylen dw 40 ..string db str, 0 ..label: - mov eax, 8 - mov ebx, x*65536+xlen - mov ecx, y*65536+ylen - mov edx, id - mov esi, 0x4466aa - int 40h + + mcall 8, (x*65536+xlen), (y*65536+ylen), id, 0x4466aa - mov eax, 4 - mov ebx, (x+5)*65536+y+ylen/2-3 - xor ecx, ecx - or ecx, 0x80FFFFFF - mov edx, ..string - int 40h + mcall 4, ((x+5)*65536+y+ylen/2-3), 0x80FFFFFF, ..string popad } @@ -236,7 +243,7 @@ ylen dw 40 macro data_debug str, rg { pushad - local ..string, ..end, ..loop, ..strend, ..fin, ..label + local ..string, ..end, ..loop, ..strend, ..fin, ..label, ..n_inc jmp ..label ..string db str, 20h, 0, 0, 0, 0, 0, 0, 0, 0, 0 ..strend: @@ -259,6 +266,15 @@ ylen dw 40 imul ebx, eax add ebx, scbuff + ; + ; Черный цвет вывода + ; + mov edx, ebx + lea edx, [edx+eax] + sub edx, 4 ;4 байта с цветом + mov dword [edx], dword 0 + xor edx, edx + ..loop: mov dl, [..string+ecx] cmp dl, 0 @@ -272,10 +288,10 @@ ylen dw 40 xor ebx, ebx mov bl, [ind] cmp bx, [ylen] - jz @f + jz ..n_inc inc bl jmp ..fin - @@: + ..n_inc: xor bl, bl ..fin: @@ -334,127 +350,6 @@ ylen dw 40 popf ret -; -; -CP866 db 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' - -; -; Перекодировка из cp1251 в cp866 -; -; [eax] <-- Null-terminated string -; - - win2dos: - pushad - pushf - - xor ebx, ebx - xor ecx, ecx - ;xor edx, edx - - w2d_loop: - mov bl, [eax+ecx] - cmp bl, 0 - jz w2d_end - cmp bl, 0A8h ; Ё - jz w2d_yo1 - cmp bl, 0B8h ; ё - jz w2d_yo2 - cmp bl, 0C0h ; Русская буква - jnc w2d_rchar - inc ecx - jmp w2d_loop - - w2d_yo1: - mov [eax+ecx], byte 0F0h - inc ecx - jmp w2d_loop - - w2d_yo2: - mov [eax+ecx], byte 0F1h - inc ecx - jmp w2d_loop - - w2d_rchar: - sub bl, 0C0h - mov bl, [CP866+ebx] - mov [eax+ecx], bl - inc ecx - jmp w2d_loop - - - w2d_end: - - popf - popad - ret - - -CP1251 db '└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ' - -; -; Перекодировка из CP866 в CP1251 -; [eax] <-- Null termainated string -; - - dos2win: - pushf - pushad - - xor ebx, ebx - xor ecx, ecx - - dec ecx - - d2w_loop: - inc ecx - mov bl, [eax+ecx] - cmp bl, 0 - jz d2w_end - cmp bl, 80h - jnc d2w_rchar - - ;inc ecx - jmp d2w_loop - - d2w_yo1: - mov byte [eax+ecx], 0A8h - ;inc ecx - jmp d2w_loop - - d2w_yo2: - mov byte [eax+ecx], 0B8h - ;inc ecx - jmp d2w_loop - - d2w_rchar: - cmp bl, 0B0h - jnc d2w_rchar2 - - sub bl, 80h - mov bl, [CP1251+ebx] - mov [eax+ecx], bl - jmp d2w_loop - - d2w_rchar2: - cmp bl, 0E0h - jc d2w_loop - cmp bl, 0F0h - jz d2w_yo1 - cmp bl, 0F1h - jz d2w_yo2 - cmp bl, 0F2h - jnc d2w_loop - add bl, 10h - mov [eax+ecx], bl - jmp d2w_loop - - - d2w_end: - - popad - popf - ret ; @@ -464,21 +359,51 @@ CP1251 db ' ; writemsg: pushad + xor edi, edi + + + wm_loop: + xor esi, esi ; Если 1 - есть еще символы в строке + lea eax, [eax+edi] + push ebx push eax xor eax, eax xor ebx, ebx + mov bl, [ind] mov ax, [xlen] imul ebx, eax add ebx, scbuff + + + + ; + ; Разбиваем строку сообщения на несколько строк по xlen-4 (т.к в конце двойное слово - цвет строки) + ; + + pop eax mov edx, eax call strlen + + movzx ecx, [xlen] + cmp eax, ecx + jc @f ;< + + movzx edi, [xlen] + lea edi, [edi-4] + mov ecx, eax + inc esi + + + @@: + + mov eax, edx call strcpy @@ -491,20 +416,25 @@ CP1251 db ' mov dword [ebx+eax], ecx ; Последние 4 Байта с цветом - xor ebx, ebx - mov bl, [ind] - cmp bx, [ylen] + xor eax, eax + mov al, [ind] + cmp ax, [ylen] jz @f - inc bl + inc al jmp ..fin @@: - xor bl, bl + xor al, al ..fin: - mov [ind], bl + mov [ind], al + mov ebx, ecx ; цвет + mov eax, edx ; указатель на строку + cmp esi, 0 + jnz wm_loop + + call printbuff - ;call draw_window popad ret @@ -515,7 +445,7 @@ CP1251 db ' ; <--EAX Перевод из 16 в 10 форму -; -->[ebx] +; -->[ebx] строка ; --> eax длина int2strd: pushf @@ -597,9 +527,9 @@ x_bb dw 550 ; y_bb dw 30 ; ; bb_width dw 100 ; Ширина кнопок -bb_height dw 15 ; высота кнопок +bb_height dw 12 ; высота кнопок ; -bb_dist dw 10 ; Расстояние между кнопками +bb_dist dw 6 ; Расстояние между кнопками ; Идентификаторы кнопок начиная с 100 ; @@ -617,12 +547,23 @@ bb_dist dw 10 ; bb_loop: ; Проверяем первый байт уина, если 0, кнопку рисовать не надо - mov ebx, NAME_LEN + ;mov ebx, NAME_LEN + ;imul ebx, ecx + + ;mov al, [names+ebx] + ;cmp al, 0 + ;jz bb_end + + mov ebx, UIN_LEN imul ebx, ecx - mov al, [names+ebx] + mov al, [uins + ebx] cmp al, 0 jz bb_end + + + + ; рисуем кнопку ; Цвет зависит от статуса UIN mov ebx, 4 @@ -726,7 +667,7 @@ bb_dist dw 10 ; ; Массив с UIN ; UIN_LEN = 11 ; Длина -UINS = 15 ; Количество +UINS = 22 ; Количество ; uins db UIN_LEN*UINS dup 0 ; @@ -742,12 +683,13 @@ names db NAME_LEN*UINS dup 0 ; ; -U1 db '123456789',0 -U2 db '123456789',0 -U3 db '123456789',0 +U1 db '405577261',0 +U2 db '455395049',0 +U3 db '488118046',0 ; ; Загрузка массива UIN ; +; FIXME будет удалена loaduin: pushad mov eax, U1 @@ -923,4 +865,108 @@ U3 db '123456789',0 popf popad - ret \ No newline at end of file + ret + +; +; +; Отладочная функция - выводит область памяти +; EAX - указатель на область +; EBX - количество байт +; + + print_mem: + push eax + push ebx + push ecx + push edx + push esi + + xor ecx, ecx + xor esi, esi + + + pm_loop: + cmp ecx, ebx + jz pm_exit + + + mov dl, [eax + ecx] + shr dl, 4 ;Сдвинуть на 4 разряда вправо + + cmp dl, 0x0A + jnb pm_chars + + or dl, 0x30 + jmp pm_write + + pm_chars: + add dl, 0x37 + + pm_write: + mov [membuff + esi], dl + inc esi + ; + ; + + mov dl, [eax + ecx] + and dl, 0x0F + + cmp dl, 0x0A + jnb pm_chars2 + + or dl, 0x30 + jmp pm_write2 + + pm_chars2: + add dl, 0x37 + + pm_write2: + mov [membuff + esi], dl + inc esi + + + mov [membuff + esi], 0x20 + inc esi + + cmp esi, MEMBUFF_SIZE - 2 + jb pm_nwrite + ; + ; вывести буфер + mov [membuff + esi], byte 0 + + push eax + push ebx + + mov eax, membuff + xor ebx, ebx + xor esi, esi + + call writemsg + + pop ebx + pop eax + + pm_nwrite: + + inc ecx + jmp pm_loop + + + + pm_exit: + + mov [membuff + esi], byte 0 + + + mov eax, membuff + xor ebx, ebx + xor esi, esi + + call writemsg + + pop esi + pop edx + pop ecx + pop ebx + pop eax + ret diff --git a/programs/network/icq/trunk/comp_data.inc b/programs/network/icq/trunk/comp_data.inc new file mode 100644 index 0000000000..19adca49d0 --- /dev/null +++ b/programs/network/icq/trunk/comp_data.inc @@ -0,0 +1,3 @@ +MEMBUFF_SIZE = (16 * 3 + 1) + +membuff db MEMBUFF_SIZE dup 0 \ No newline at end of file diff --git a/programs/network/icq/trunk/config.inc b/programs/network/icq/trunk/config.inc new file mode 100644 index 0000000000..dc70bf9760 --- /dev/null +++ b/programs/network/icq/trunk/config.inc @@ -0,0 +1 @@ +__CPU_type fix p5 diff --git a/programs/network/icq/trunk/debug.inc b/programs/network/icq/trunk/debug.inc new file mode 100644 index 0000000000..1f43e064a7 --- /dev/null +++ b/programs/network/icq/trunk/debug.inc @@ -0,0 +1,137 @@ +macro debug_print str +{ + local ..string, ..label + + jmp ..label + ..string db str,0 + ..label: + + pushf + pushad + mov edx,..string + call debug_outstr + popad + popf +} + +dps fix debug_print + +macro debug_print_dec arg +{ + pushf + pushad + if ~arg eq eax + mov eax,arg + end if + call debug_outdec + popad + popf +} + +dpd fix debug_print_dec + +;--------------------------------- +debug_outdec: ;(eax - num, edi-str) + push 10 ;2 + pop ecx ;1 + push -'0' ;2 + .l0: + xor edx,edx ;2 + div ecx ;2 + push edx ;1 + test eax,eax ;2 + jnz .l0 ;2 + .l1: + pop eax ;1 + add al,'0' ;2 + call debug_outchar ; stosb + jnz .l1 ;2 + ret ;1 +;--------------------------------- + +debug_outchar: ; al - char + pushf + pushad + mov cl,al + mov eax,63 + mov ebx,1 + int 0x40 + popad + popf +ret + +debug_outstr: + mov eax,63 + mov ebx,1 + @@: + mov cl,[edx] + test cl,cl + jz @f + int 40h + inc edx + jmp @b + @@: + ret + +_debug_crlf db 13, 10, 0 + +macro newline +{ + pushf + pushad + mov edx, _debug_crlf + call debug_outstr + popad + popf +} + +macro print message +{ + dps message + newline +} + +macro pregs +{ + dps "EAX: " + dpd eax + dps " EBX: " + dpd ebx + newline + dps "ECX: " + dpd ecx + dps " EDX: " + dpd edx + newline +} + +macro debug_print_hex arg +{ + pushf + pushad + if ~arg eq eax + mov eax, arg + end if + call debug_outhex + popad + popf +} +dph fix debug_print_hex + +debug_outhex: + ; eax - number + mov edx, 8 + .new_char: + rol eax, 4 + movzx ecx, al + and cl, 0x0f + mov cl, [__hexdigits + ecx] + pushad + mcall 63, 1 + popad + dec edx + jnz .new_char +ret + +__hexdigits: + db '0123456789ABCDEF' \ No newline at end of file diff --git a/programs/network/icq/trunk/dialogs1.inc b/programs/network/icq/trunk/dialogs1.inc new file mode 100644 index 0000000000..d4e3abb482 --- /dev/null +++ b/programs/network/icq/trunk/dialogs1.inc @@ -0,0 +1,597 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ; +; DIALOGS1.INC ; +; ; +; COMPILE WITH FASM for MENUET ; +; ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +menus dd 3 ; number of menus +m_x dd 0x5 ; x start +m_y dd 20 ; y start +m_xs dd 290 ; x size +m_ys dd 14 ; y size +g_stack dd 0xf000 ; thread stack - required + + +menu:; AB C D E F G + + db '*D FILE +Save File +Load File +- +Quit ' + db '*B EDIT +Copy +Paste ' + db '*B HELP +Setup +About.. ' + db '@' ; end mark + +; A : Data type '*' -> New menu , '+' -> menu selection +; B : Number of selections in menu (A+) +; C : Menu header text +; D-G : Menu selection text + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; DATA BELOW IS FOR DIALOGS1.INC INTERNALS + +menu_action dd '----' + +window_on db 0 + +g_n dd -1 +g_x dd 0x0 +g_t dd 0x0 +g_1 dd 0x0 +g_l dd 0x0 +closet db 0 + +table: times 1024 db 0 + +last_mouse dd 0x0 + +mo_x dd 0x0 +mo_y dd 0x0 + + +check_mouse: + + pusha + + cmp [window_on],1 + je no_open + + mov eax,37 + mov ebx,2 + int 0x40 + + cmp [window_on],0 + jne openw2 + + cmp eax,0 + je no_open + + openw2: + + waitformouse: + + mov eax,23 + mov ebx,2 + int 0x40 + + cmp eax,0 + jne no_open + + mov eax,37 + mov ebx,2 + int 0x40 + + cmp eax,0 + jne waitformouse + + + mov eax,37 + mov ebx,1 + int 0x40 + + mov esi,eax + + shr eax,16 + xor edx,edx + mov ebx,50 + div ebx + mov edx,eax + cmp edx,[g_n] + je no_open + cmp edx,[menus] + jge no_open + mov eax,esi + + and eax,0xffff + + mov ebx,[m_y] + cmp eax,ebx + jbe no_open + add ebx,[m_ys] + cmp eax,ebx + jge no_open + + cmp [window_on],0 + je noww + + mov [closet],1 + mov ecx,100 + waitm: + mov eax,5 + mov ebx,1 + int 0x40 + dec ecx + jz no_open + cmp [window_on],0 + jne waitm + noww: + + mov eax,edx + jmp cll + + no_open: + + mov [last_mouse],esi + + popa + + ret + + cll: + + mov [window_on],2 + + mov [g_n],eax + mov [g_x],96 + mov [g_t],0 + mov [g_1],1 + + mov eax,9 + mov ebx,table + mov ecx,-1 + int 0x40 + + mov eax,[table+34] + mov [mo_x],eax + mov eax,[table+38] + mov [mo_y],eax + + mov eax,51 + mov ebx,1 + mov ecx,alert_entry + mov edx,[g_stack] + int 0x40 + + mov [esp+28],dword 0 ; clear button entry + + mov [menu_action],'MD ' + + check_gr: + + popa + + ret + + +draw_menu: + + mov eax,9 + mov ebx,table + mov ecx,-1 + int 0x40 + + cmp [table+46],dword 30 + jb drmr + + mov eax,13 ; white background + mov ebx,[m_x] + shl ebx,16 + add ebx,[m_xs] + inc ebx + mov ecx,[m_y] + shl ecx,16 + add ecx,[m_ys] + mov edx,0xf0f8ff + int 0x40 + + mov eax,38 ; egde lines + mov ebx,[m_x] + shl ebx,16 + add ebx,[m_x] + add ebx,[m_xs] + mov ecx,[m_y] + shl ecx,16 + add ecx,[m_y] + mov edx,0x000000 + int 0x40 + mov eax,38 + mov ecx,[m_y] + add ecx,[m_ys] + shl ecx,16 + add ecx,[m_y] + add ecx,[m_ys] + int 0x40 + + mov esi,menu-1 + mov edi,[m_x] + mov ebp,1 + new_menu: + inc esi + + cmp [esi],byte '*' + jne drmnl1 + push esi + mov eax,4 + mov ebx,edi + shl ebx,16 + add ebx,[m_y] + add ebx,0x00050004 + mov ecx,0x000000 + mov edx,esi + add edx,3 + mov esi,12 + int 0x40 ; draw text + pop esi + add esi,2 + add edi,50 + inc ebp + + drmnl1: + cmp [esi],byte '@' + jne new_menu + + drmr: + + ret + +alert_box: + + ; eax : x size - min 200 + ; ebx : pointer to ASCIIZ - max 128 character text + ; ecx : button 1 id ( OK or YES ) + ; edx : button 2 id or zero ( NO ) + + + cmp [window_on],0 + jne alert_box_return + + mov [window_on],1 + + cmp eax,100 + jg size_ok + mov eax,100 + size_ok: + + mov [g_x],eax + mov [g_t],ebx + mov [g_1],ecx + + mov ecx,0 + new_search: + cmp [ebx],byte 0 + je found_len + inc ebx + inc ecx + cmp ecx,128 + jbe new_search + found_len: + mov [g_l],ecx + + mov eax,51 + mov ebx,1 + mov ecx,alert_entry + mov edx,[g_stack] + int 0x40 + + mov [menu_action],'MA ' + + alert_box_return: + + ret + +alert_entry: + + call alert_draw_window + +alert_still: + + mov eax,23 ; wait here for event + mov ebx,1 + int 0x40 + + cmp eax,1 ; redraw request ? + je alert_red + cmp eax,2 ; key in buffer ? + je alert_key + cmp eax,3 ; button in buffer ? + je alert_button + + cmp [closet],0 + jne ccc + + mov eax,9 + mov ebx,table + mov ecx,-1 + int 0x40 + + cmp ax,[table+4] + je no_close + ccc: + mov [closet],0 + mov [g_n],-1 + mov [menu_action],'----' + mov [window_on],0 + mov eax,-1 + int 0x40 + no_close: + + jmp alert_still + + alert_red: ; redraw + call alert_draw_window + jmp alert_still + + alert_key: ; key + mov eax,2 ; just read it and ignore + int 0x40 + jmp alert_still + + alert_button: ; button + mov eax,17 ; get id + int 0x40 + + shr eax,8 + cmp eax,3 + jg no_action1 + dec eax + shl eax,2 + mov eax,dword [eax+rtext] + mov [menu_action],eax + jmp action_done + no_action1: + sub eax,16 + add eax,65 + shl eax,8 + mov ebx,[g_n] + add ebx,65 + add eax,ebx + mov [menu_action],eax + + action_done: + + mov [closet],0 + mov [g_n],-1 + mov [window_on],0 + mov eax,-1 ; close this program + int 0x40 + + rtext db 'NO YES OK ' + + jmp alert_still + + +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + + +alert_draw_window: + + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,1 ; 1, start of draw + int 0x40 + + cmp [window_on],2 + jne no_win_type_2 + + mov edx,menu-1 + mov ecx,[g_n] + add ecx,1 + find_menu: + inc edx + cmp [edx],byte '*' + je menu_loop + jmp find_menu + menu_loop: + loop find_menu + movzx ebp,byte [edx+1] + sub ebp,64 + push edx + ; DRAW WINDOW + mov eax,0 ; function 0 : define and draw window + mov ebx,[g_n] + imul ebx,50 + add ebx,[mo_x] + add ebx,[m_x] + shl ebx,16 + add ebx,[g_x] + mov ecx,[mo_y] + add ecx,[m_y] + add ecx,[m_ys] + shl ecx,16 + mov edx,14 + imul edx,ebp + add edx,7 + add ecx,edx + mov edx,0x00ffffff ; color of work area RRGGBB,8->color gl + mov esi,0x00ffffff ; color of grab bar RRGGBB,8->color gl + mov edi,0x000000cc ; color of frames RRGGBB + int 0x40 + + pop edx + + mov ebx,5*65536+7 ; draw info text with function 4 + mov ecx,0x10000000 + mov esi,12 + mov ebp,16 + no_d_found: + inc edx + cmp [edx],byte '*' + je d_drawed + cmp [edx],byte '@' + je d_drawed + cmp [edx],byte '+' + jne no_d_found + inc edx + pusha ; draw button + mov eax,8 + mov ecx,ebx + mov ebx,[g_x] + add ebx,0x0000fffe + shl ecx,16 + add ecx,0xfffc0000+14 + mov edx,0x40000000 + add edx,ebp + mov esi,0 + int 0x40 + popa + mov eax,4 ; draw text + int 0x40 + inc ebp + add ebx,14 + jmp no_d_found + d_drawed: + + no_win_type_2: + + + cmp [window_on],1 + jne no_win_1 + + mov eax,14 ; to middle of screen + int 0x40 + mov ecx,eax + and ecx,0xffff + shr ecx,1 + shr eax,1 + mov ebx,[g_x] + shr ebx,1 + shl ebx,16 + sub eax,ebx + mov ebx,eax + + mov eax,0 ; function 0 : define and draw window + mov bx,word [g_x] + sub ecx,80 + shl ecx,16 + mov cx,110 ; [y start] *65536 + [y size] + mov edx,0x02ffffff ; color of work area RRGGBB,8->color gl + mov esi,0x80d05050 ; color of grab bar RRGGBB,8->color gl + mov edi,0x00d05050 ; color of frames RRGGBB + int 0x40 + + + mov eax,4 ; label + mov ebx,8*65536+8 + mov ecx,0x10ddeeff + mov edx,alert_labelt1 + mov esi,alert_label1len-alert_labelt1 + int 0x40 + + mov eax,4 + mov ebx,10*65536+43 + mov ecx,0x10000000 + mov edx,[g_t] + mov esi,[g_l] + int 0x40 + + cmp [g_1],1 + jne gadgets_no_1 + + mov eax,8 + mov ebx,[g_x] + sub ebx,100 + shr ebx,1 + shl ebx,16 + add ebx,30*65536+40 + mov ecx,75*65536+16 + mov edx,3 + mov esi,0x446688 + int 0x40 + + mov eax,4 + mov ebx,[g_x] + sub ebx,100 + shr ebx,1 + shl ebx,16 + add ebx,31*65536+80 + mov ecx,0x10ffffff + mov edx,alert_t2 + mov esi,alert_t2len-alert_t2 + int 0x40 + + gadgets_no_1: + + cmp [g_1],2 + jne gadgets_no_2 + + mov eax,8 + mov ebx,[g_x] + sub ebx,100 + shr ebx,1 + shl ebx,16 + add ebx,0*65536+40 + mov ecx,75*65536+16 + mov edx,1 + mov esi,0x446688 + int 0x40 + + mov eax,8 + mov ebx,[g_x] + sub ebx,100 + shr ebx,1 + shl ebx,16 + add ebx,57*65536+40 + mov ecx,75*65536+16 + mov edx,2 + mov esi,0x446688 + int 0x40 + + mov eax,4 + mov ebx,[g_x] + sub ebx,100 + shr ebx,1 + shl ebx,16 + add ebx,1*65536+80 + mov ecx,0x10ffffff + mov edx,alert_t1 + mov esi,alert_t1len-alert_t1 + int 0x40 + + gadgets_no_2: + + no_win_1: + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw + int 0x40 + + ret + + +; DATA AREA + + +alert_t1: + db ' No Yes' +alert_t1len: + + +alert_t2: + db ' OK' +alert_t2len: + + +alert_labelt1: + db 'ALERT' +alert_label1len: + + + + + + + + diff --git a/programs/network/icq/trunk/dos2win.inc b/programs/network/icq/trunk/dos2win.inc new file mode 100644 index 0000000000..e0c8c1f010 --- /dev/null +++ b/programs/network/icq/trunk/dos2win.inc @@ -0,0 +1,121 @@ +; +; +CP866 db 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' + +; +; Перекодировка из cp1251 в cp866 +; +; [eax] <-- Null-terminated string +; + + win2dos: + pushad + pushf + + xor ebx, ebx + xor ecx, ecx + ;xor edx, edx + + w2d_loop: + mov bl, [eax+ecx] + cmp bl, 0 + jz w2d_end + cmp bl, 0A8h ; Ё + jz w2d_yo1 + cmp bl, 0B8h ; ё + jz w2d_yo2 + cmp bl, 0C0h ; Русская буква + jnc w2d_rchar + inc ecx + jmp w2d_loop + + w2d_yo1: + mov [eax+ecx], byte 0F0h + inc ecx + jmp w2d_loop + + w2d_yo2: + mov [eax+ecx], byte 0F1h + inc ecx + jmp w2d_loop + + w2d_rchar: + sub bl, 0C0h + mov bl, [CP866+ebx] + mov [eax+ecx], bl + inc ecx + jmp w2d_loop + + + w2d_end: + + popf + popad + ret + + +CP1251 db '└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ' + +; +; Перекодировка из CP866 в CP1251 +; [eax] <-- Null termainated string +; + + dos2win: + pushf + pushad + + xor ebx, ebx + xor ecx, ecx + + dec ecx + + d2w_loop: + inc ecx + mov bl, [eax+ecx] + cmp bl, 0 + jz d2w_end + cmp bl, 80h + jnc d2w_rchar + + ;inc ecx + jmp d2w_loop + + d2w_yo1: + mov byte [eax+ecx], 0A8h + ;inc ecx + jmp d2w_loop + + d2w_yo2: + mov byte [eax+ecx], 0B8h + ;inc ecx + jmp d2w_loop + + d2w_rchar: + cmp bl, 0B0h + jnc d2w_rchar2 + + sub bl, 80h + mov bl, [CP1251+ebx] + mov [eax+ecx], bl + jmp d2w_loop + + d2w_rchar2: + cmp bl, 0E0h + jc d2w_loop + cmp bl, 0F0h + jz d2w_yo1 + cmp bl, 0F1h + jz d2w_yo2 + cmp bl, 0F2h + jnc d2w_loop + add bl, 10h + mov [eax+ecx], bl + jmp d2w_loop + + + d2w_end: + + popad + popf + ret diff --git a/programs/network/icq/trunk/editbox.mac b/programs/network/icq/trunk/editbox.mac index 47689a12f0..0f628fe0ed 100644 --- a/programs/network/icq/trunk/editbox.mac +++ b/programs/network/icq/trunk/editbox.mac @@ -31,9 +31,9 @@ macro use_general_func mov edx,ed_offset add ebx,2 shl ebx,16 - mov bx,ed_top - add ebx,4 + add ebx,ed_top mov ecx,ed_text_color + add ebx,4 add edx,ed_text mcall ret @@ -47,20 +47,19 @@ ret .draw_bg: mov ebx,ed_left add ebx,1 - shl ebx,16 - mov bx,ed_width - sub ebx,1 mov edx,ed_color + shl ebx,16 + add ebx,ed_width + sub ebx,1 .draw_bg_eax: mov ecx,ed_top mov eax,13 add ecx,1 shl ecx,16 - mov cx,ed_height + add ecx,ed_height dec ecx mcall ret - ;---------------------------------------------------------- ;--- процедура получения количества символов в текущей щирине компонента ;---------------------------------------------------------- @@ -89,7 +88,7 @@ ret lea ebx,[ebx*2+ebx] shl ebx,1 ;imul ebx,6 - add bx,ed_left + add ebx,ed_left mov ecx,ed_top inc ebx add ecx,2 @@ -100,7 +99,7 @@ ret shl ecx,16 mov cx,bp - add cx,ed_height-4 + add ecx,ed_height-4 mov cl_curs_x,ebx mov cl_curs_y,ecx @@ -123,8 +122,8 @@ ret mov ecx,ebx shl ebx,16 mov bx,cx - add bx,ed_width - mov ecx, ed_top + add ebx,ed_width + mov ecx,ed_top mov esi,ecx shl ecx,16 mov cx,si @@ -139,7 +138,7 @@ ret ;--- слева --- mov cx,si mov ebp,ebx - sub bx,ed_width + sub ebx,ed_width mcall ;--- справа --- mov ebx,ebp @@ -534,7 +533,7 @@ edit_ex inc ebx add ebx,ed_left shl ebx,16 - mov bx,6 + add ebx,6 mov edx,ebp call .draw_bg_eax ret @@ -624,12 +623,15 @@ macro are_key_shift_press ;Входные данные edx=ed_size;ecx=ed_pos push eax mov edx,ed_size - mov ecx,ed_pos + mov ecx, ed_pos pusha ;;;;;;;;;;;;;;;;;;;;; +;clear input arrea mov ebp,ed_color mov ebx,dword ed_shift_pos call .sh_cl_ + mov ebp,ed_size + call .clear_bg ;;;;;;;;;;;;;;;;;;;;; popa call .del_char @@ -1075,4 +1077,53 @@ macro debug_func stosb ;записать элемент из регистра al в ячеку памяти es:edi ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться +} + +;;;;;;;;;;;;;;; +;For LibGui +;;;;;;;;;;;;;;; +macro srt_ed_libgui +{ +ed_width equ [EditBox.ed_width] ;ширина компонента +ed_left equ [EditBox.ed_left] ;положение по оси х +ed_top equ [EditBox.ed_top] ;положение по оси у +ed_color equ [EditBox.ed_color] ;цвет фона компонента +shift_color equ [EditBox.shift_color] ;=0x6a9480 +ed_focus_border_color equ [EditBox.ed_focus_border_color] ;цвет рамки компонента +ed_blur_border_color equ [EditBox.ed_blur_border_color] ;цвет не активного компонента +ed_text_color equ [EditBox.ed_text_color] ;цвет текста +ed_max equ [EditBox.ed_max] ;кол-во символов которые можно максимально ввести +ed_text equ [EditBox.ed_text] ;указатель на буфер +ed_flags equ [EditBox.ed_flags] ;флаги +ed_size equ [EditBox.ed_size] ;кол-во символов +ed_pos equ [EditBox.ed_poz] ;позиция курсора +ed_offset equ [EditBox.ed_offset] ;смещение +cl_curs_x equ [EditBox.cl_curs_x] ;предыдущее координата курсора по х +cl_curs_y equ [EditBox.cl_curs_y] ;предыдущее координата курсора по у +ed_shift_pos equ [EditBox.ed_shift_pos] ;положение курсора +ed_shift_pos_old equ [EditBox.ed_shift_pos_old] ;старое положение курсора +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Bit mask from editbox +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_figure_only= 1000000000000000b ;одни символы +ed_always_focus= 100000000000000b +ed_focus= 10b ;фокус приложения +ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift +ed_shift_on_off=1111111111110111b +ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю +ed_shift_off= 1111111111111011b +ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение +ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения +ed_shift_cl= 1111111111100011b +ed_shift_mcl= 1111111111111011b +ed_left_fl= 100000b +ed_right_fl= 1111111111011111b +ed_offset_fl= 1000000b +ed_offset_cl= 1111111110111111b +ed_insert= 10000000b +ed_insert_cl= 1111111101111111b +ed_mouse_on = 100000000b +ed_mous_adn_b= 100011000b +ed_mouse_on_off=1111111011111111b +ed_height=14 ; высота } \ No newline at end of file diff --git a/programs/network/icq/trunk/icons.inc b/programs/network/icq/trunk/icons.inc new file mode 100644 index 0000000000..da17c64bbe --- /dev/null +++ b/programs/network/icq/trunk/icons.inc @@ -0,0 +1,64 @@ + + + +redicq: + + +db 0,0,0,0,0,0,0,0,0,0 +db 0,0,0,0,128,0,0,128,0,0,128,0,0,0,0,0 +db 128,0,0,128,0,0,128 +db 0,0,0,0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,128,0,0,179,0,0,179,0,0,179,0,0,128,0,0 +db 179,0,0,179,0,0,179,0,0,128 +db 0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,128,0,0,230,0,0,202,0,0,179,0,0,128,0,0 +db 230,0,0,202,0,0,179,0,0,128 +db 0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,128,0,0,128,0 +db 0,128,0,0,179,0,0,202,0,0,230,0,0,128,0,0 +db 230,0,0,202,0,0,179,0,0,128,0,0,128,0,0,128 +db 0,0,0 +db 0,0,128,0,0,179,0,0,179,0 +db 0,179,0,0,128,0,0,230,0,0,230,0,0,128,0,0 +db 230,0,0,230,0,0,128,0,0,179,0,0,179,0,0,179 +db 0,0,128 +db 0,0,128,0,0,179,0,0,202,0 +db 0,202,0,0,230,0,0,128,0,0,230,0,0,128,0,0 +db 230,0,0,128,0,0,230,0,0,202,0,0,202,0,0,179 +db 0,0,128 +db 0,0,128,0,0,179,0,0,230,0 +db 0,230,0,0,230,0,0,230,0,0,128,0,255,255,0,0 +db 128,0,0,230,0,0,230,0,0,230,0,0,230,0,0,179 +db 0,0,128 +db 0,0,0,0,0,128,0,0,128,0 +db 0,128,0,0,128,0,0,128,0,255,255,0,255,255,0,255 +db 255,0,0,128,0,0,128,0,0,128,0,0,128,0,0,128 +db 0,0,0,0,0,128,0,0,179,0,0,179,0 +db 0,179,0,0,179,0,0,179,0,0,128,0,255,255,0,0 +db 128,0,0,179,0,0,179,0,0,179,0,0,179,0,0,179 +db 0,0,128 +db 0,0,128,0,0,202,0,0,202,0 +db 0,202,0,0,202,0,0,128,0,0,179,0,0,128,0,0 +db 179,0,0,128,0,0,230,0,0,202,0,0,202,0,0,179 +db 0,0,128 +db 0,0,128,0,0,230,0,0,230,0 +db 0,230,0,0,128,0,0,202,0,0,179,0,0,128,0,0 +db 230,0,0,179,0,0,128,0,0,230,0,0,230,0,0,179 +db 0,0,128 +db 0,0,0,0,0,128,0,0,128,0 +db 0,128,0,0,230,0,0,202,0,0,179,0,0,128,0,0 +db 230,0,0,202,0,0,179,0,0,128,0,0,128,0,0,128 +db 0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,128,0,0,230,0,0,202,0,0,179,0,0,128,0,0 +db 230,0,0,202,0,0,179,0,0,128 +db 0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,128,0,0,230,0,0,230,0,0,179,0,0,128,0,0 +db 230,0,0,230,0,0,179,0,0,128 +db 0,0,0 +db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +db 0,0,0,0,128,0,0,128,0,0,128,0,0,0,0,0 +db 128,0,0,128,0,0,128,0,0,0,0,0,0,0,0,0 +db 0,0,0 \ No newline at end of file diff --git a/programs/network/icq/trunk/ki.asm b/programs/network/icq/trunk/ki.asm index bc25356167..0f5a65d5fe 100644 --- a/programs/network/icq/trunk/ki.asm +++ b/programs/network/icq/trunk/ki.asm @@ -1,45 +1,71 @@ -; <--- description ---> ; compiler: FASM 1.67.21 -; name: ICQ for Kolibri -; version: 0.01 +; name: ICQ client for Kolibri +; version: 0.1.30 ; written by: LV -; e-mail: lv4evil@ya.ru +; e-mail: lv4evil@yandex.ru -; <--- include all MeOS stuff ---> include "lang.inc" -include "../../../macros.inc" -purge mov +include "MACROS.INC" +;purge mov ;include "ASCL9/ascl.inc" ;include "debug.inc" -include "EDITBOX.INC" +include "editbox.inc" -; <--- start of MenuetOS application ---> MEOS_APP_START ;include "debug.inc" include "2000.inc" include "comp.inc" +;include "fsio.inc" +include "dos2win.inc" +include "parser.inc" +include "ssi.inc" use_edit_box procinfo,22,5 -; <--- start of code ---> +; +; Если == 0, код для использования контакт листа +; на сервере не ассемблируется +; +USE_SSI = 1 +; +; + CODE ;mov eax, 40 ;mov ebx, 47h ;int 40h + + ; + ; Загрузка конфигов + ; + + mov eax, fname + call parseconf + ; + ; Вывод загруженной информации + ; + + mov eax, cfg_message + xor ebx, ebx + call writemsg + + call showcfg + - call loaduin + ;call loaduin call draw_window ; at first create and draw the window ;call buttonbox wait_event: ; main cycle - mov eax, 23 - mov ebx, 20 - int 0x40 + ;mov eax, 23 + ;mov ebx, 20 + ;int 0x40 + mcall 23,20 cmp eax, 1 ; if event == 1 je redraw ; jump to redraw handler @@ -51,20 +77,16 @@ CODE ; ; Ждем данных ; - mov eax, 53 - mov ebx, 2 - push ecx - mov ecx, [socket] - int 0x40 - pop ecx + + mcall 53,2,[socket] cmp eax, 0 jnz read_socket mouse_edit_box inputbox ; ; Если есть соединение с сервером, посылаем пакеты - подтвеждения каждые 60 с - ; - call sendkeep + ; не требуется +; call sendkeep jmp wait_event ; else return to the start of main cycle @@ -74,11 +96,11 @@ CODE jmp wait_event - key: ; key event handler - mov eax, 2 ; get key code - int 0x40 + key: ; get key code + + mcall 2 - cmp ah, 0Dh ; Пробел - отправить сообщение + cmp ah, 0Dh ; Пробел - отправить сообщение jz send @@ -88,17 +110,18 @@ CODE button: ; button event handler - mov eax, 17 ; get button identifier - int 0x40 + ;mov eax, 17 ; get button identifier + ;int 0x40 + mcall 17 cmp ah, 2 - jz connect + jz connect cmp ah, 3 - jz disconnect + jz disconnect cmp ah, 4 - jz send + jz send ; ; Проверяем, не нажата ли кнопка в КЛ @@ -127,10 +150,16 @@ CODE pop eax mov ebx, NAME_LEN imul ebx, eax - lea eax, [names+ebx] - mov [buff+ecx], ' ' ; Пробел - lea ebx, [buff+ecx+1] + lea eax, [names + ebx] + mov [buff + ecx], ' ' ; Пробел + lea ebx, [buff + ecx + 1] mov ecx, NAME_LEN + ;debug + push ebx + mov ebx, NAME_LEN + call print_mem + pop ebx + ; call strcpy mov eax, buff xor ebx, ebx @@ -143,29 +172,15 @@ CODE cmp ah, 1 jne wait_event ; return if button id != 1 - or eax, -1 ; exit application - int 0x40 + ; exit application + mcall -1 draw_window: - mov eax, 12 ; start drawing - mov ebx, 1 - int 0x40 + ; start drawing + mcall 12,1 - mov eax, 0 ; create and draw the window - mov ebx, 100*65536+700 ; (window_cx)*65536+(window_sx) - mov ecx, 100*65536+500 ; (window_cy)*65536+(window_sy) - mov edx, 0x03ffffff ; work area color & window type 3 -; mov esi, 0 ; grab color (not used) -; mov edi, 0 ; frame color (not used) - int 0x40 - - mov eax, 4 ; window header - mov ebx, 8*65536+8 ; coordinates - mov ecx, 0x10ffffff ; color & font N1 - mov edx, header ; address of text - mov esi, header.size ; length of text - int 0x40 + mcall 0,(100*65536+700),(100*65536+500),0x14ffffff,0,head draw_edit_box inputbox @@ -175,13 +190,23 @@ CODE ;draw_button 600, 460, 60, 15, 3, 'Disconnect' draw_button 530, 460, 60, 15, 4, 'SEND' - call printbuff + call printbuff call buttonbox + + ; + ; Image + ; + ;mov eax, 7 + ;mov ebx, redicq + ;mov ecx, 15*65536+15 + ;mov edx, 100*65536+100 + ;int 40h + + - mov eax, 12 ; finish drawing - mov ebx, 2 - int 0x40 + ; finish drawing + mcall 12,2 ret @@ -189,10 +214,15 @@ CODE ; Соединение ; connect: - mov eax, ICQ_IP + lea eax, [vtable + vartable.icqip] + call ip_parser + call htonl + data_debug 'IP:', eax + + ;mov eax, ICQ_IP mov ebx, ICQ_PORT call srv_connect - ;call srv_login + jmp wait_event @@ -227,7 +257,7 @@ CODE ;cmp al, 20h ;jz sd_use_kl mov al, [inputbuff+3] - cmp al, 20h ; Пробел + cmp al, 20h ; Пробел jz sd_use_kl ; ; Ищем первый пробел, им должен закончиться уин @@ -238,7 +268,7 @@ CODE cmp al, 20h jz sd_space cmp al, 0 - jz wait_event + jz wait_event inc ecx jmp sd_loop @@ -259,7 +289,7 @@ CODE lea eax, [inputbuff+1] mov [inputbuff+3], byte 0 call ascitoint - lea eax, [eax-1] ; Т.к. в КЛ отсчет с 0 + lea eax, [eax-1] ; Т.к. в КЛ отсчет с 0 mov [curruser], al @@ -306,11 +336,12 @@ CODE cmp [hrf], 1 jz rs_head_recived - - mov eax, 53 - mov ebx, 2 - mov ecx, [socket] - int 40h + rs_check_sock: + ;mov eax, 53 + ;mov ebx, 2 + ;mov ecx, [socket] + ;int 40h + mcall 53,2,[socket] cmp eax, 6 ; Flap head size jc r_end ; @@ -320,10 +351,10 @@ CODE ;mov ecx, [socket] rs_loop: - mov eax, 53 - mov ebx, 3 - - int 40h + ;mov eax, 53 + ;mov ebx, 3 + ;int 40h + mcall 53,3,[socket] mov [mbuff+edx], bl inc edx @@ -365,10 +396,12 @@ CODE ; rs_head_recived: - mov eax, 53 - mov ebx, 2 + ;mov eax, 53 + ;mov ebx, 2 ;mov ecx, [socket] - int 40h + ;int 40h + mcall 53,2,[socket] + cmp ax, [rflap.wDs] ; Размер данных jc r_end ; @@ -390,9 +423,10 @@ CODE cmp edx, esi jz rs_data_end - mov eax, 53 - mov ebx, 3 - int 40h + ;mov eax, 53 + ;mov ebx, 3 + ;int 40h + mcall 53,3,[socket] mov [mbuff+edx], bl inc edx jmp rs_data_loop @@ -402,20 +436,25 @@ CODE ; rs_data_end: mov [hrf], 0 - write_debug 'Some data received' + ;write_debug 'Some data recived' ; ; ; cmp [login], 0 jz rs_login call main_loop - jmp r_end + ; + ; Есть смысл проверить сокет на наличие следующего заголовка + ; + ;jmp r_end + jmp rs_check_sock rs_login: call srv_login ;write_debug 'Exited srv_login' - jmp r_end + ;jmp r_end + jmp rs_check_sock rs_flap_error: write_debug 'Invalid Flap' @@ -432,10 +471,10 @@ CODE ; rs_big_flap: - write_debug 'Too BIG FLAP Received' + write_debug 'Too BIG FLAP Recived' mov [hrf], 0 - mov ecx, [socket] + ;mov ecx, [socket] mov ax, [rflap.wDs] xor esi, esi mov esi, eax @@ -445,9 +484,10 @@ CODE cmp edx, esi jz r_end - mov eax, 53 - mov ebx, 3 - int 40h + ;mov eax, 53 + ;mov ebx, 3 + ;int 40h + mcall 53,3,[socket] ;mov [mbuff+edx], bl inc edx jmp rs_data_loop2 @@ -465,71 +505,84 @@ CODE ; Соединение с сервером, возвращает в eax - хэндл сокета ; передаем в еах IP адрес сервера ; в ebx - порт - srv_connect: + srv_connect: push ecx push edx push esi push edi push ebx - mov esi, eax ; IP - в esi + mov esi, eax ; IP - в esi ; find free port mov ecx, 1000 ; Определяем локальный порт, начинаем с 1000 getlp: inc ecx push ecx - mov eax, 53 - mov ebx, 9 - int 0x40 + ;mov eax, 53 + ;mov ebx, 9 + ;int 0x40 + mcall 53,9,ecx pop ecx cmp eax, 0 ; этот локальный порт используется? jz getlp ; да - продолжаем перебирать ;OK ecx = port number ;Open Socket - mov eax, 53 - mov ebx, 5 + ;mov eax, 53 + ;mov ebx, 5 xor edx, edx ;mov dx, ICQ_PORT pop edx ;mov esi,ICQ_IP - mov edi, 1;SOCKET_ACTIVE + ;mov edi, 1;SOCKET_ACTIVE - int 040h + ;int 40h + mcall 53, 5, ecx, edx, esi, 1 ; mov [socket], eax + ; ; Ждем установки соедиения mov ecx, eax srv_loop: + + ;mov eax, 5 + ;mov ebx, 50 + ;int 40h + mcall 5, 50 + + - mov eax, 53 - mov ebx, 6 - int 40h + ;mov eax, 53 + ;mov ebx, 6 + ;int 40h + mcall 53, 6, ecx cmp eax, TCB_ESTABLISHED jz fin cmp eax, 11 - jae @f + jae c_end ; - mov eax, 5 - mov ebx, 50 - int 40h + + ;inc [timer] + ;cmp [timer], 50 + ;jz srv_err jmp srv_loop - + ;srv_err: + ;mov [timer], word 0 ;cmp eax,-1 ;jnz fin ;delay 100 - write_debug 'CONNECTION FAILED' ;Подключение не удалось - jmp @f + write_debug 'CONNECTION FAILED' ;Подключение не удалось + jmp c_end ;connrcted: ;CONNECTED fin: write_debug 'Connected!!!!' - @@: + c_end: pop edi pop esi pop edx @@ -540,8 +593,7 @@ CODE ; ; --> ecx socket handle ; - buff db 1024 dup 0 - lbuff db 8 dup 0 ; Для 1 пакета от сервера + srv_login: pushf push eax @@ -567,7 +619,7 @@ CODE cmp eax, 4 jnz l_len_err mov eax, dword [mbuff] - cmp eax, 01000000h ; 00 00 00 01 + cmp eax, 01000000h ; 00 00 00 01 jnz l_data_err ; ;Формируем пакет для соединения @@ -575,12 +627,13 @@ CODE ;mov [flap.bId], FLAP_ID mov [flap.bCh], NEW_CONNECTION - mov eax, 26 - mov ebx, 9 - int 40h + ;mov eax, 26 + ;mov ebx, 9 + ;int 40h + mcall 26, 9 mov [seq], ax - mov [flap.wSn], ax ; Sequence number + mov [flap.wSn], ax ; Sequence number ;mov [buff],0 ;mov [buff+1],0 ;mov [buff+2],0 @@ -588,41 +641,43 @@ CODE ;mov[buff+4],0 mov word [buff+4], 0x0100; TLV.TYPE = UIN 00 01 - mov eax, UIN + lea eax, [vtable + vartable.uin] call strlen mov [buff+6], ah mov [buff+7], al ; Length of UIN mov edx, eax - add edx, 7 ; в edx длина заполненного буфера + add edx, 7 ; в edx длина заполненного буфера - mov ecx, eax ;Длина строки + mov ecx, eax ;Длина строки - mov eax, UIN - lea ebx, [buff+8] ; + размер данных в буфере + 1 + lea eax, [vtable + vartable.uin] + lea ebx, [buff+8] ; + размер данных в буфере + 1 call strcpy - mov eax, PASS + lea eax, [vtable + vartable.pass] call roast mov [buff+edx+2], 2 ; TLV.TYPE - rosted password call strlen - mov word [buff+edx+4], ax ; Length of pass + mov [buff+edx+4], al + mov [buff+edx+3], ah ; Length of pass add edx, 4 mov ebx, buff - add ebx, edx ; назначение - add edx, eax ; Сохраняем в EDX длину заполненного буфнра - mov ecx, eax ; Длина строки - mov eax, PASS ; Источник + add ebx, edx ; назначение + add edx, eax ; Сохраняем в EDX длину заполненного буфнра + mov ecx, eax ; Длина строки + lea eax, [vtable + vartable.pass] ; Источник inc ebx call strcpy mov [buff+edx+2], 3 ; TLV.TYPE - client id string mov eax, ID_STRING call strlen - mov word [buff+edx+4], ax + mov [buff+edx+4], al + mov [buff+edx+3], ah add edx, 4 mov ecx, eax @@ -633,34 +688,48 @@ CODE mov eax, ID_STRING call strcpy + xor eax, eax + mov [buff+edx+2], 016h ; TLV.TYPE - Client id mov [buff+edx+4], 2 - mov word [buff+edx+6], ID_NUM + mov ax, ID_NUM + call htons + mov word [buff+edx+5], ax add edx, 6 mov [buff+edx+2], 017h ; Client major version mov [buff+edx+4], 2 - mov [buff+edx+6], MAJOR + mov ax, MAJOR + call htons + mov word [buff+edx+5], ax add edx, 6 mov [buff+edx+2], 018h ; Client minor version mov [buff+edx+4], 2 - mov [buff+edx+6], MINOR + mov ax, MINOR + call htons + mov word [buff+edx+5], ax add edx, 6 mov [buff+edx+2], 019h ; Client lesser version mov [buff+edx+4], 2 - mov [buff+edx+6], LESSER + mov ax, LESSER + call htons + mov word [buff+edx+5], ax add edx, 6 mov [buff+edx+2], 01Ah ; Client build number mov [buff+edx+4], 2 - mov word [buff+edx+6], BUILD + mov ax, BUILD + call htons + mov word [buff+edx+5], ax add edx, 6 mov [buff+edx+2], 014h ; Client distribution number mov [buff+edx+4], 4 - mov [buff+edx+8], DISTR + mov eax, DISTR + call htonl + mov dword [buff+edx+5], eax add edx, 8 mov [buff+edx+2], 0Fh ; Client language @@ -676,7 +745,7 @@ CODE mov eax, CL_LANG call strcpy - mov [buff+edx+2], 0Fh ; Client language + mov [buff+edx+2], 0Eh ; Client country mov eax, CL_COUNTRY call strlen mov word [buff+edx+4], ax @@ -716,7 +785,7 @@ CODE mov ebx, buff call sendflap cmp eax, 0 - jnz l_fin ; Неуспех + jnz l_fin ; Неуспех jmp l_end @@ -735,9 +804,9 @@ CODE uin_loop: xor eax, eax mov ax, word [mbuff+ebx] - cmp ax, 0100h ; 00 01 TLV.Type UIN - jz l_uin_ok ; Теперь сервер передает еще данные при соединении, а потом опять - add ebx, 5 ; тот же TLV 1 + cmp ax, 0100h ; 00 01 TLV.Type UIN + jz l_uin_ok ; Теперь сервер передает еще данные при соединении, а потом опять + add ebx, 5 ; тот же TLV 1 (новый формат пакекта) cmp ebx, 5 ja l_tlvt_err jmp uin_loop @@ -749,8 +818,8 @@ CODE l_uin_ok: mov eax, ebx xor ebx, ebx - mov bl, [mbuff+eax+3] ; - mov bh, [mbuff+eax+2] ; Длина данных + mov bl, [mbuff+eax+3] ; + mov bh, [mbuff+eax+2] ; Длина данных ; ; UIN Пока не проверяется ; @@ -758,9 +827,9 @@ CODE lea ebx, [ebx+eax+4] mov ax, word [mbuff+ebx] - cmp ax, 0500h ; 00 05 Bos address + cmp ax, 0500h ; 00 05 Bos address jz l_all_ok - cmp ax, 0400h ; UIN incorrect + cmp ax, 0400h ; UIN incorrect jz l_uin_err cmp ax, 0800h jz l_pass_err @@ -771,8 +840,8 @@ CODE l_all_ok: xor ecx, ecx - mov cl, [mbuff+ebx+3] ;length - mov ch, [mbuff+ebx+2] ; + mov cl, [mbuff+ebx+3] ;length + mov ch, [mbuff+ebx+2] ; lea eax, [mbuff+ebx+4] push ebx @@ -780,7 +849,7 @@ CODE call strcpy pop ebx add ebx, ecx - lea ebx, [ebx+4] ; Размер заголовка + lea ebx, [ebx+4] ; Размер заголовка ; ; cookie ; @@ -788,45 +857,46 @@ CODE xor eax, eax mov ax, word [mbuff+ebx] - cmp ax, 0600h ; TLV.Type cookie + cmp ax, 0600h ; TLV.Type cookie jnz l_tlvt_err - mov cl, [mbuff+ebx+3] ; - mov ch, [mbuff+ebx+2] ; Length + mov cl, [mbuff+ebx+3] ; + mov ch, [mbuff+ebx+2] ; Length mov [cookie_len], cx lea eax, [mbuff+ebx+4] push ebx mov ebx, srv_cookie call strcpy pop ebx - + ; ; Соединяемся с BOS ; ;call srv_disconnect mov ecx, [socket] - ;write_debug 'Closing socket' + write_debug 'Closing socket' ;call closesocket ; ; - ;mov eax, 53 - ;mov ebx, 8 - ;int 40h + ; + ;FIXME!!! + ;Закомменторовано из-за проблемы с сетевым стеком + ;закрытие сокета завешивает систему + ;mcall 53, 8, ecx - - + mov eax, bos_address call ip_parser call htonl data_debug 'BOS Address: ', eax data_debug 'BOS Port: ', ebx - mov [bos_ip], eax + mov [bos_ip], eax mov [bos_port], ebx call srv_connect - mov [login], 1 ; Соединение с основным сервером установлено + mov [login], 1 ; Соединение с основным сервером установлено ;mov [socket], eax - + jmp l_end @@ -846,7 +916,7 @@ CODE jmp l_fin l_len_err: - write_debug 'RECEIVED DATA LENGTH MISMATCH' + write_debug 'RECIVED DATA LENGTH MISMATCH' jmp l_fin l_tlvt_err: @@ -858,7 +928,7 @@ CODE jmp l_fin l_flap_err: - write_debug 'FLAP ID MISMATCH / RECEIVE ERROR' + write_debug 'FLAP ID MISMATCH / RECIVE ERROR' l_fin: @@ -866,14 +936,14 @@ CODE ; Необходимо закрыть сокет ; ;call srv_disconnect - ;call closesocket + call closesocket l_end: pop edx ;pop ecx pop ebx pop eax - popf - ret + popf + ret ; ; Length of string @@ -890,7 +960,7 @@ CODE loop_s: mov cl, [eax+ebx] cmp ecx,0 - jz nl + jz nl inc ebx jmp loop_s @@ -916,7 +986,7 @@ CODE loop_r: mov bl, [eax+ecx] ;Символ из массива пароля - cmp bl, 0 ;Конец строки + cmp bl, 0 ;Конец строки jz r_fin xor bl, [ROASTING_ARRAY+ecx] @@ -956,6 +1026,27 @@ CODE ret +; +; Макрос для сравнения строк +; +macro strcmp first, second, len +{ + push ecx + push esi + push edi + + mov ecx, len + mov esi, first + mov edi, second + repe cmpsb + + pop edi + pop esi + pop ecx + +} + + ; ; Заполняет буфер, по адресу в ebx ; данными, по адресу eax, в @@ -1005,56 +1096,59 @@ CODE xor edx, edx - mov dl, [eax] ; ID byte + mov dl, [eax] ; ID byte mov [sbuff], dl - mov dl, [eax+1] ; FLAP channel + mov dl, [eax+1] ; FLAP channel mov [sbuff+1], dl - mov dl, [eax+2] ; FLAP datagramm seq number - mov [sbuff+3], dl ; меняем местами байты для передачи по сети + mov dl, [eax+2] ; FLAP datagramm seq number + mov [sbuff+3], dl ; меняем местами байты для передачи по сети mov dl, [eax+3] mov [sbuff+2], dl - mov dl, [eax+4] ; FLAP data size + mov dl, [eax+4] ; FLAP data size mov [sbuff+5], dl mov dl, [eax+5] mov [sbuff+4], dl mov dx, word [eax+4] - xchg ecx, edx ; ecx - size edx - handle - mov eax, ebx ; data - mov ebx, sbuff ; dest - add ebx, 6 ; + header size + xchg ecx, edx ; ecx - size edx - handle + mov eax, ebx ; data + mov ebx, sbuff ; dest + add ebx, 6 ; + header size call strcpy - xchg ecx, edx ; ecx - handle, edx - data size + xchg ecx, edx ; ecx - handle, edx - data size s_wait: - mov eax, 53 ; Проверяем состояние сокета. Если соедиение - mov ebx, 6 ; установлено - посылаем буфер, если сокет закрыт, уходим - int 40h + ;mov eax, 53 ; Проверяем состояние сокета. Если соедиение + ;mov ebx, 6 ; установлено - посылаем буфер, если сокет закрыт, уходим + ;int 40h + mcall 53, 6, ecx cmp eax, TCB_ESTABLISHED ; установлено jz s_est cmp eax, TCB_CLOSED jz s_fin - cmp eax, 12 ; У меня такое было, когда соединение устанавливалось с пустотой :-) - jnc s_fin ; + cmp eax, 12 ; У меня такое было, когда соединение устанавливалось с пустотой :-) + jnc s_fin ; - mov eax, 5 - mov ebx, 1 - int 40h ; Ждем + ;mov eax, 5 + ;mov ebx, 1 + ;int 40h ; Ждем + mcall 5, 1 jmp s_wait s_est: - mov eax, 53 - mov ebx, 7 ; писать в сокет - ;xchg ecx, edx ; ecx - handle, edx - data length - add edx, 6 ; + size of header - mov esi, sbuff ; data - int 40h + ;mov eax, 53 + ;mov ebx, 7 ; писать в сокет + + add edx, 6 ; + size of header + ;mov esi, sbuff ; data + ;int 40h + mcall 53, 7, ecx, edx, sbuff s_fin: pop ecx @@ -1065,129 +1159,6 @@ CODE popf ret -; -; Принимает пакет из сокета -; eax - указатель на FLAP_head -; ebx - указатель на массив -; ecx - хендл сокета -; Возвращает в eax количество принятых байт в массиве -; -; recvflap: -; pushf -; -; ;push eax -; push ebx -; push esi -; push edi -; push edx -; mov esi, eax -; mov edi, ebx -; -; r_fail: -; mov eax, 53 ; Опрашивааем сокет -; mov ebx, 2 ; в eax количество полученных байт -; int 40h ; -; cmp eax, 6 ; буфер не пустой -; jnc r_ok -; -; mov eax, 53 ; Получаем состояние сокета -; mov ebx, 6 ; -; int 40h ; -; -; cmp eax, TCB_CLOSED ; закрыт - уходим -; jz r_err -; -; -; ;mov eax, 5 ; ждем -; ;mov ebx, 1 -; ;int 40h -; ; уходим -; -; ;jmp r_fail -; jmp rf_fin -; -; r_ok: ; В буфере данные -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi], bl ; flap.bId -; cmp bl, FLAP_ID -; jnz r_err -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi+1], bl ; flap.bCh -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi+3], bl ; flap.wSn старший байт -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi+2], bl ; flap.wSn младший байт -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi+5], bl ; flap.wDs старший байт -; -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [esi+4], bl ; flap.wDs младший байт -; -; r_check: -; mov eax, 53 ; Проверяем число полученных байт -; mov eax, 2 -; int 40h -; -; xor ebx, ebx -; mov bx, word [esi+4] ; flap.wDs -; cmp eax, ebx -; jnc r_drr ;>= -; -; mov eax, 68 ; wait -; mov ebx, 1 -; int 40h -; jmp r_check -; -; r_drr: ; ready for data recive -; -; -; xor edx, edx -; mov dx, word [esi+4] ; flap.wDs -; xor esi, esi -; -; rf_loop: -; mov eax, 53 -; mov ebx, 3 -; int 40h -; mov [edi+esi], bl -; inc esi -; cmp esi, edx -; jnz rf_loop -; mov eax, edx -; jmp rf_fin -; -; r_err: -; ;pop ebx -; ;pop eax -; mov eax, -1 -; jmp rf_fin -; -; -; rf_fin: -; pop edx -; pop edi -; pop esi -; pop ebx -; ;pop eax -; popf -; ret ; ; eax - указатель на буфер @@ -1251,15 +1222,16 @@ CODE ; closesocket: push eax - push ebx + ;push ebx - mov eax, 53 - mov ebx, 8 - int 40h + ;mov eax, 53 + ;mov ebx, 8 + ;int 40h + mcall 53, 8, ecx mov ecx, eax - pop ebx + ;pop ebx pop eax ret @@ -1273,7 +1245,7 @@ CODE push eax push ebx mov [flap.bId], FLAP_ID - mov [flap.bCh], 4 ;Disconnect + mov [flap.bCh], 4 ;Disconnect xor eax, eax mov ax, [seq] mov [flap.wSn], ax @@ -1304,7 +1276,7 @@ par_buff db 9 dup 0 xor ecx, ecx ;xor eax, eax - xor ebx, ebx + mov ebx, eax xor edx, edx xor esi, esi xor edi, edi @@ -1312,7 +1284,7 @@ par_buff db 9 dup 0 ip_loop: xor eax, eax ;xor edx, edx - mov al, [bos_address+ecx] + mov al, [ebx+ecx] cmp al, '.' jz ip_dot @@ -1339,34 +1311,34 @@ par_buff db 9 dup 0 ;data_debug 'Debug eax: ', eax - cmp ecx, 0 ; Не может начинаться с точки + cmp ecx, 0 ; Не может начинаться с точки jz ip_err - shl esi, 8 ; Сдвигаем предыдущий байт + shl esi, 8 ; Сдвигаем предыдущий байт add esi, eax inc ecx xor edx, edx ; Счетчик буфера = 0 jmp ip_loop - ip_colon: ; : В строке адреса - inc edi ; Было : + ip_colon: ; : В строке адреса + inc edi ; Было : jmp ip_dot ip_end_str: cmp edi, 1 jz @f - ; : Не было + ; : Не было mov [par_buff+edx], 0 ; Конец строки mov eax, par_buff call ascitoint - shl esi, 8 ; Сдвигаем предыдущий байт + shl esi, 8 ; Сдвигаем предыдущий байт add esi, eax ;mov eax, esi ; IP в 16 ричной форме - ;xor ebx, ebx ; Номера порта нет + xor ebx, ebx ; Номера порта нет jmp ip_end - @@: ; Было : - mov [par_buff+edx], 0 + @@: ; Было : + mov [par_buff+edx], 0 mov eax, par_buff call ascitoint mov ebx, eax @@ -1405,10 +1377,10 @@ par_buff db 9 dup 0 ati_loop: mov bl, [eax+ecx] - cmp bl, 0 ; Конец строки + cmp bl, 0 ; Конец строки jz ati_str_end cmp bl, 39h - ja ati_err ; Не цифра + ja ati_err ; Не цифра cmp bl, 30h jb ati_err @@ -1424,7 +1396,7 @@ par_buff db 9 dup 0 cmp edx, ecx jz ati_all push eax - sub eax, edx ; Вычесть счетчик + sub eax, edx ; Вычесть счетчик movzx ebx, byte [eax] ; В bl символ ;pop eax sub bl, 30h ; Вычисляем 10тичную цифру @@ -1492,50 +1464,50 @@ snac_buff db 1024 dup 0 push ebx push edx ;xor ebx, ebx - mov esi, ecx ; хендл сокета - mov edi, ebx ; Указатель на данные + mov esi, ecx ; хендл сокета + mov edi, ebx ; Указатель на данные xor ebx, ebx - mov bl, [eax] ; + mov bl, [eax] ; mov [snac_buff+1], bl ; Family ID - mov bl, [eax+1] ; Конвертируется в BigEndian + mov bl, [eax+1] ; Конвертируется в BigEndian mov [snac_buff], bl ; - mov bl, [eax+2] ; + mov bl, [eax+2] ; mov [snac_buff+3], bl ; Subtype ID - mov bl, [eax+3] ; + mov bl, [eax+3] ; mov [snac_buff+2], bl ; - mov bl, [eax+4] ; + mov bl, [eax+4] ; mov [snac_buff+5], bl ; - mov bl, [eax+5] ; Flags + mov bl, [eax+5] ; Flags mov [snac_buff+4], bl ; - mov bl, [eax+6] ; + mov bl, [eax+6] ; mov [snac_buff+9], bl ; - mov bl, [eax+7] ; + mov bl, [eax+7] ; mov [snac_buff+8], bl ; - mov bl, [eax+8] ; Reqest ID + mov bl, [eax+8] ; Reqest ID mov [snac_buff+7], bl ; - mov bl, [eax+9] ; + mov bl, [eax+9] ; mov [snac_buff+6], bl ; - lea ebx, [snac_buff+10] + lea ebx, [snac_buff+10] - mov eax, edi ; Указатель на данные + mov eax, edi ; Указатель на данные ;add ebx, 10 ; + размер заголовка SNAC - mov ecx, edx ; размер данных + mov ecx, edx ; размер данных call strcpy - mov ecx, esi ; Хендл сокета + mov ecx, esi ; Хендл сокета mov [flap.bId], FLAP_ID - mov [flap.bCh], 2 ; Канал для посылки SNAC + mov [flap.bCh], 2 ; Канал для посылки SNAC xor ebx, ebx - inc [seq] ; seq Увеличивается на 1 при каждой посылке + inc [seq] ; seq Увеличивается на 1 при каждой посылке mov bx, [seq] mov [flap.wSn], bx - add edx, 10 ; размер данных + размер заголовка SNAC + add edx, 10 ; размер данных + размер заголовка SNAC mov [flap.wDs], dx mov eax, flap mov ebx, snac_buff @@ -1594,21 +1566,21 @@ snac_buff db 1024 dup 0 ; xor ebx, ebx mov bl, [rflap.bCh] - cmp bl, 1 ; Установка соединения - jz m_login + cmp bl, 1 ; Установка соединения + jz m_login cmp bl, 2 - jz m_snac ; Получен SNAC + jz m_snac ; Получен SNAC cmp bl, 3 - jz m_flap_err ; FLAP-level error + jz m_flap_err ; FLAP-level error cmp bl, 4 - jz m_close_conn ; Закрытие соединения + jz m_close_conn ; Закрытие соединения cmp bl, 5 - jz m_keep_alive ; + jz m_keep_alive ; ; ; Обработка рассоединения ; m_close_conn: - write_debug 'Another Computer is Using YOUR UIN!' + write_debug 'Another Computer Use YOUR UIN!' call srv_disconnect call closesocket jmp m_fin @@ -1622,16 +1594,17 @@ snac_buff db 1024 dup 0 xor eax, eax mov al, [mbuff+3] cmp eax, 1 - jnz m_login_other ; Не подходит + jnz m_login_other ; Не подходит ; ; генерируем случайный seq ; Для этого берем время, прошедшее с момента запуска системы ; - mov eax, 26 - mov ebx, 9 - int 40h + ;mov eax, 26 + ;mov ebx, 9 + ;int 40h + mcall 26, 9 mov [seq], ax ; ; Отдаем серверу cookie @@ -1640,23 +1613,23 @@ snac_buff db 1024 dup 0 mov [flap.wSn], ax xor eax, eax mov ax, [cookie_len] - add eax, 8 ; TLV len + protocol version len + add eax, 8 ; TLV len + protocol version len mov [flap.wDs], ax mov dword [buff], 01000000h ; 00 00 00 01 Номер протокола - mov word [buff+4], 0600h ; 00 06 TLV.Type + mov word [buff+4], 0600h ; 00 06 TLV.Type mov ax, [cookie_len] - mov [buff+6], ah ; - mov [buff+7], al ; TLV.Length + mov [buff+6], ah ; + mov [buff+7], al ; TLV.Length - mov edx, ecx ; edx <-- socket handle + mov edx, ecx ; edx <-- socket handle - mov ecx, eax ; ecx <-- cookie len - mov eax, srv_cookie ; Src + mov ecx, eax ; ecx <-- cookie len + mov eax, srv_cookie ; Src lea ebx, [buff+8] call strcpy - mov ecx, edx ; ecx <-- socket handle + mov ecx, edx ; ecx <-- socket handle mov eax, flap mov ebx, buff call sendflap @@ -1692,19 +1665,19 @@ snac_buff db 1024 dup 0 mov dx, [rsnac.wSid] cmp bx, 1 - jz m_snac_1 ;Generic service controls + jz m_snac_1 ;Generic service controls cmp bx, 2 - jz m_snac_2 ;Location services + jz m_snac_2 ;Location services cmp bx, 3 - jz m_snac_3 ;Buddy List management service + jz m_snac_3 ;Buddy List management service cmp bx, 4 - jz m_snac_4 ;ICBM (messages) service + jz m_snac_4 ;ICBM (messages) service cmp bx, 9 - jz m_snac_9 ;Privacy management service + jz m_snac_9 ;Privacy management service cmp bx, 015h - jz m_snac_15 ;ICQ specific extensions service + jz m_snac_15 ;ICQ specific extensions service cmp bx, 013h - jz m_snac_13 ;Server Side Information (SSI) service + jz m_snac_13 ;Server Side Information (SSI) service jmp m_other_snac ; @@ -1727,7 +1700,7 @@ snac_buff db 1024 dup 0 ; ; Rate limits information response ; - m_snac_1_7: ; Отвечаем + m_snac_1_7: ; Отвечаем mov [ssnac.wFid], 1 ; Family mov [ssnac.wSid], 8 ; Subtype mov [ssnac.dRi], 8 @@ -1738,7 +1711,7 @@ snac_buff db 1024 dup 0 mov word [buff+8], 0500h ; 0005 mov eax, ssnac mov ebx, buff - mov edx, 10 ; Размер данных + mov edx, 10 ; Размер данных call sendsnac ; ; Client ask server location service limitations @@ -1762,7 +1735,7 @@ snac_buff db 1024 dup 0 ; ; - ; SNAC(01,17) + ; SNAC(01,17) ; Client ask for services version numbers ; mov [ssnac.wFid], 1 ; Family @@ -1771,9 +1744,9 @@ snac_buff db 1024 dup 0 ; ; Список сервисов, которые нам нужны ; - ; xx xx word family number #1 - ; xx xx word family version - ; ... ... ... + ; xx xx word family number #1 + ; xx xx word family version + ; ... ... ... ; ; @@ -1881,7 +1854,7 @@ snac_buff db 1024 dup 0 m_snac_1_other: - data_debug 'Unknown SNAC Family 1 received, type ', edx + data_debug 'Unknown SNAC Family 1 recived, type ', edx jmp m_fin @@ -1934,7 +1907,7 @@ snac_buff db 1024 dup 0 mov eax, ssnac mov ebx, buff - mov edx, C_LEN+4 ; Длина данных+размер заголовка TLV + mov edx, C_LEN+4 ; Длина данных+размер заголовка TLV call sendsnac ; @@ -1982,7 +1955,7 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 4 ; Family mov [ssnac.wSid], 4 ; Subtype - mov [ssnac.dRi], 4 ; request-id + mov [ssnac.dRi], 4 ; request-id mov eax, ssnac mov ebx, buff xor edx, edx @@ -1999,21 +1972,21 @@ snac_buff db 1024 dup 0 ; ; Из всей информации пока нужен только статус ; - xor edx, edx ; Счетчик + xor edx, edx ; Счетчик - номер UIN в массиве xor ecx, ecx xor eax, eax - cld ; В направлении увеличения адресов + cld ; В направлении увеличения адресов dec edx m_snac_3_b_loop: inc edx cmp edx, UINS - jnc m_snac_3_b_end ;>= + jnc m_snac_3_b_end ;>= - mov cl, [mbuff+10] ; Длина УИН + mov cl, [mbuff+10] ; Длина УИН mov eax, ecx mov edi, UIN_LEN - imul edi ,edx + imul edi, edx lea edi, [uins+edi] lea esi, [mbuff+11] repe cmpsb @@ -2023,34 +1996,79 @@ snac_buff db 1024 dup 0 ; UIN Определен ; - lea ecx, [eax+10+11] ; +sizeof SNAC_head + offset #2 TLV - mov ax, word [mbuff+ecx] ;#2 TLV.Type - cmp ax, 0C00h ;dc info (optional) - jz m_snac_3_b_dc - cmp ax, 0A00h ;external ip address - jz m_snac_3_b_extip - jmp m_snac_3_b_bad_tlv + ; + ; Найти TLV со статусом + ; сохранять edx + + xor esi, esi ; Счетчик TLV + + xor ecx, ecx + mov ch, byte [mbuff + eax + 13] ; Кол-во TLV в цепочке + mov cl, byte [mbuff + eax + 14] ; + + lea eax, [eax + 10 + 5] ; eax указатель на цепочку TLV + lea eax, [mbuff + eax] ; + + + m_snac_3_b_next_tlv: + cmp esi, ecx + jz m_snac_3_b_endchain + + + xor ebx, ebx + mov bh, [eax] ; + mov bl, [eax + 1] ; TLV.Type + + data_debug 'TLV type', ebx + + cmp ebx, 0x06 ;TLV.Type(0x06) - user status + jz m_snac_3_b_status + + ; + ; Разбираем цепочку дальше + ; + + get_next_tlv + inc esi + jmp m_snac_3_b_next_tlv + + + + ; FIXME Неоптимально - код будет удален + ; + ;lea ecx, [eax+10+11] ; +sizeof SNAC_head + offset #2 TLV + ;mov ax, word [mbuff+ecx] ;#2 TLV.Type + ;cmp ax, 0C00h ;dc info (optional) + ;jz m_snac_3_b_dc + ;cmp ax, 0A00h ;external ip address + ;jz m_snac_3_b_extip + ;jmp m_snac_3_b_bad_tlv - m_snac_3_b_dc: + ;m_snac_3_b_dc: ; ; Пропускаем этот TLV ; - lea ecx, [ecx+41] - m_snac_3_b_extip: + ;lea ecx, [ecx+41] + ;m_snac_3_b_extip: ; ; И этот :-) - lea ecx, [ecx+8] - mov ax, word [mbuff+ecx] - cmp ax, 0600h ;TLV.Type(0x0A) - external ip address - jz m_snac_3_b_status - jmp m_snac_3_b_bad_tlv + ;lea ecx, [ecx+8] + ;mov ax, word [mbuff+ecx] + ;cmp ax, 0600h ;TLV.Type(0x0A) - external ip address + ;jz m_snac_3_b_status + ;jmp m_snac_3_b_bad_tlv + ; + ; + m_snac_3_b_status: ; - ; наконец-то статус 8-) + ; статус ; - mov eax, dword [mbuff+ecx+4] + mov ecx, eax + mov eax, dword [ecx + 4] + ;mov eax, dword [mbuff+ecx+4] call ntohl ;mov ebx, 4 ;imul ebx, edx @@ -2072,6 +2090,9 @@ snac_buff db 1024 dup 0 write_debug 'UIN not in local Contact List' jmp m_fin + m_snac_3_b_endchain: + jmp m_fin + m_snac_3_c: @@ -2085,9 +2106,9 @@ snac_buff db 1024 dup 0 m_snac_3_c_loop: inc edx cmp edx, UINS - jnc m_snac_3_b_end ;>= + jnc m_snac_3_b_end ;>= - mov cl, [mbuff+10] ; Длина УИН + mov cl, [mbuff+10] ; Длина УИН mov edi, UIN_LEN imul edi ,edx lea edi, [uins+edi] @@ -2115,7 +2136,7 @@ snac_buff db 1024 dup 0 m_snac_3_other: - write_debug 'Unknown SNAC Family 3 Received' + write_debug 'Unknown SNAC Family 3 Recived' jmp m_fin @@ -2142,7 +2163,7 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 4 ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id mov eax, ICBM_PARAMS mov ebx, buff @@ -2161,7 +2182,7 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 9 ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id mov eax, ssnac mov ebx, buff xor edx, edx @@ -2178,9 +2199,9 @@ snac_buff db 1024 dup 0 ; Определяем тип сообщения по полю message channel ; xor eax, eax - mov ax, word [mbuff+10+8] ; +10 - размер SNAC - ; +8 смещение до message channel - cmp ax, 0100h ; 00 01 + mov ax, word [mbuff+10+8] ; +10 - размер SNAC + ; +8 смещение до message channel + cmp ax, 0100h ; 00 01 jz m_snac_ch1 cmp ax, 0200h jz m_snac_ch2 @@ -2195,42 +2216,42 @@ snac_buff db 1024 dup 0 ; Т.к в очередной раз описание протокола не совпадает с реальностью ; разбираем все TLV по порядку - mov eax, dword [mbuff+10] ; cookie + mov eax, dword [mbuff+10] ; cookie mov [msg_cookie1], eax mov eax, dword [mbuff+10+4] - mov [msg_cookie2], eax ; Используются для потверждения приема сообщений + mov [msg_cookie2], eax ; Используются для потверждения приема сообщений - mov al, [mbuff+10+10] ; Sender UIN length + mov al, [mbuff+10+10] ; Sender UIN length mov [ui.bUinLength], al push ecx movzx ecx, al - lea eax, [mbuff+10+11] ; UIN string - lea ebx, [ui.bUin] ; Dest + lea eax, [mbuff+10+11] ; UIN string + lea ebx, [ui.bUin] ; Dest call strcpy - lea ecx, [ecx+10+15] ; первый TLV + lea ecx, [ecx+10+15] ; первый TLV m_snac_ch1_loop: movzx eax, word [mbuff+ecx] - cmp eax, 0100h ;TLV.Type(0x01) - user class + cmp eax, 0100h ;TLV.Type(0x01) - user class jz m_snac_ch1_1 - cmp eax, 0600h ;TLV.Type(0x06) - user status + cmp eax, 0600h ;TLV.Type(0x06) - user status jz m_snac_ch1_6 - cmp eax, 0800h ; Unknown type + cmp eax, 0800h ; Unknown type jz m_snac_ch1_8 - cmp eax, 0500h ; Unknown type + cmp eax, 0500h ; Unknown type jz m_snac_ch1_5 - cmp eax, 0F00h ; TLV.Type(0x0f) - user idle time + cmp eax, 0F00h ; TLV.Type(0x0f) - user idle time jz m_snac_ch1_f - cmp eax, 0300h ; TLV.Type(0x03) - account creation time + cmp eax, 0300h ; TLV.Type(0x03) - account creation time jz m_snac_ch1_3 - cmp eax, 0400h ; TLV.Type(0x04) - automated response flag + cmp eax, 0400h ; TLV.Type(0x04) - automated response flag jz m_snac_ch1_4 - cmp eax, 0200h ; TLV.Type(0x02) - message data + cmp eax, 0200h ; TLV.Type(0x02) - message data jz m_snac_ch1_mess jmp m_snac_msg_tlv_err @@ -2239,19 +2260,19 @@ snac_buff db 1024 dup 0 ; но пока нет m_snac_ch1_1: - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] jmp m_snac_ch1_loop m_snac_ch1_6: - mov eax, dword [mbuff+ecx+4] ; User status + mov eax, dword [mbuff+ecx+4] ; User status call ntohl mov [ui.dUserStatus], eax - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] ; @@ -2261,25 +2282,25 @@ snac_buff db 1024 dup 0 jmp m_snac_ch1_loop m_snac_ch1_8: - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] jmp m_snac_ch1_loop m_snac_ch1_5: - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] jmp m_snac_ch1_loop m_snac_ch1_f: - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] jmp m_snac_ch1_loop m_snac_ch1_3: - movzx eax, word [mbuff+ecx+2] ; TLV.Length + movzx eax, word [mbuff+ecx+2] ; TLV.Length call ntohs lea ecx, [eax+ecx+4] jmp m_snac_ch1_loop @@ -2296,24 +2317,24 @@ snac_buff db 1024 dup 0 ; ; movzx eax, word [mbuff+ecx+4] ; - cmp eax, 0105h ; 05 fragment identifier (array of required capabilities) - jnz m_snac_ch1_fr_err ; 01 fragment version + cmp eax, 0105h ; 05 fragment identifier (array of required capabilities) + jnz m_snac_ch1_fr_err ; 01 fragment version movzx eax, word [mbuff+ecx+6] ; Length call ntohs - lea ecx, [ecx+eax+8] ; Пропускаем byte array of required capabilities (1 - text) + lea ecx, [ecx+eax+8] ; Пропускаем byte array of required capabilities (1 - text) - movzx eax, word [mbuff+ecx] ; fragment identifier (message text) - cmp eax, 0101h ; fragment version + movzx eax, word [mbuff+ecx] ; fragment identifier (message text) + cmp eax, 0101h ; fragment version jnz m_snac_ch1_fr_err movzx eax, word [mbuff+ecx+2] ; TLV Length call ntohs xchg eax, ecx - lea eax, [eax+8] ; Начало текстового сообщения - lea ecx, [ecx-4] ; - sizeof Message charset number, Message charset subset + lea eax, [eax+8] ; Начало текстового сообщения + lea ecx, [ecx-4] ; - sizeof Message charset number, Message charset subset push eax push ecx @@ -2330,12 +2351,66 @@ snac_buff db 1024 dup 0 mov ebx, buff call strcpy - lea ebx, [ebx+ecx] + lea ebx, [ebx + ecx] + + ; + ; Неплохо было бы вывести не UIN а Nickname, если он есть в контакт листе + ; + xor esi, esi ; Счетчик + + m_snac_ch1_next_uin: + + cmp esi, UINS + jz m_snac_ch1_notfound + + mov edx, UIN_LEN + imul edx, esi + + lea edx, [uins + edx] + movzx ecx, byte [ui.bUinLength] + strcmp edx, ui.bUin, ecx + jz m_snac_ch1_uin + + inc esi + jmp m_snac_ch1_next_uin + + + ; + ; Подходящий UIN есть в контакт-листе + ; + m_snac_ch1_uin: + + mov edx, NAME_LEN + imul edx, esi + + lea edx, [names + edx] + mov eax, edx + + + call strlen + mov ecx, eax + + mov eax, edx + call strcpy + + jmp m_snac_ch1_msgfrom + + + ; + ; Если подходящего UIN нет в контакт-листе + ; + m_snac_ch1_notfound: + lea eax, [ui.bUin] movzx ecx, byte [ui.bUinLength] call strcpy - mov [ebx+ecx], byte 0 + ; + ; Вывод сообщения "от кого" + ; + m_snac_ch1_msgfrom: + + mov [ebx + ecx], byte 0 mov eax, buff xor ebx, ebx @@ -2394,14 +2469,14 @@ snac_buff db 1024 dup 0 mov eax, dword [mbuff+10+4] mov [msg_cookie2], eax - mov al, [mbuff+10+10] ; Sender UIN length + mov al, [mbuff+10+10] ; Sender UIN length mov [ui.bUinLength], al push ecx movzx ecx, al - lea eax, [mbuff+10+11] ; UIN string - lea ebx, [ui.bUin] ; Dest + lea eax, [mbuff+10+11] ; UIN string + lea ebx, [ui.bUin] ; Dest call strcpy @@ -2413,7 +2488,7 @@ snac_buff db 1024 dup 0 mov dword [buff], eax mov eax, [msg_cookie2] mov dword [buff+4], eax - mov word [buff+8], 0200h ; Channel 2 + mov word [buff+8], 0200h ; Channel 2 mov al, [ui.bUinLength] mov [buff+10], al @@ -2422,7 +2497,7 @@ snac_buff db 1024 dup 0 call strcpy lea ecx, [ecx+11] - mov word [buff+ecx], 0100h ; reason code (1 - unsupported channel, 2 - busted payload, 3 - channel specific) + mov word [buff+ecx], 0100h ; reason code (1 - unsupported channel, 2 - busted payload, 3 - channel specific) mov edx, ecx pop ecx @@ -2447,7 +2522,7 @@ snac_buff db 1024 dup 0 m_snac_4_other: - write_debug 'Unknown SNAC Family 4 received' + write_debug 'Unknown SNAC Family 4 recived' jmp m_fin @@ -2467,6 +2542,26 @@ snac_buff db 1024 dup 0 ; ; Обработки пока нет ; + if USE_SSI <> 0 + + ; + ; Запрос КЛ с сервера + ; + + ; + ; Request contact list (first time) + ; + mov [ssnac.wFid], 13h ; Family + mov [ssnac.wSid], 04h ; Subtype + mov [ssnac.dRi], 04h ; request-id + + mov eax, ssnac + mov ebx, buff + xor edx, edx + call sendsnac + + + else ; Отключено, тк не поддерживается SIQ @@ -2496,7 +2591,7 @@ snac_buff db 1024 dup 0 mov eax, ssnac mov ebx, buff - xor edx, edx ; TLV head len + xor edx, edx ; TLV head len call sendsnac @@ -2507,10 +2602,10 @@ snac_buff db 1024 dup 0 mov [ssnac.wSid], 1Eh ; Subtype mov [ssnac.dRi], 1Eh ; request-id - mov [buff], 0 ; TLV type 06 - mov [buff+1], 6h ; - mov [buff+2], 0 ; TLV data length - mov [buff+3], 4 ; + mov [buff], 0 ; TLV type 06 + mov [buff+1], 6h ; + mov [buff+2], 0 ; TLV data length + mov [buff+3], 4 ; ; ; mov ax, STATUS_DCDISABLED ; DC disabled @@ -2522,7 +2617,7 @@ snac_buff db 1024 dup 0 mov eax, ssnac mov ebx, buff - mov edx, 8 ; TLV head len+ data len + mov edx, 8 ; TLV head len+ data len call sendsnac @@ -2546,32 +2641,32 @@ snac_buff db 1024 dup 0 ; ; В &RQ Есть пакет установки разрешений. я использую его без изменения ; т.к. не знаю, что он содержит - ; + ; - возможно, буду использовать позднее - mov [ssnac.wFid], 15 ; Family - mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 + ;mov [ssnac.wFid], 15 ; Family + ;mov [ssnac.wSid], 2 ; Subtype + ;mov [ssnac.dRi], 2 - mov word [buff], 0100h ; 00 01 encapsulated META_DATA - mov word [buff+2], 1000h ; 00 10 Len - mov word [buff+4], 000Eh ; LE Len - mov word [buff+10], 07D0h ; META_DATA_REQ + ;mov word [buff], 0100h ; 00 01 encapsulated META_DATA + ;mov word [buff+2], 1000h ; 00 10 Len + ;mov word [buff+4], 000Eh ; LE Len + ;mov word [buff+10], 07D0h ; META_DATA_REQ - mov eax, UIN - call ascitoint - mov dword [buff+6], eax + ;mov eax, UIN + ;call ascitoint + ;mov dword [buff+6], eax - mov word [buff+12], 0102h ; request sequence number (incrementing) - mov word [buff+14], 0424h ; META_SET_PERMS_USERINFO - mov [buff+16], 1 ; authorization (1-required, 0-not required) - mov [buff+17], byte 0 ; webaware (0-no, 1-yes) - mov [buff+18], 1 ; dc_perms (0-any, 1-contact, 2-authorization) - mov [buff+19], 0 ;unknown + ;mov word [buff+12], 0102h ; request sequence number (incrementing) + ;mov word [buff+14], 0424h ; META_SET_PERMS_USERINFO + ;mov [buff+16], 1 ; authorization (1-required, 0-not required) + ;mov [buff+17], byte 0 ; webaware (0-no, 1-yes) + ;mov [buff+18], 1 ; dc_perms (0-any, 1-contact, 2-authorization) + ;mov [buff+19], 0 ;unknown - mov eax, ssnac - mov ebx, buff - mov edx, 20 + ;mov eax, ssnac + ;mov ebx, buff + ;mov edx, 20 ; @@ -2579,7 +2674,7 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 1 ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id mov eax, FAMILY_ARR mov ebx, buff @@ -2599,17 +2694,17 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 15h ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id - mov word [buff], 0100h ; TLV type 01 - mov word [buff+2], 0A00h ; 00 0a Длина - mov word [buff+4], 0008h ; 08 00 - mov eax, UIN + mov word [buff], 0100h ; TLV type 01 + mov word [buff+2], 0A00h ; 00 0a Длина + mov word [buff+4], 0008h ; 08 00 + lea eax, [vtable + vartable.uin] call ascitoint mov dword [buff+6], eax - mov [buff+10], 003Ch ; 3C 00 - Запрос на оффлайновые сообщения - mov [buff+12], 0002 ; 02 00 - request sequence number + mov word [buff+10], 003Ch ; 3C 00 - Запрос на оффлайновые сообщения + mov word [buff+12], 0002 ; 02 00 - request sequence number mov edx, 14 ; Общий размер данных в буфере @@ -2628,10 +2723,13 @@ snac_buff db 1024 dup 0 ; mov [login], 2 + + end if ; USE_SSI = 0 + jmp m_fin m_snac_9_other: - write_debug 'Unknown SNAC Family 9 Received' + write_debug 'Unknown SNAC Family 9 Recived' jmp m_fin @@ -2641,6 +2739,8 @@ snac_buff db 1024 dup 0 m_snac_13: cmp dx, 3 jz m_snac_13_3 + cmp dx, 6 + jz m_snac_13_6 cmp dx, 0fh jz m_snac_13_F @@ -2655,20 +2755,23 @@ snac_buff db 1024 dup 0 ; ; - ; SNAC(13,05) Client check if its local SSI copy is up-to-date + ; SNAC(13,05) Client check if its local SSI copy is up-to-date ; mov [ssnac.wFid], 13h ; Family mov [ssnac.wSid], 5 ; Subtype - mov [ssnac.dRi], 5 ; request-id + mov [ssnac.dRi], 5 ; request-id mov eax, ssnac - ; 3D E7 48 17 - mov [buff], 03Dh ; - mov [buff+1], 0E7h ; modification date/time of client local SSI copy - mov [buff+2], 48h ; - mov [buff+3], 17h ; - ; 00 10 - mov [buff+4], 00 ; - mov [buff+5], 10h ; number of items in client local SSI copy + ; + ; + ; + mov [buff], 03Dh ; + mov [buff+1], 0E7h ; modification date/time of client local SSI copy + mov [buff+2], 48h ; + mov [buff+3], 17h ; + ; + ; + mov [buff+4], 00 ; + mov [buff+5], 00h ; number of items in client local SSI copy mov ebx, buff mov edx, 5 @@ -2676,29 +2779,46 @@ snac_buff db 1024 dup 0 jmp m_fin - ; - ; Server tell client its local copy up-to-date - ; - m_snac_13_F: - ; - ; Обработки нет - ; ; - ; Client activates server SSI data + ; Server contact list reply ; + m_snac_13_6: + + lea eax, [mbuff+10] ; В eax загружаем адрес приемного буфера+ размер заголовка snac + + call ssi_process_data ; Обработка пакета с КЛ + + ; + ; Активируем SSI + ; + mov [ssnac.wFid], 13h ; Family mov [ssnac.wSid], 7 ; Subtype - mov [ssnac.dRi], 7 ; request-id + mov [ssnac.dRi], 7 ; request-id mov eax, ssnac mov ebx, buff xor edx, edx call sendsnac + ; ; последняя стадия соединения ; + ; + ; Запрашиваем свою информацию + ; + mov [ssnac.wFid], 1 ; Family + mov [ssnac.wSid], 0Eh ; Subtype + mov [ssnac.dRi], 0Eh ; request-id + + mov eax, ssnac + mov ebx, buff + xor edx, edx ; TLV head len + call sendsnac + + ; ; Client sends its DC info and status to server ; @@ -2706,10 +2826,10 @@ snac_buff db 1024 dup 0 mov [ssnac.wSid], 1Eh ; Subtype mov [ssnac.dRi], 1Eh ; request-id - mov [buff], 0 ; TLV type 06 - mov [buff+1], 6h ; - mov [buff+2], 0 ; TLV data length - mov [buff+3], 4 ; + mov [buff], 0 ; TLV type 06 + mov [buff+1], 6h ; + mov [buff+2], 0 ; TLV data length + mov [buff+3], 4 ; ; ; mov ax, STATUS_DCDISABLED ; DC disabled @@ -2721,15 +2841,64 @@ snac_buff db 1024 dup 0 mov eax, ssnac mov ebx, buff - mov edx, 8 ; TLV head len+ data len + mov edx, 8 ; TLV head len+ data len call sendsnac + + ; + ; Выгружаем на сервер КЛ + ; FIXME Возможно, здесь не нужна эта функция + ;call uploadkl + + ; + ; Выгружаем инвизибл лист, пока пустой + ; + ;mov [ssnac.wFid], 9 ; Family + ;mov [ssnac.wSid], 7 ; Subtype + ;mov [ssnac.dRi], 7 + + ;mov eax, ssnac + ;mov ebx, buff + ;xor edx, edx + ;call sendsnac + + ; + ; В &RQ Есть пакет установки разрешений. я использую его без изменения + ; т.к. не знаю, что он содержит + ; - возможно, буду использовать позднее + + ;mov [ssnac.wFid], 15 ; Family + ;mov [ssnac.wSid], 2 ; Subtype + ;mov [ssnac.dRi], 2 + + ;mov word [buff], 0100h ; 00 01 encapsulated META_DATA + ;mov word [buff+2], 1000h ; 00 10 Len + ;mov word [buff+4], 000Eh ; LE Len + ;mov word [buff+10], 07D0h ; META_DATA_REQ + + + ;mov eax, UIN + ;call ascitoint + ;mov dword [buff+6], eax + + ;mov word [buff+12], 0102h ; request sequence number (incrementing) + ;mov word [buff+14], 0424h ; META_SET_PERMS_USERINFO + ;mov [buff+16], 1 ; authorization (1-required, 0-not required) + ;mov [buff+17], byte 0 ; webaware (0-no, 1-yes) + ;mov [buff+18], 1 ; dc_perms (0-any, 1-contact, 2-authorization) + ;mov [buff+19], 0 ;unknown + + ;mov eax, ssnac + ;mov ebx, buff + ;mov edx, 20 + + ; ; Client READY command ; mov [ssnac.wFid], 1 ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id mov eax, FAMILY_ARR mov ebx, buff @@ -2749,12 +2918,121 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 15h ; Family mov [ssnac.wSid], 2 ; Subtype - mov [ssnac.dRi], 2 ; request-id + mov [ssnac.dRi], 2 ; request-id - mov word [buff], 0100h ; TLV type 01 - mov word [buff+2], 0A00h ; 00 0a Длина - mov word [buff+4], 0008h ; 08 00 - mov eax, UIN + mov word [buff], 0100h ; TLV type 01 + mov word [buff+2], 0A00h ; 00 0a Длина + mov word [buff+4], 0008h ; 08 00 + lea eax, [vtable + vartable.uin] + call ascitoint + mov dword [buff+6], eax + + mov word [buff+10], 003Ch ; 3C 00 - Запрос на оффлайновые сообщения + mov word [buff+12], 0002 ; 02 00 - request sequence number + + mov edx, 14 ; Общий размер данных в буфере + + mov eax, ssnac + mov ebx, buff + call sendsnac + + + + ; + ; Запрашиваем информацию всех UIN + ; FIXME Возможно, здесь не нужна эта функция + ;call getinfo + ; + ; завершено соединение + ; + mov [login], 2 + + + jmp m_fin + + + + + ; + ; Server tell client its local copy up-to-date + ; + m_snac_13_F: + ; + ; Обработки нет + ; + + ; + ; Client activates server SSI data + ; + mov [ssnac.wFid], 13h ; Family + mov [ssnac.wSid], 7 ; Subtype + mov [ssnac.dRi], 7 ; request-id + mov eax, ssnac + mov ebx, buff + xor edx, edx + call sendsnac + + ; + ; последняя стадия соединения + ; + + ; + ; Client sends its DC info and status to server + ; + mov [ssnac.wFid], 1 ; Family + mov [ssnac.wSid], 1Eh ; Subtype + mov [ssnac.dRi], 1Eh ; request-id + + mov [buff], 0 ; TLV type 06 + mov [buff+1], 6h ; + mov [buff+2], 0 ; TLV data length + mov [buff+3], 4 ; + ; + ; + mov ax, STATUS_DCDISABLED ; DC disabled + call htons + mov word [buff+4], ax + ; + ; + mov ax, [status] + mov word [buff+6], ax + + mov eax, ssnac + mov ebx, buff + mov edx, 8 ; TLV head len+ data len + call sendsnac + + ; + ; Client READY command + ; + mov [ssnac.wFid], 1 ; Family + mov [ssnac.wSid], 2 ; Subtype + mov [ssnac.dRi], 2 ; request-id + + mov eax, FAMILY_ARR + mov ebx, buff + push ecx + mov ecx, FA_LEN + call strcpy + pop ecx + + mov eax, ssnac + mov ebx, buff + mov edx, FA_LEN + call sendsnac + + + ; + ; Запрашиваем offline сообщения + ; + mov [ssnac.wFid], 15h ; Family + mov [ssnac.wSid], 2 ; Subtype + mov [ssnac.dRi], 2 ; request-id + + mov word [buff], 0100h ; TLV type 01 + mov word [buff+2], 0A00h ; 00 0a Длина + mov word [buff+4], 0008h ; 08 00 + lea eax, [vtable + vartable.uin] call ascitoint mov dword [buff+6], eax @@ -2772,7 +3050,7 @@ snac_buff db 1024 dup 0 jmp m_fin m_snac_13_other: - write_debug 'Unknown SNAC Family 13 Received' + write_debug 'Unknown SNAC Family 13 Recived' jmp m_fin @@ -2802,13 +3080,13 @@ snac_buff db 1024 dup 0 xor eax, eax mov ax, word [mbuff+10] ; + SNAC.head size - cmp ax, 0100h ; 00 01 TLV type + cmp ax, 0100h ; 00 01 TLV type jnz m_snac_tlv_err mov ax, word [mbuff+10+10] - cmp ax, 0041h ; Offline Message + cmp ax, 0041h ; Offline Message jz m_snac_offline_mes - cmp ax, 0042h ; End messages + cmp ax, 0042h ; End messages jz m_snac_offline_end cmp ax, 07DAh jz m_snac_meta_data @@ -2818,24 +3096,24 @@ snac_buff db 1024 dup 0 jmp m_fin m_snac_offline_mes: - mov eax, MESS ; - call strlen ; Выводим строку с сообщением о отправителе и времени отправки - push ecx ; - mov ecx, eax ; + mov eax, MESS ; + call strlen ; Выводим строку с сообщением о отправителе и времени отправки + push ecx ; + mov ecx, eax ; mov eax, MESS mov ebx, buff call strcpy - mov eax, dword [mbuff+14+10] ; Sender UIN - lea ebx, [buff+ecx] ; После строчки о сообщении + mov eax, dword [mbuff+14+10] ; Sender UIN + lea ebx, [buff+ecx] ; После строчки о сообщении call int2strd lea ebx, [ebx+eax] mov [ebx], byte ' ' inc ebx - ; + Длина UIN - movzx eax, byte [mbuff+21+10] ; Day + ; + Длина UIN + movzx eax, byte [mbuff+21+10] ; Day call int2strd lea ebx, [ebx+eax] @@ -2843,34 +3121,34 @@ snac_buff db 1024 dup 0 inc ebx - movzx eax, byte [mbuff+20+10] ;Mounth + movzx eax, byte [mbuff+20+10] ;Mounth call int2strd lea ebx, [ebx+eax] mov [ebx], byte ' ' inc ebx - movzx eax, [mbuff+22+10] ; Hour + movzx eax, [mbuff+22+10] ; Hour call int2strd lea ebx, [ebx+eax] mov [ebx], byte ':' inc ebx - movzx eax, [mbuff+23+10] ; Minute + movzx eax, [mbuff+23+10] ; Minute call int2strd lea ebx, [ebx+eax] ;mov [ebx], byte ' ' ;inc ebx - mov [ebx], byte 0 ; Str end + mov [ebx], byte 0 ; Str end mov eax, buff xor ebx, ebx call writemsg - movzx ecx, word [mbuff+26+10] ; Длина соообщения + movzx ecx, word [mbuff+26+10] ; Длина соообщения lea eax, [mbuff+28+10] mov ebx, buff call strcpy @@ -2878,9 +3156,9 @@ snac_buff db 1024 dup 0 mov [ebx+ecx], byte 0 mov eax, buff - call win2dos ;перекодируем + call win2dos ;перекодируем - mov ebx, 00FF0000h ;Цвет + mov ebx, 00FF0000h ;Цвет call writemsg @@ -2898,16 +3176,16 @@ snac_buff db 1024 dup 0 mov [ssnac.wSid], 2 ; Subtype mov [ssnac.dRi], 0602h ; request-id - mov word [buff], 0100h ; 00 01 TLV.Type(1) - encapsulated META_DATA1 - mov word [buff+2], 0A00h ; 00 0A TLV.Length - mov word [buff+4], 0008h ; 08 00 data chunk size (TLV.Length-2) - mov eax, UIN + mov word [buff], 0100h ; 00 01 TLV.Type(1) - encapsulated META_DATA1 + mov word [buff+2], 0A00h ; 00 0A TLV.Length + mov word [buff+4], 0008h ; 08 00 data chunk size (TLV.Length-2) + lea eax, [vtable + vartable.uin] call ascitoint mov dword [buff+6], eax ; xx xx xx xx (LE) client uin - mov word [buff+10], 003Eh ; 3E 00 (LE) data type: delete offline msgs request cmd - mov word [buff+12], 0007h ; xx xx (LE) request sequence number + mov word [buff+10], 003Eh ; 3E 00 (LE) data type: delete offline msgs request cmd + mov word [buff+12], 0007h ; xx xx (LE) request sequence number - mov edx, 14 ; Размер данных + mov edx, 14 ; Размер данных mov eax, ssnac mov ebx, buff call sendsnac @@ -2924,10 +3202,10 @@ snac_buff db 1024 dup 0 ; Определяем очередной подтип :-) ; mov ax, word [mbuff+10+14] - cmp ax, 0104h ;data subtype: META_SHORT_USERINFO + cmp ax, 0104h ;data subtype: META_SHORT_USERINFO jz m_snac_short_userinfo cmp ax, 00C8h - jz m_snac_basic_userinfo ;data subtype: META_BASIC_USERINFO + jz m_snac_basic_userinfo ;data subtype: META_BASIC_USERINFO write_debug 'Unknown META DATA subtype' jmp m_fin @@ -2938,13 +3216,13 @@ snac_buff db 1024 dup 0 ; Из всей информации пока нужен только ник ; mov al, [mbuff+10+16] - cmp al, 0Ah ;success byte + cmp al, 0Ah ;success byte jnz m_fin movzx eax, word [mbuff+10+12] ;request sequence number ; ; В запросе я использовал порядковый номер юзера в КЛ - lea ebx, [mbuff+10+19] ;nickname string + lea ebx, [mbuff+10+19] ;nickname string ; Длина строки не нужна, т.к. строка Null-Terminated ;Определяем статус mov ecx, 4 @@ -2963,13 +3241,13 @@ snac_buff db 1024 dup 0 ; m_snac_basic_userinfo: mov al, [mbuff+10+16] - cmp al, 0Ah ;success byte + cmp al, 0Ah ;success byte jnz m_fin movzx eax, word [mbuff+10+12] ;request sequence number ; ; В запросе я использовал порядковый номер юзера в КЛ - lea ebx, [mbuff+10+19] ;nickname string + lea ebx, [mbuff+10+19] ;nickname string ; Длина строки не нужна, т.к. строка Null-Terminated ;Определяем статус mov ecx, 4 @@ -2990,13 +3268,13 @@ snac_buff db 1024 dup 0 m_snac_15_other: - write_debug 'Unknown SNAC Family 15 Received' + write_debug 'Unknown SNAC Family 15 Recived' jmp m_fin m_other_snac: - write_debug 'Unknown SNAC received' + write_debug 'Unknown SNAC recived' jmp m_fin @@ -3069,26 +3347,26 @@ snac_buff db 1024 dup 0 push ecx ;push edx - mov cl, [ebx+1] ; Family (service) id number младший байт - mov ch, [ebx] ; старший + mov cl, [ebx+1] ; Family (service) id number младший байт + mov ch, [ebx] ; старший mov word [eax], cx - mov cl, [ebx+3] ; Family subtype id number - mov ch, [ebx+2] ; + mov cl, [ebx+3] ; Family subtype id number + mov ch, [ebx+2] ; mov word [eax+2], cx - mov cl, [ebx+5] ; SNAC flags - mov ch, [ebx+4] ; + mov cl, [ebx+5] ; SNAC flags + mov ch, [ebx+4] ; mov word [eax+4], cx ; - - mov cl, [ebx+7] ; - mov ch, [ebx+6] ; + + mov cl, [ebx+7] ; + mov ch, [ebx+6] ; mov word [eax+8], cx ; SNAC request id - mov cl, [ebx+8] ; - mov ch, [ebx+7] ; + mov cl, [ebx+8] ; + mov ch, [ebx+7] ; mov word [eax+6], cx ; - add ebx, 10 ;Размер заголовка + add ebx, 10 ;Размер заголовка mov eax, ebx @@ -3130,9 +3408,10 @@ snac_buff db 1024 dup 0 ; ; Получаем время с запуска системы, для cookie ; - mov eax, 26 - mov ebx, 9 - int 40h + ;mov eax, 26 + ;mov ebx, 9 + ;int 40h + mcall 26, 9 mov dword [buff], eax ; Cookie 1 mov dword [buff+4], eax ; Cookie 2 @@ -3151,58 +3430,58 @@ snac_buff db 1024 dup 0 call strcpy lea ecx, [ecx+11] - mov word [buff+ecx], 0200h ; TLV.Type(0x02) - message data + mov word [buff+ecx], 0200h ; TLV.Type(0x02) - message data ;push ecx ; - ; TLV.Length + ; TLV.Length - mov word [buff+ecx+4], 0105h ; 05 01 01 - fragment version, 05 - fragment identifier + mov word [buff+ecx+4], 0105h ; 05 01 01 - fragment version, 05 - fragment identifier - mov word [buff+ecx+6], 0100h ; data length + mov word [buff+ecx+6], 0100h ; data length - mov [buff+ecx+8], 01 ; byte array of required capabilities (1 - text) + mov [buff+ecx+8], 01 ; byte array of required capabilities (1 - text) - mov [buff+ecx+9], 01 ; fragment identifier (text message) - mov [buff+ecx+10], 01 ; fragment version + mov [buff+ecx+9], 01 ; fragment identifier (text message) + mov [buff+ecx+10], 01 ; fragment version pop ebx mov eax, ebx call strlen mov edx, eax - lea eax, [eax+4] ; Длина сообщения + Message charset number+ Message language number + lea eax, [eax+4] ; Длина сообщения + Message charset number+ Message language number call htons mov word [buff+ecx+11], ax mov eax, edx - lea eax, [eax+13] ; + длина служебных данных + lea eax, [eax+13] ; + длина служебных данных call htons mov word [buff+ecx+2], ax - mov word [buff+ecx+13], 0700h ; Message charset number - mov word [buff+ecx+15], 0300h ; Message language number + mov word [buff+ecx+13], 0700h ; Message charset number + mov word [buff+ecx+15], 0300h ; Message language number mov eax, ecx - mov ecx, edx ; Len + mov ecx, edx ; Len lea edx, [eax+17] - mov eax, ebx ;Source + mov eax, ebx ;Source - lea ebx, [buff+edx] ;Dest + lea ebx, [buff+edx] ;Dest call strcpy - lea ecx, [ecx+edx] ; +String length + lea ecx, [ecx+edx] ; +String length mov [buff+ecx], byte 0 mov eax, ebx call dos2win - mov word [buff+ecx], 0600h ; TLV.Type(0x06) - store message if recipient offline - mov word [buff+ecx+2], 0 ; TLV.Length + mov word [buff+ecx], 0600h ; TLV.Type(0x06) - store message if recipient offline + mov word [buff+ecx+2], 0 ; TLV.Length - lea edx, [ecx+4] ; +TLV_head length + lea edx, [ecx+4] ; +TLV_head length mov eax, ssnac mov ebx, buff mov ecx, [socket] @@ -3228,30 +3507,30 @@ snac_buff db 1024 dup 0 mov [ssnac.wSid], 2 ; Subtype mov [ssnac.dRi], 702h ; request-id - mov word [buff], 0100h ;TLV.Type(1) - encapsulated META_DATA - mov word [buff+2], 1000h ; 00 10 TLV.Length - mov word [buff+4], 000Eh ; (LE) data chunk size (TLV.Length-2) - mov eax, UIN + mov word [buff], 0100h ;TLV.Type(1) - encapsulated META_DATA + mov word [buff+2], 1000h ; 00 10 TLV.Length + mov word [buff+4], 000Eh ; (LE) data chunk size (TLV.Length-2) + lea eax, [vtable + vartable.uin] call ascitoint - mov dword [buff+6], eax ;(LE) request owner uin - mov word [buff+10], 07D0h ;data type: META_DATA_REQ + mov dword [buff+6], eax ;(LE) request owner uin + mov word [buff+10], 07D0h ;data type: META_DATA_REQ ;mov word [buff+12], 0008h ; request sequence number <<<-- Может меняться FIXIT - mov word [buff+14], 04BAh ; data subtype: META_SHORTINFO_REQUEST + mov word [buff+14], 04BAh ; data subtype: META_SHORTINFO_REQUEST mov ecx, [socket] mov edx, 20 - xor esi, esi ; Счетчик + xor esi, esi ; Счетчик xor eax, eax gi_loop: mov ebx, esi - mov word [buff+12], bx ; request sequence number + mov word [buff+12], bx ; request sequence number mov ebx, UIN_LEN imul ebx, esi mov al, [uins+ebx] cmp al, 0 - jz gi_end + jz gi_end lea eax, [uins+ebx] call ascitoint @@ -3287,10 +3566,10 @@ snac_buff db 1024 dup 0 ; mov [ssnac.wFid], 3 ; Family mov [ssnac.wSid], 4 ; Subtype - mov [ssnac.dRi], 4 ; request-id + mov [ssnac.dRi], 4 ; request-id - xor esi, esi ; Счетчик - xor edx, edx ; Заполнено байт + xor esi, esi ; Счетчик + xor edx, edx ; Заполнено байт ukk_loop: mov ebx, UIN_LEN @@ -3337,11 +3616,11 @@ snac_buff db 1024 dup 0 cmp [login], 2 jnz @f mov ax, [timer] - cmp ax, 300 ;60 c + cmp ax, 300 ;60 c jb @f mov [timer], 0 mov [flap.bId], FLAP_ID - mov [flap.bCh], 5 ;Keep alive + mov [flap.bCh], 5 ;Keep alive mov [flap.wDs], 0 inc [seq] mov ax, [seq] @@ -3357,15 +3636,215 @@ snac_buff db 1024 dup 0 popf ret +; +; Функция для установки статуса +; статус в переменной status + setstatus: + push eax + push ebx + push edx + ; + ; Client sends its DC info and status to server + ; + mov [ssnac.wFid], 1 ; Family + mov [ssnac.wSid], 1Eh ; Subtype + mov [ssnac.dRi], 1Eh ; request-id + + mov [buff], 0 ; TLV type 06 + mov [buff+1], 6h ; + mov [buff+2], 0 ; TLV data length + mov [buff+3], 4 ; + ; + ; + mov ax, STATUS_DCDISABLED ; DC disabled + call htons + mov word [buff+4], ax + ; + ; + mov ax, [status] + mov word [buff+6], ax + + mov eax, ssnac + mov ebx, buff + mov edx, 8 ; TLV head len+ data len + call sendsnac + + pop edx + pop ebx + pop eax + ret + + +; +; Макрос пропускает все пробелы в строке до +; 1 го значащего символа +; eax - указатель на null-terminated строку + +macro skip_spaces { + local ..sp_end, ..sp_loop + + push ebx + push ecx + + xor ebx, ebx + xor ecx, ecx + + ..sp_loop: + + + mov bl, [eax + ecx] + cmp bl, 0x20 + jnz ..sp_end + + + inc ecx + jmp ..sp_loop + + + + ..sp_end: + lea eax, [eax + ecx] + + pop ecx + pop ebx +} + + + + + +; +; Обработка команд +; В еax передается указатель на строку. Команда и аргументы разделены пробелом +; команда начинается с / +; в eax - результат выполнения команды, -1 команда не существует, 0 ок, другие зависят от команды + + cmd: + push ebx + push ecx + push edi + push esi + + ; + ; Проверить первый символ + ; + xor ebx, ebx + mov bl, [eax] + cmp bl, '/' + jnz cmd_end + + ; + ; Разделение по 1й букве команды + ; + mov bl, [eax + 1] + + cmp bl, 'c' + jz cmd_c + + cmp bl, 'e' + jz cmd_e + + cmp bl, 's' + jz cmd_s + + jmp cmd_no + + cmd_c: + + cmd_e: + + lea ebx, [eax + 1] + strcmp ebx, str_exit, str_exit.len + jz cmd_exit + + jmp cmd_no + + + + + cmd_s: + + lea ebx, [eax + 1] + strcmp ebx, str_status, str_status.len + jz cmd_status + + jmp cmd_no + + + + cmd_exit: + + + cmd_status: + ; + ; установить статус и послать пакет смены статуса + ; + lea eax, [eax + 1 + str_status.len] + skip_spaces + + strcmp eax, str_online, str_online.len + jz cmd_st_online + + strcmp eax, str_away, str_away.len + jz cmd_st_away + + strcmp eax, str_na, str_na.len + jz cmd_st_na + + strcmp eax, str_dnd, str_dnd.len + jz cmd_st_dnd + + strcmp eax, str_bisy, str_bisy.len + jz cmd_st_bisy + + strcmp eax, str_free4chat, str_free4chat.len + jz cmd_st_free4chat + + ; + ; Статус не определен. + ; Вывести сообщение о доступных статусах + ; + mov eax, str_status_message + xor ebx, ebx + call writemsg + + jmp cmd_end + + + cmd_st_online: + + cmd_st_away: + + cmd_st_na: + + cmd_st_dnd: + + cmd_st_bisy: + + cmd_st_free4chat: + + + cmd_no: + + cmd_end: + pop esi + pop edi + pop ecx + pop ebx + + ret + ; <--- initialised data ---> DATA - lsz header,\ - ru, "KI",\ - en, "KI",\ - fr, "KI" +include "parser_data.inc" +include "ssi_data.inc" +include "comp_data.inc" + + +head db 'KI',0 ; @@ -3373,9 +3852,14 @@ MESS db 'Message from ', 0 CUSER db 'Current user: ', 0 ; +; Список IP серверов ICQ -;ICQ_IP = 0x0A00A8C0 ; 192.168.0.10 - ICQ_IP = 0x99A10C40 +;205.188.153.121 +;icq_ip db '64.12.200.089',0 +;icq_ip db '64.12.161.185',0 +;icq_ip db '205.188.179.233',0 + + ; flap FLAP_head rflap FLAP_head @@ -3383,18 +3867,40 @@ rflap FLAP_head ssnac SNAC_head ; для передачи SNAC rsnac SNAC_head ; для принятого SNAC ; -ui UI_head ; User info +ui UI_head ; User info ; procinfo process_information ; -UIN db '123456789',0 -PASS db 'coolpass',0 +;UIN db '362820484',0 +;PASS db 'test',0 ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2000b.4.65.1.3281.85',0 ;ID_STRING db 'ICQ Inc. - Product of ICQ (TM).2001b.5.17.1.3642.85',0 -CAPABILITIES db 053h, 054h, 0, 0, 097h, 0B1h, 027h, 051h, 024h, 03Ch, 043h, 034h, 0ADh, 022h, 0D6h, 0ABh,\ - 0F7h, 03Fh, 014h, 092h, 02Eh, 07Ah, 064h, 075h, 0FAh, 0DFh, 04Dh, 0C8h, 088h, 06Fh, 0EAh, 035h,\ - 095h, 0FDh, 0B6h, 0DFh, 09h, 046h, 013h, 044h, 04Ch, 07Fh, 011h, 0D1h, 082h, 022h, 044h, 045h,\ - 053h, 054h, 0, 0 + + +;CAPABILITIES db 0x09, 0x46, 0x13, 0x49, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00,\ + ;0x97, 0xB1, 0x27, 0x51, 0x24, 0x3C, 0x43, 0x34, 0xAD, 0x22, 0xD6, 0xAB, 0xF7, 0x3F, 0x14, 0x92,\ +CAPABILITIES db 0x2E, 0x7A, 0x64, 0x75, 0xFA, 0xDF, 0x4D, 0xC8, 0x88, 0x6F, 0xEA, 0x35, 0x95, 0xFD, 0xB6, 0xDF,\ + 'KOLIBRI KI(cq)',0,0 + ;0x09, 0x46, 0x13, 0x44, 0x4C, 0x7F, 0x11, 0xD1, 0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00 + +; 1 строка +; {09461349-4C7F-11D1-8222-444553540000} +; Client supports channel 2 extended, TLV(0x2711) based messages. Currently used only by ICQ clients. +;ICQ clients and clones use this GUID as message format sign. Trillian client use another GUID +; in channel 2 messages to implement its own message format (trillian doesn't use TLV(x2711) in SecureIM channel 2 messages!). +; +; 2 строка +; {97B12751-243C-4334-AD22-D6ABF73F1492} +; Client supports RTF messages. This capability currently used by ICQ service and ICQ clients. +; +; 4 строка +; {0946134E-4C7F-11D1-8222-444553540000} +; Client supports UTF-8 messages. This capability currently used by AIM service and AIM clients +; + + + + ; ; From &RQ ; @@ -3407,27 +3913,28 @@ CAPABILITIES db 053h, 054h, 0, 0, 097h, 0B1h, 027h, 051h, 024h, 03Ch, 043h, 034h ; 0x00, 0x00, 0x00, 0x00 -C_LEN = 40h +C_LEN = 32 ;C_LEN = 80 ICBM_PARAMS db 0, 0, 0, 0, 0, 0Bh, 01Fh, 040h, 3, 0E7h, 3, 0E7h, 0, 0, 0, 0 -ICBMP_LEN = 16 ; ^^^ from &RQ +ICBMP_LEN = 16 ; ^^^ from &RQ ; ; from &rq ; -FAMILY_ARR db 0x00, 0x01, 0x00, 0x03, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x13, 0x00, 0x02, 0x01, 0x10, 0x04, 0x7B,\ - 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7B, 0x00, 0x03, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ - 0x00, 0x15, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x04, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ - 0x00, 0x06, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x09, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ - 0x00, 0x0A, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x06, 0x6A +FAMILY_ARR db 0x00, 0x01, 0x00, 0x03, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x13, 0x00, 0x02, 0x01, 0x10, 0x04, 0x7B,\ + 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7B, 0x00, 0x03, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ + 0x00, 0x15, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x04, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ + 0x00, 0x06, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x09, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B,\ + 0x00, 0x0A, 0x00, 0x01, 0x01, 0x10, 0x04, 0x7B, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x06, 0x6A - - - +; +; +; FA_LEN = 50h - +; +; ; ID_NUM = 010Ah MAJOR = 05h @@ -3438,6 +3945,9 @@ LESSER = 01h ;BUILD = 0CD1h BUILD = 0E3Ah DISTR = 055h +; +; + TCB_ESTABLISHED = 4 TCB_CLOSED = 11 ; @@ -3445,39 +3955,79 @@ CL_LANG db 'en',0 CL_COUNTRY db 'us',0 -sbuff db 1024 dup 0 ; Буфер для передачи используется внутри sendflap +sbuff db 1024 dup 0 ; Буфер для передачи используется внутри sendflap -rbuff db 1024 dup 0 ; Приемный буфер -tbuff db 512 dup 0 ; Для TLV +;recived db 0 ; Принято данных из тела пакета + +;rbuff db 1024 dup 0 ; Приемный буфер +tbuff db 512 dup 0 ; Для TLV srv_cookie db 512 dup 0 ; Куки для авторизации bos_address db 128 dup 0 ; Адрес BOS сервера -cookie_len dw 0 ; Длина куки -seq dw 0 ; Sequence number +cookie_len dw 0 ; Длина куки +seq dw 0 ; Sequence number bos_ip dd 0 bos_port dd 0 -status dw 0 ; status +status dw 0 ; status -mbuff db 2048 dup 0 ; Для приема -MBUFF_SIZE = 2048 +mbuff db 2048 dup 0 ; Для приема +MBUFF_SIZE = 2048 -hrf db 0 ; Флаг приема заголовка +hrf db 0 ; Флаг приема заголовка mouse_flag dd 0 socket dd 0 login db 0 -msg_cookie1 dd 0 ; Используются для потверждения приема сообщений -msg_cookie2 dd 0 ; +msg_cookie1 dd 0 ; Используются для потверждения приема сообщений +msg_cookie2 dd 0 ; -curruser db 0 ; текущий пользователь, которому будут отправляться сообщения - ; - Номер в КЛ по порядку +curruser db 0 ; текущий пользователь, которому будут отправляться сообщения + ; - Номер в КЛ по порядку timer dw 0 ;ltest db "ADMIN",0 +buff db 1024 dup 0 +; lbuff db 8 dup 0 ; Для 1 пакета от сервера + +; +; Строки команд для сравнения +; +str_status db 'status ' +str_status.len = $ - str_status +str_exit db 'exit ' +str_exit.len = $ - str_exit +; +; Строки статусов для сравнения +; +str_away db 'away' +str_away.len = $ - str_away + +str_dnd db 'dnd' +str_dnd.len = $ - str_dnd + +str_bisy db 'bisy' +str_bisy.len = $ - str_bisy + +str_na db 'na' +str_na.len = $ - str_na + +str_online db 'online' +str_online.len = $ - str_online + +str_free4chat db 'free4chat' +str_free4chat.len = $ - str_free4chat + +str_status_message db 'Доступные статусы: away, bisy, na, dnd, online, free4chat',0 +; +; +; + +cfg_message db 'Config:',0 + ; ; EDITBOXES @@ -3493,4 +4043,4 @@ UDATA MEOS_APP_END -; <--- end of MenuetOS application ---> \ No newline at end of file +; <--- end of MenuetOS application ---> diff --git a/programs/network/icq/trunk/ki.cfg b/programs/network/icq/trunk/ki.cfg new file mode 100644 index 0000000000..475dac38ab --- /dev/null +++ b/programs/network/icq/trunk/ki.cfg @@ -0,0 +1,9 @@ +# +# +# +UIN="123456789" +PASS="PASS" +# +# +ICQIP="64.12.200.89" +#ICQIP="192.168.0.1" diff --git a/programs/network/icq/trunk/lang.inc b/programs/network/icq/trunk/lang.inc new file mode 100644 index 0000000000..30c0149bd9 --- /dev/null +++ b/programs/network/icq/trunk/lang.inc @@ -0,0 +1 @@ +lang fix ru \ No newline at end of file diff --git a/programs/network/icq/trunk/macros.inc b/programs/network/icq/trunk/macros.inc new file mode 100644 index 0000000000..d4689a5d31 --- /dev/null +++ b/programs/network/icq/trunk/macros.inc @@ -0,0 +1,543 @@ +@^ fix macro comment { +^@ fix } + +; ------------------------- +macro library [lname,fname] +{ + forward + dd __#lname#_library_table__,__#lname#_library_name__ + common + dd 0 + forward + align 4 + __#lname#_library_name__ db fname,0 +} + +macro import lname,[name,sname] +{ + common + align 4 + __#lname#_library_table__: + forward + if used name + name dd __#name#_import_name__ + end if + common + dd 0 + forward + if used name + align 4 + __#name#_import_name__ db sname,0 + end if +} + +macro export [name,sname] +{ + forward + dd __#name#_export_name__,name + common + dd 0 + forward + align 4 + __#name#_export_name__ db sname,0 +} +; ------------------------- + +macro m2m dest,src { + push src + pop dest +} + + +macro iglobal { + IGlobals equ IGlobals, + macro __IGlobalBlock { } + +macro uglobal { + UGlobals equ UGlobals, + macro __UGlobalBlock { } + +endg fix } ; Use endg for ending iglobal and uglobal blocks. + + +macro IncludeIGlobals{ + macro IGlobals dummy,[n] \{ __IGlobalBlock + purge __IGlobalBlock \} + match I, IGlobals \{ I \} } + +macro IncludeUGlobals{ + macro UGlobals dummy,[n] \{ + \common + \local begin, size + begin = $ + virtual at $ + \forward + __UGlobalBlock + purge __UGlobalBlock + \common + size = $ - begin + end virtual + rb size + \} + match U, UGlobals \{ U \} } + +uglobal +endg + +iglobal +endg + + +; new application structure +macro meos_app_start + { + use32 + org 0x0 + + db 'MENUET01' + dd 0x01 + dd __start + dd __end + dd __memory + dd __stack + + if used __params & ~defined __params + dd __params + else + dd 0x0 + end if + + dd 0x0 + } +MEOS_APP_START fix meos_app_start + +macro code + { + __start: + } +CODE fix code + +macro data + { + __data: + IncludeIGlobals + } +DATA fix data + +macro udata + { + if used __params & ~defined __params + __params: + db 0 + __end: + rb 255 + else + __end: + end if + __udata: + IncludeUGlobals + } +UDATA fix udata + +macro meos_app_end + { + align 32 + rb 2048 + __stack: + __memory: + } +MEOS_APP_END fix meos_app_end + + +; macro for defining multiline text data +struc mstr [sstring] + { + forward + local ssize + virtual at 0 + db sstring + ssize = $ + end virtual + dd ssize + db sstring + common + dd -1 + } + +; macro for defining multiline text data +struc mls [sstring] + { + forward + local ssize + virtual at 0 + db sstring ; mod + ssize = $ + end virtual + db ssize + db sstring + common + db -1 ; mod + } + + + +; strings +macro sz name,[data] { ; from MFAR [mike.dld] + common + if used name + name db data + .size = $-name + end if +} + +macro lsz name,[lng,data] { ; from MFAR [mike.dld] + common + if used name + label name + forward + if lang eq lng + db data + end if + common + .size = $-name + end if +} + +macro szc name,elsz,[data] { ; from MFAR [mike.dld] + common + local s,m + m = 0 + if used name + label name + forward + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + common + .size = $-name + .maxl = m + end if +} + +macro lszc name,elsz,[lng,data] { ; from MFAR [mike.dld] + common + local s,m,c + m = 0 + c = 0 + if used name + label name + forward + if lang eq lng + virtual at 0 + db data + s = $ + end virtual + d#elsz s + if m < s + m = s + end if + db data + c = c+1 + end if + common + .size = $-name + .maxl = m + .count = c + end if +} + + +; easy system call macro +macro mpack dest, hsrc, lsrc +{ + if (hsrc eqtype 0) & (lsrc eqtype 0) + mov dest, (hsrc) shl 16 + lsrc + else + if (hsrc eqtype 0) & (~lsrc eqtype 0) + mov dest, (hsrc) shl 16 + add dest, lsrc + else + mov dest, hsrc + shl dest, 16 + add dest, lsrc + end if + end if +} + +macro __mov reg,a,b { ; mike.dld + if (~a eq)&(~b eq) + mpack reg,a,b + else if (~a eq)&(b eq) + mov reg,a + end if +} + + +include 'config.inc' +;__CPU_type equ p5 +SYSENTER_VAR equ 0 + +macro mcall a,b,c,d,e,f { ; mike.dld, updated by Ghost for Fast System Calls + local ..ret_point + __mov eax,a + __mov ebx,b + __mov ecx,c + __mov edx,d + __mov esi,e + __mov edi,f + + if __CPU_type eq p5 + int 0x40 + else + if __CPU_type eq p6 + push ebp + mov ebp, esp + push ..ret_point ; it may be 2 or 5 byte + sysenter + ..ret_point: + pop edx + pop ecx + + else + if __CPU_type eq k6 + push ecx + syscall + pop ecx + else + display 'ERROR : unknown CPU type (set to p5)', 10, 13 + __CPU_type equ p5 + int 0x40 + end if + end if + end if +} + + +; ------------------------- +macro header a,[b] { + common + use32 + org 0 + db 'MENUET',a + forward + if b eq + dd 0 + else + dd b + end if } +macro section name { align 16 + label name } +macro func name { + if ~used name + display 'FUNC NOT USED: ',`name,13,10 + else + align 4 + name: + ;diff16 `name,0,name +;pushad +;pushfd +;dps `name +;newline +;mcall 5,1 +;popfd +;popad +} +macro endf { end if } + +macro diff16 title,l1,l2 + { + local s,d + s = l2-l1 + display title,': 0x' + repeat 8 + d = '0' + s shr ((8-%) shl 2) and $0F + if d > '9' + d = d + 'A'-'9'-1 + end if + display d + end repeat + display 13,10 + } + +macro diff10 title,l1,l2 + { + local s,d,z,m + s = l2-l1 + z = 0 + m = 1000000000 + display title,': ' + repeat 10 + d = '0' + s / m + s = s - (s/m)*m + m = m / 10 + if d <> '0' + z = 1 + end if + if z <> 0 + display d + end if + end repeat + display 13,10 + } + +; optimize the code for size +__regs fix + +macro add arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + inc arg1 + else + add arg1,arg2 + end if + else + add arg1,arg2 + end if + } + +macro sub arg1,arg2 + { + if (arg2 eqtype 0) + if (arg2) = 1 + dec arg1 + else + sub arg1,arg2 + end if + else + sub arg1,arg2 + end if + } + +macro mov arg1,arg2 + { + if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0')) + if (arg2) = 0 + xor arg1,arg1 + else if (arg2) = 1 + xor arg1,arg1 + inc arg1 + else if (arg2) = -1 + or arg1,-1 + else if (arg2) > -128 & (arg2) < 128 + push arg2 + pop arg1 + else + mov arg1,arg2 + end if + else + mov arg1,arg2 + end if + } + + +macro RGB [a] { + common + match (r=,g=,b),a \{ + \dd ((r) shl 16) or ((g) shl 8) or (b) + \} +} + + +struc POINT _t,_dx,_dy { + .x _t _dx + .y _t _dy +} + +; structure definition helper +include 'struct.inc' + +struct RECT + left dd ? + top dd ? + right dd ? + bottom dd ? +ends + +struct BOX + left dd ? + top dd ? + width dd ? + height dd ? +ends + +; structures used in MeOS +struct process_information + cpu_usage dd ? ; +0 + window_stack_position dw ? ; +4 + window_stack_value dw ? ; +6 + dw ? ; +8 + process_name rb 12 ; +10 + memory_start dd ? ; +22 + used_memory dd ? ; +26 + PID dd ? ; +30 + box BOX ; +34 + slot_state dw ? ; +50 + dw ? ; +52 + client_box BOX ; +54 + wnd_state db ? ; +70 + rb (1024-71) +ends + +struct system_colors + frame dd ? + grab dd ? + grab_button dd ? + grab_button_text dd ? + grab_text dd ? + work dd ? + work_button dd ? + work_button_text dd ? + work_text dd ? + work_graph dd ? +ends + +struct FILEDATE + Second db ? + Minute db ? + Hour db ? + db ? + Day db ? + Month db ? + Year dw ? +ends + +struct FILEINFO + Attributes dd ? + IsUnicode db ? + db 3 dup(?) + DateCreate FILEDATE + DateAccess FILEDATE + DateModify FILEDATE + Size dq ? +ends + +; constants + +; events +EV_IDLE = 0 +EV_TIMER = 0 +EV_REDRAW = 1 +EV_KEY = 2 +EV_BUTTON = 3 +EV_EXIT = 4 +EV_BACKGROUND = 5 +EV_MOUSE = 6 +EV_IPC = 7 +EV_STACK = 8 + +; event mask bits for function 40 +EVM_REDRAW = 1b +EVM_KEY = 10b +EVM_BUTTON = 100b +EVM_EXIT = 1000b +EVM_BACKGROUND = 10000b +EVM_MOUSE = 100000b +EVM_IPC = 1000000b +EVM_STACK = 10000000b diff --git a/programs/network/icq/trunk/parser.inc b/programs/network/icq/trunk/parser.inc new file mode 100644 index 0000000000..35cff30c34 --- /dev/null +++ b/programs/network/icq/trunk/parser.inc @@ -0,0 +1,696 @@ +; +; Структура для функции 70 +; + +struc sinfo +{ + .subfnc_name dd 0 + .pos_in_file dd 0 + .reserved dd 0 + .bytes_to_read dd 0 + .pbuffer dd 0 + .null db 0 + .pname dd 0 +} + + + + +; +; таблицы значений +; +; +----+-------------+-----------------+ +; | in | Variable | Variable | +; | de | name | string | +; | x | | | +; | | | | +; +----+-------------+-----------------+ +; | | | | +; | | | | +; | 1 | UIN | 'XXXXX..XX',0 | +; | | | | +; +----+-------------+-----------------+ +; | | | +; +; загрузка int пока не реализована +; +; +----+-------------+-----------------+ +; | in | Variable | Variable | +; | de | name | int | +; | x | | | +; | | | | +; +----+-------------+-----------------+ +; | | | | +; | | | | +; | 1 | BUFFSIZE | XXXXXXXX | +; | | | | +; +----+-------------+-----------------+ +; | | | +; +; + + +TABLE_SIZE equ 16 +VNAME_LEN equ 8 +VAR_LEN equ 16 + +; +; Описание таблицы значений + +virtual at 0 + vartable: + .uin db VAR_LEN dup ? + .pass db VAR_LEN dup ? + .icqip db VAR_LEN dup ? + + + +end virtual + + +; +; Коды ошибок файловой системы +; + +FIO_SUCCESS equ 0 +FIO_UNSUPPORTED equ 2 +FIO_UNKNOWNFS equ 3 +FIO_FILENOTFOUND equ 5 +FIO_EOF equ 6 +FIO_BADPOINTER equ 7 +FIO_DISKFULL equ 8 +FIO_FATDAMAGED equ 9 +FIO_DENIED equ 10 +FIO_ERRORDEVICE equ 11 + + +IOBUFF_SIZE equ 128 + + + + +; +; макрос для поиска элемента в строке +; возвращает в eax номер элемента или -1 если не найден +macro findchar string, len, char +{ + local ..fc_endstr, ..fc_end + + push ebx + push ecx + push edi + + + mov edi, string + mov ecx, len + mov ebx, ecx + cld + mov al, char + repne scasb + jcxz ..fc_endstr + + sub ebx, ecx ; Номер = + mov eax, ebx + jmp ..fc_end + + ..fc_endstr: + mov eax, -1 + + + ..fc_end: + pop edi + pop ecx + pop ebx + +} + +; +; Макрос для поиска элемента строки, отличающегося от +; заданного + +macro findother string, len, char +{ + local ..fc_endstr, ..fc_end + + push ebx + push ecx + push edi + + + mov edi, string + mov ecx, len + mov ebx, ecx + cld + mov al, char + repe scasb ; Если символ не char - выходим + jcxz ..fc_endstr ; строка из char + + sub ebx, ecx ; в ebx - номер элемента отличного от char + mov eax, ebx + jmp ..fc_end + + ..fc_endstr: + mov eax, -1 + + + ..fc_end: + pop edi + pop ecx + pop ebx +} + +; +; Макрос для копирования строк +; +macro mstrcpy from, to, leng +{ + + push ecx + push esi + push edi + + mov ecx, leng + mov esi, from + mov edi, to + cld + rep movsb + + pop edi + pop esi + pop ecx + +} + + +; +; Инициализирует таблицы +; + +; inittables: +; +; +; mstrcpy name1, nvtable, VNAME_LEN +; mstrcpy name2, (nvtable + NAME_LEN), VNAME_LEN +; mstrcpy name3, (nvtable + NAME_LEN * 2), VNAME_LEN +; +; +; +; ret + + +; +; заполняет таблицы значениями +; IN eax - ASCIIZ имя файла +; OUT eax - результат чтения +; если результат -1, формат файла неправильный +; + parseconf: + push edi + push esi + ;push eax + push ebx + push ecx + push edx + + mov [strnum], dword 0 + + ; + ; Прочитать построчно конфиг + ; если строка начинается с ;, # - комментарий + ; Формат UIN="1234567890" + ; PASS="******" и т.д. + + ; + ; Сброс смещения + mov [shift], dword 0 + + mov esi, eax + + pc_still: + + mov edx, esi + mov ecx, IOBUFF_SIZE + mov ebx, iobuff + + call getstr + + inc [strnum] + + push eax + + ; + ;Проверка полученной строки + ; + movzx eax, byte [iobuff] + + test eax, eax + jz pc_next + + cmp al, '#' + jz pc_next + + cmp al, ';' + jz pc_next + + ; + ; Найти имя переменной + ; + findother iobuff, ebx, ' ' + cmp eax, -1 + jz pc_next + + mov [stnpos], eax ;начало имени + + ; + ; найти = + ; + mov ecx, ebx ; Искать от найденного символа + sub ecx, eax ; + + mov edi, iobuff + add edi, eax + + findchar edi, ecx, '=' + + cmp eax, -1 + jz pc_badformat + + mov edi, [stnpos] + add eax, edi ; в eax - смещение от начала строки + mov [eqpos], eax + + mov ecx, ebx + sub ecx, eax + + ; + ; проверить " + ; + mov dl, [iobuff + eax] + cmp dl, '"' + jnz pc_badformat + ; + ; найти закрывающую " + ; + mov edi, iobuff + add edi, eax + + inc edi + + findchar edi, ecx, '"' + + cmp eax, -1 + jz pc_badformat + + inc eax + + mov edx, [eqpos] + add eax, edx + mov [edvpos], eax + + ; + ; Установить значение + ; + ; Добавить завершающие 0 + + mov eax, [stnpos] + dec eax + + + mov ebx, [eqpos] + mov ecx, ebx + dec ecx ; количество символов до = + inc ebx ; Пропустить " + + mov [iobuff + ecx], byte 0 + + mov edx, [edvpos] + dec edx + + mov [iobuff + edx], byte 0 + + lea eax, [iobuff + eax] + lea ebx, [iobuff + ebx] + call setavar + + jmp pc_next + + + + + pc_badformat: + pop eax + + mov ebx, [strnum] + jmp pc_err + + + pc_next: + pop eax + + cmp eax, FIO_EOF + jz pc_eof + cmp eax, FIO_SUCCESS + jnz pc_err + + jmp pc_still + + + + pc_eof: + pc_err: + pop edx + pop ecx + pop ebx + ;pop eax + pop esi + pop edi + ret + +; Поиск в таблице переменной и установка её значения +; IN eax - название переменной указатель на ASCIIZ +; IN ebx - значение переменной указатель на ASCIIZ +; OUT eax -результат 0 = OK, -1 = нет в таблице переменных +; OUT заполняет глобальную таблицу + setavar: + ;push ebx + push ecx + push edx + push esi + push edi + push ebx + + ; + ; Определить длину строки - название переменной + ; + mov edi, eax + push eax + + mov ecx, VNAME_LEN + + xor eax, eax ;Ищем \0 + cld + repne scasb + + mov eax, VNAME_LEN + sub eax, ecx ; В ecx - остаток до максимального размера строки + mov ebx, eax + + + pop eax + ; + ; Искать в таблице подходящее имя + ; + xor edx, edx ;index + + sv_next: + mov ecx, ebx + push eax + mov esi, eax + mov edi, nvtable + mov eax, edx + imul eax, VNAME_LEN ;offset + add edi, eax + pop eax + cld + + repe cmpsb + jz sv_match + + sv_inc: + inc edx + cmp edx, TABLE_SIZE + jae sv_fail + jmp sv_next + + sv_match: + cmp ebx, VNAME_LEN ;В ebx - длина исходной строчки + jz sv_match2 + + push eax + mov edi, nvtable + mov eax, edx + imul eax, VNAME_LEN ;offset + add edi, eax + pop eax + + cmp [edi + ebx], byte 0 ; Если имя в таблице короче максимального, + jnz sv_inc ; заканчивается 0 + + sv_match2: + pop edi ; + push edi + ; + ; Определять длину строки - переменная + ; + xor eax, eax + mov ecx, VAR_LEN + cld + repne scasb + + mov eax, VAR_LEN + sub eax, ecx + mov ecx, eax + mov ebx, eax + + ; + ; Копировать переменную в таблицу + ; + + pop esi + push esi + + mov eax, VAR_LEN + imul eax, edx + mov edi, vtable + add edi, eax + cld + rep movsb + + ; + ; Если строка короче поля в таблице, записать в конец 0 + ; + cmp ebx, VAR_LEN + jz sv_end + mov [edi + ebx], byte 0 + + + + sv_end: + xor eax, eax + jmp sv_fin + + sv_fail: + mov eax, -1 + + sv_fin: + + pop ebx + pop edi + pop esi + pop edx + pop ecx + ;pop ebx + ret + + + + + +; +; Чтение ASCIIZ строки из файла +; IN ebx - указатель на буфер +; ecx - размер буфера +; edx - указатель на строку имя файла +; OUT ebx - длина строки +; eax - результат чтения + + getstr: + ;push eax + ;push ebx + push ecx + push edx + push esi + + ;xor edx, edx + xor esi, esi + + gs_read: + ; + ; Заполняем структуру + ; + mov [finfo.subfnc_name], 0 + mov eax, [shift] + mov [finfo.pos_in_file], eax + mov [finfo.bytes_to_read], ecx + mov [finfo.pbuffer], ebx + mov [finfo.pname], edx + + push ebx + + ; + ; Читем + ; + ;mov eax, 70 + ;mov ebx, finfo + ;int 40h + mcall 70, finfo + + mov ecx, ebx ; В ebx количество прочтенных байт + + pop ebx + + ; + ; Проверить результат чтения - если не EOF и 0, + ; выходим + cmp eax, FIO_EOF + jz gs_loop + cmp eax, 0 + jz gs_loop + + jmp gs_ok + + + ; + ; Обработка полученного блока + ; + gs_loop: + mov dl, [ebx + esi] + cmp dl, 0Ah ;cr + jz gs_cr + inc esi + cmp esi, ecx + jnb gs_err + jmp gs_loop + + gs_err: + ; + ; В буфере нет символа переноса строки, т.е. строка слишком длинная + ; Отбрасываем все до ближайшего символа переноса строки + ; если конец файла - выходим + cmp eax, FIO_EOF + jz gs_endf + add [shift], ecx + jmp gs_read + + + gs_endf: + xor ebx, ebx + jmp gs_ok + + gs_cr: + ; + ; Сбросить результат чтения + ; + xor eax, eax + + mov dl, [ebx + esi - 1] + cmp dl, 0Dh ;le + jz gs_le + + mov [ebx + esi], byte 0 + mov ebx, esi + + + inc esi + add [shift], esi + + jmp gs_ok + + gs_le: + mov [ebx + esi - 1], byte 0 + mov [ebx + esi], byte 0 + lea ebx, [esi - 1] + + inc esi + add [shift], esi + + gs_ok: + + + pop esi + pop edx + pop ecx + ;pop ebx + ;pop eax + ret + + +; +; Функция для вывода загруженной инфы +; + + showcfg: + push eax + push ebx + push ecx + push edx + push edi + + + xor edx, edx ; счетчик + + sc_loop: + + cmp edx, TABLE_SIZE + jnb sc_end + + ; + ; Скопировать в буфер имя и значение переменной + ; + mov eax, VNAME_LEN + imul eax, edx + lea eax, [nvtable + eax] + + mov cl, [eax] + cmp cl, byte 0 + jz sc_next + + push eax + call strlen + + mov ecx, eax + pop eax + + mov ebx, cfgbuff + + call strcpy + + mov [cfgbuff + ecx], ':' + + lea ebx, [cfgbuff + ecx + 1] + + mov eax, VAR_LEN + imul eax, edx + lea eax, [vtable + eax] + + push eax + call strlen + + mov ecx, eax + pop eax + + call strcpy + + mov [ebx + ecx], byte 0 + + mov eax, cfgbuff + xor ebx, ebx + call writemsg + + sc_next: + + inc edx + + jmp sc_loop + + + + sc_end: + pop edi + pop edx + pop ecx + pop ebx + pop eax + + ret + diff --git a/programs/network/icq/trunk/parser_data.inc b/programs/network/icq/trunk/parser_data.inc new file mode 100644 index 0000000000..78cbe857b1 --- /dev/null +++ b/programs/network/icq/trunk/parser_data.inc @@ -0,0 +1,100 @@ +; +; Данные для parser.inc +; +; + + + + + +; +; имя файла, который нужно парсить +; +fname db '/sys/ki.cfg',0 + +; +; таблицы значений +; +; +----+-------------+-----------------+ +; | in | Variable | Variable | +; | de | name | string | +; | x | | | +; | | | | +; +----+-------------+-----------------+ +; | | | | +; | | | | +; | 1 | UIN | 'XXXXX..XX' | +; | | | | +; +----+-------------+-----------------+ +; | | | +; +; загрузка int пока не реализована +; +; +----+-------------+-----------------+ +; | in | Variable | Variable | +; | de | name | int | +; | x | | | +; | | | | +; +----+-------------+-----------------+ +; | | | | +; | | | | +; | 1 | BUFFSIZE | XXXXXXXX | +; | | | | +; +----+-------------+-----------------+ +; | | | +; +; + + + +;nvtable db (TABLE_SIZE * NAME_LEN) dup 0 +vtable db (TABLE_SIZE * VAR_LEN) dup 0 + +finfo sinfo + +; +; Заполнить таблицу имен переменных +; +nvtable db 'UIN',(VNAME_LEN - 3) dup 0 + db 'PASS',(VNAME_LEN - 4) dup 0 + db 'ICQIP',(VNAME_LEN - 5) dup 0 + db ((TABLE_SIZE - 3) * VNAME_LEN) dup 0 + +; +; для инициализации таблиц +; +; +; +;name1 db 'UIN',(VNAME_LEN - 3) dup 0 +;name2 db 'PASS',(VNAME_LEN - 4) dup 0 +;name3 db 'ICQIP',(VNAME_LEN - 5) dup 0 + + +; +; Буфер для ввода/вывода +; +iobuff db IOBUFF_SIZE dup 0 +; +; Смещение в файле +; +shift dd 0 + +; +; Переменные для хранения номеров +; символов начала имени переменной +; конца, равно, конца значения +stnpos dd 0 +ednpos dd 0 +eqpos dd 0 +edvpos dd 0 +; +;Номер строки для определения ошибочных +; +strnum dd 0 + +; +; Буфер для вывода загруженного конфига +; +cfgbuff db (VAR_LEN + VNAME_LEN + 8) dup 0 +cfgbuff.len = $ - cfgbuff + diff --git a/programs/network/icq/trunk/proc32.inc b/programs/network/icq/trunk/proc32.inc new file mode 100644 index 0000000000..aa3ffc9702 --- /dev/null +++ b/programs/network/icq/trunk/proc32.inc @@ -0,0 +1,270 @@ + +; Macroinstructions for defining and calling procedures + +macro stdcall proc,[arg] ; directly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call proc } + +macro invoke proc,[arg] ; indirectly call STDCALL procedure + { common + if ~ arg eq + reverse + pushd arg + common + end if + call [proc] } + +macro ccall proc,[arg] ; directly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call proc + if size@ccall + add esp,size@ccall + end if } + +macro cinvoke proc,[arg] ; indirectly call CDECL procedure + { common + size@ccall = 0 + if ~ arg eq + reverse + pushd arg + size@ccall = size@ccall+4 + common + end if + call [proc] + if size@ccall + add esp,size@ccall + end if } + +macro proc [args] ; define procedure + { common + match name params, args> + \{ define@proc name, \{ prologue name,flag,parmbytes,localbytes,reglist \} + macro locals + \{ virtual at ebp-localbytes+current + macro label def \\{ match . type,def> \\\{ deflocal@proc .,label, + \\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \} + macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2 + end if \} } + +macro defargs@proc [arg] + { common + if ~ arg eq + forward + local ..arg,current@arg + match argname:type, arg + \{ current@arg equ argname + label ..arg type + argname equ ..arg + if dqword eq type + dd ?,?,?,? + else if tbyte eq type + dd ?,?,? + else if qword eq type | pword eq type + dd ?,? + else + dd ? + end if \} + match =current@arg,current@arg + \{ current@arg equ arg + arg equ ..arg + ..arg dd ? \} + common + args@proc equ current@arg + forward + restore current@arg + common + end if } + +macro deflocal@proc name,def,[val] + { common + match vars, all@vars \{ all@vars equ all@vars, \} + all@vars equ all@vars name + forward + local ..var,..tmp + match =label,def \{ ..tmp equ \} + match tmp,..tmp \{ ..var def val \} + match ,..tmp \{ label ..var val \} + match =?, val \{ ..tmp equ \} + match any =dup (=?), val \{ ..tmp equ \} + match tmp : value, ..tmp : val + \{ tmp: end virtual + initlocal@proc ..var,def value + virtual at tmp\} + common + match first rest, ..var, \{ name equ first \} } + +macro initlocal@proc name,def + { virtual at name + def + size@initlocal = $ - name + end virtual + position@initlocal = 0 + while size@initlocal > position@initlocal + virtual at name + def + if size@initlocal - position@initlocal < 2 + current@initlocal = 1 + load byte@initlocal byte from name+position@initlocal + else if size@initlocal - position@initlocal < 4 + current@initlocal = 2 + load word@initlocal word from name+position@initlocal + else + current@initlocal = 4 + load dword@initlocal dword from name+position@initlocal + end if + end virtual + if current@initlocal = 1 + mov byte [name+position@initlocal],byte@initlocal + else if current@initlocal = 2 + mov word [name+position@initlocal],word@initlocal + else + mov dword [name+position@initlocal],dword@initlocal + end if + position@initlocal = position@initlocal + current@initlocal + end while } + +macro endp + { purge ret,locals,endl + finish@proc + purge finish@proc + restore regs@proc + match all,args@proc \{ restore all \} + restore args@proc + match all,all@vars \{ restore all \} } + +macro local [var] + { common + locals + forward done@local equ + match varname[count]:vartype, var + \{ match =BYTE, vartype \\{ varname rb count + restore done@local \\} + match =WORD, vartype \\{ varname rw count + restore done@local \\} + match =DWORD, vartype \\{ varname rd count + restore done@local \\} + match =PWORD, vartype \\{ varname rp count + restore done@local \\} + match =QWORD, vartype \\{ varname rq count + restore done@local \\} + match =TBYTE, vartype \\{ varname rt count + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + rq count+count + restore done@local \\} + match , done@local \\{ virtual + varname vartype + end virtual + rb count*sizeof.\#vartype + restore done@local \\} \} + match :varname:vartype, done@local:var + \{ match =BYTE, vartype \\{ varname db ? + restore done@local \\} + match =WORD, vartype \\{ varname dw ? + restore done@local \\} + match =DWORD, vartype \\{ varname dd ? + restore done@local \\} + match =PWORD, vartype \\{ varname dp ? + restore done@local \\} + match =QWORD, vartype \\{ varname dq ? + restore done@local \\} + match =TBYTE, vartype \\{ varname dt ? + restore done@local \\} + match =DQWORD, vartype \\{ label varname dqword + dq ?,? + restore done@local \\} + match , done@local \\{ varname vartype + restore done@local \\} \} + match ,done@local + \{ var + restore done@local \} + common + endl } diff --git a/programs/network/icq/trunk/ssi.inc b/programs/network/icq/trunk/ssi.inc new file mode 100644 index 0000000000..92fb597288 --- /dev/null +++ b/programs/network/icq/trunk/ssi.inc @@ -0,0 +1,413 @@ +; +; +; ╧юффхЁцър ъюэЄръЄ ышёЄр эр ёхЁтхЁх +; +; + +; +; ╟ряюыэ хЄ ЄрсышЎє ё UIN +; ш юяЎшюэры№эю ЄрсышЎ√ ё шьхэхь ш фюя. шэЇющ +; + + +; ╚ч comp.inc фы  юЄырфъш +; +; +; ╠рёёшт ё UIN +; +;UIN_LEN = 11 ; ─ышэр +;UINS = 15 ; ╩юышўхёЄтю +; +;uins db UIN_LEN*UINS dup 0 +; +; ьрёёшт ёю ёЄрЄєёрьш +; +;stats dd UINS dup -1 +; +; ╠рёёшт ё шьхэрьш +; +;NAME_LEN = 30 + +;names db NAME_LEN*UINS dup 0 + + +; +; ─юёЄрхЄ шч item UIN +; eax <- єърчрЄхы№ эр item +; ╧ЁюяєёърхЄ уЁєяя√ +; + ssi_get_uin: + push eax + push ebx + push ecx + push edx + + ; + ; ╧ЁютхЁ хь ItemID + ; + xor ebx, ebx + mov bl, [eax + 1] ; Length of the item name + mov bh, [eax] ; + + + ;push ebx + ;mov ebx, 128 + ;call print_mem + + ;pop ebx + + + ;; FIXIT ╨рчєьэхх яЁютхЁ Є№ Їыруш + ;; ┼ёыш фышэр ёЄЁюъш = 0 + ;; яЁюяєёърхь item + ;cmp ebx, 0 + ;jz ssi_get_end + + ;; + ;;data_debug 'Item name len', ebx + + ;;+ёьх∙хэшх фю ItemID + + ;;xor ecx, ecx + ;;mov ch, [eax + ebx + 4] + ;;mov cl, [eax + ebx + 5] ; Item ID# + + ;;cmp ecx, 0 + ;;jz ssi_get_end + + ; + ; ╧ЁютхЁ хь Їыруш, юсЁрсрЄ√трхь Єюы№ъю чряшёш UIN + ; + xor ecx, ecx + mov ch, [eax + ebx + 6] + mov cl, [eax + ebx + 7] + + + cmp ecx, 0 ; 0x0000 Buddy record (name: uin for ICQ and screenname for AIM) + jz ssi_uin + + ; debug + ; + + lea eax, [eax + ebx + 6] + mov ebx, 2 + call print_mem + + + jmp ssi_get_end + + + ssi_uin: + ; + ; ╩юяшЁєхь UIN т ЄрсышЎє + ; + mov ecx, ebx ; ─ышэр ёЄЁюъш + lea eax, [eax + 2] + + mov edx, [uin_ind] + cmp edx, UINS + jnb ssi_get_end ;═хЄ ётюсюфэюую ьхёЄр т ЄрсышЎх UIN + + imul edx, UIN_LEN + mov ebx, uins + lea ebx, [ebx + edx] + + call strcpy + + inc [uin_ind] + + ;debug + ;mov eax, ebx + ;xor ebx, ebx + ;call writemsg + + + ; + ssi_get_end: + pop edx + pop ecx + pop ebx + pop eax + ret + + +; +; eax <- єърчрЄхы№ эр item +; тючтЁр∙рхЄ т eax єърчрЄхы№ эр ёыхфє■∙шщ item +; +; + + ssi_next_item: + + push ebx + push ecx + + xor ebx, ebx + mov bl, [eax + 1] ; фышэр UIN + mov bh, [eax] ; + + xor ecx, ecx + mov cl, [eax + ebx + 9] ; ─ышэр фюяюыэшЄхы№э√ї фрээ√ї + mov ch, [eax + ebx + 8] ; + + add ebx, ecx + add ebx, 10 ;+─ышэр чруюыютър + + lea eax, [eax + ebx] + + + pop ecx + pop ebx + ret + + +; +; eax <- єърчрЄхы№ эр tlv +; тючтЁр∙рхЄ т eax єърчрЄхы№ эр ёыхф tlv +; + macro get_next_tlv { + push ebx + + xor ebx, ebx + + mov bl, [eax + 3] + mov bh, [eax + 2] + + ; + ЁрчьхЁ чруюыютър + lea ebx, [ebx + 4] + + lea eax, [eax + ebx] + + pop ebx + } + + + +; +; ╚∙хЄ т additional шь  ш фЁ. ётхфхэш  +; eax <- єърчрЄхы№ эр item +; + ssi_get_add: + push eax + push ebx + push ecx + push edx + push esi + + + ;mov ebx, 128 + ;call print_mem + + + + + xor ebx, ebx + mov bl, [eax + 1] ; Length of the item name + mov bh, [eax] ; + + ;;cmp ebx, 0 ; ┼ёыш фышэр шьхэш = 0 + ;;jz ssi_all_tlv ; ═хЄ ёь√ёыр юсЁрсрЄ√трЄ№ + + + ;;+ёьх∙хэшх фю ItemID + + ;;xor ecx, ecx + ;;mov ch, [eax + ebx + 4] + ;;mov cl, [eax + ebx + 5] ; Item ID# + ; + ;;cmp ecx, 0 ; ├Ёєяя√ яюър эх юсЁрсрЄ√тр■Єё  + ;;jz ssi_all_tlv ; + ; + ; ╧ЁютхЁ хь Їыруш, юсЁрсрЄ√трхь Єюы№ъю чряшёш UIN + ; + xor ecx, ecx + mov ch, [eax + ebx + 6] + mov cl, [eax + ebx + 7] + + cmp ecx, 0 ; 0x0000 Buddy record (name: uin for ICQ and screenname for AIM) + jnz ssi_all_tlv + + + xor edx, edx + mov dl, [eax + ebx + 9] ; + mov dh, [eax + ebx + 8] ; Length of the additional data + + + lea eax, [eax + ebx + 10] ; eax єърчрЄхы№ эр яхЁт√щ tlv + + + ;FIXME : Iservd эх яЁшё√ырхЄ additional - яюър эх ьюує юЄырфшЄ№ + ;debug + ;push ebx + ;mov ebx, edx + + ;data_debug 'length additional data', ebx + + ;call print_mem + ;pop ebx + ; + + + + xor esi, esi + + ssi_tlv_process: + cmp esi, edx ; + jnb ssi_all_tlv ; additional чръюэўшыюё№ + + xor ecx, ecx + mov cl, [eax + 3] ; + mov ch, [eax + 2] ; TLV.Length + + xor ebx, ebx + mov bl, [eax + 1] ; TLV.Type + mov bh, [eax] ; + + cmp bx, 0x0131 ;╚ь  яюы№чютрЄхы  + jz ssi_name + + cmp bx, 0x0066 ;╬цшфрхь ртЄюЁшчрЎшш + jz ssi_auth_wait + + jmp ssi_next_tlv + + + ssi_auth_wait: + ; + ; + ; + jmp ssi_next_tlv + + + ssi_name: + + ; + ; ╤ъюяшЁютрЄ№ шь  т ьрёёшт + ; + push eax + push ecx + + mov ebx, [name_ind] + cmp ebx, UINS + jnb ssi_name_end ;═хЄ ьхёЄр т ЄрсышЎх + + lea eax, [eax + 4] ;╙ърчрЄхы№ эр ёЄЁюъє (╧Ёшсрты хь ЁрчьхЁ чруюыютър TLV) + + imul ebx, NAME_LEN + lea ebx, [names + ebx] + + cmp ecx, NAME_LEN - 1 ; ┼ёыш шь  фышээхх яюы  т ЄрсышЎх + jna @f + + mov ecx, NAME_LEN - 1 + + @@: + call strcpy + + ;; FIXIT + ;; ╧хЁхъюфшЁютър шьхэш + ;; + ;;mov eax, ebx + ;;call win2dos + + ; + ;debug + ;push eax + ;push ebx + + ;mov eax, ebx + ;xor ebx, ebx + ;call writemsg + + ;pop ebx + ;pop eax + ; + ; + inc [name_ind] + + pop ecx + pop eax + + + + ssi_next_tlv: + lea ecx, [ecx + 4] ; ─ышэр фрээ√ї tlv + фышэр чруюыютър + add esi, ecx + + get_next_tlv + jmp ssi_tlv_process + + + ssi_name_end: + pop ecx + pop eax + + + ssi_all_tlv: + + + pop esi + pop edx + pop ecx + pop ebx + pop eax + ret + +; +; +; ╬сЁрсюЄър ъюэЄръЄ ышёЄр, яЁш°хф°хую юЄ ёхЁтхЁр +; +; т eax <- єърчрЄхы№ эр фрээ√х т яръхЄх SNAC(13,06) + ssi_process_data: + push eax + push ebx + push ecx + push edx + + ; + ; ╧ЁютхЁшЄ№ тхЁёш■ яЁюЄюъюыр + ; + xor ebx, ebx + mov bl, [eax] + cmp bl, 0 + jnz ssi_bad_prot + ; + ;т ebx - ъюышўхёЄтю items + mov bl, [eax + 2] + mov bh, [eax + 1] + ; + data_debug 'SSI items:', ebx + + lea eax, [eax + 3] ; ╙ёЄрэютшЄ№ eax эр ёяшёюъ items + + xor ecx, ecx ; ╤ўхЄўшъ items + + + ssi_next_uin: + cmp ecx, ebx + jnb ssi_all_items + + + call ssi_get_uin + + call ssi_get_add + + call ssi_next_item + + inc ecx + jmp ssi_next_uin + + + + ssi_bad_prot: + write_debug "ERR: SSI protocol version mismatch" + + ssi_all_items: + + pop edx + pop ecx + pop ebx + pop eax + ret + + diff --git a/programs/network/icq/trunk/ssi_data.inc b/programs/network/icq/trunk/ssi_data.inc new file mode 100644 index 0000000000..0da78a1033 --- /dev/null +++ b/programs/network/icq/trunk/ssi_data.inc @@ -0,0 +1,5 @@ +; +; ╚эфхъё т ьрёёштх UINS +; +uin_ind dd 0 +name_ind dd 0 \ No newline at end of file diff --git a/programs/network/icq/trunk/st_red.bmp b/programs/network/icq/trunk/st_red.bmp new file mode 100644 index 0000000000..b26de77b6d Binary files /dev/null and b/programs/network/icq/trunk/st_red.bmp differ diff --git a/programs/network/icq/trunk/struct.inc b/programs/network/icq/trunk/struct.inc new file mode 100644 index 0000000000..947a84e89a --- /dev/null +++ b/programs/network/icq/trunk/struct.inc @@ -0,0 +1,180 @@ + +; Macroinstructions for defining data structures + +macro struct name + { fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common fields@struct equ fields@struct,.,db, \} + struc dw [val] \{ \common fields@struct equ fields@struct,.,dw, \} + struc du [val] \{ \common fields@struct equ fields@struct,.,du, \} + struc dd [val] \{ \common fields@struct equ fields@struct,.,dd, \} + struc dp [val] \{ \common fields@struct equ fields@struct,.,dp, \} + struc dq [val] \{ \common fields@struct equ fields@struct,.,dq, \} + struc dt [val] \{ \common fields@struct equ fields@struct,.,dt, \} + struc rb count \{ fields@struct equ fields@struct,.,db,count dup (?) \} + struc rw count \{ fields@struct equ fields@struct,.,dw,count dup (?) \} + struc rd count \{ fields@struct equ fields@struct,.,dd,count dup (?) \} + struc rp count \{ fields@struct equ fields@struct,.,dp,count dup (?) \} + struc rq count \{ fields@struct equ fields@struct,.,dq,count dup (?) \} + struc rt count \{ fields@struct equ fields@struct,.,dt,count dup (?) \} + macro db [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,db, \} + macro dw [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dw, \} + macro du [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,du, \} + macro dd [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dd, \} + macro dp [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dp, \} + macro dq [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dq, \} + macro dt [val] \{ \common \local anonymous + fields@struct equ fields@struct,anonymous,dt, \} + macro rb count \{ \local anonymous + fields@struct equ fields@struct,anonymous,db,count dup (?) \} + macro rw count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dw,count dup (?) \} + macro rd count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dd,count dup (?) \} + macro rp count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dp,count dup (?) \} + macro rq count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dq,count dup (?) \} + macro rt count \{ \local anonymous + fields@struct equ fields@struct,anonymous,dt,count dup (?) \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} + virtual at 0 } + +macro ends + { match , sub@struct \{ restruc db,dw,du,dd,dp,dq,dt + restruc rb,rw,rd,rp,rq,rt + purge db,dw,du,dd,dp,dq,dt + purge rb,rw,rd,rp,rq,rt + purge union,struct + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + fields@\\#name equ fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + if $ + display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah + err + end if + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label . + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common \\\} \\} \} } + +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,name,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + virtual at 0 + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ + rb sizeof.#parent#field - $ + end if + else if sizeof.#type > $ + rb sizeof.#type - $ + end if + common + sizeof.#name = $ + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at 0 + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + rb sizeof.#type + end if + local value + common + sizeof.#name = $ + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} }