Subversion Repositories Kolibri OS

Rev

Rev 1833 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; <--- description --->
  2. ; compiler:     FASM 1.67.21
  3. ; name:         ICQ for Kolibri
  4. ; version:      0.01
  5. ; written by:   LV
  6. ; e-mail:       lv4evil@ya.ru
  7.  
  8.  
  9. ; <--- include all MeOS stuff --->
  10. include "lang.inc"
  11. include "../../../macros.inc"
  12. purge mov
  13. ;include "ASCL9/ascl.inc"
  14. ;include "debug.inc"
  15. include "EDITBOX.INC"
  16.  
  17. ; <--- start of MenuetOS application --->
  18. MEOS_APP_START
  19.  
  20. ;include "debug.inc"
  21. include "2000.inc"
  22. include "comp.inc"
  23.  
  24. use_edit_box procinfo,22,5
  25.  
  26. ; <--- start of code --->
  27. CODE
  28.    
  29.    
  30.     ;mov eax, 40
  31.     ;mov ebx, 47h
  32.     ;int 40h
  33.    
  34.     call    loaduin
  35.     call    draw_window            ; at first create and draw the window
  36.    
  37.     ;call    buttonbox
  38.  
  39.   wait_event:                      ; main cycle
  40.     mov     eax, 23
  41.     mov     ebx, 20
  42.     int     0x40
  43.  
  44.     cmp     eax, 1                 ;   if event == 1
  45.     je      redraw                 ;     jump to redraw handler
  46.     cmp     eax, 2                 ;   else if event == 2
  47.     je      key                    ;     jump to key handler
  48.     cmp     eax, 3                 ;   else if event == 3
  49.     je      button                 ;     jump to button handler
  50.    
  51.     ;
  52.     ; Ждем данных
  53.     ;
  54.     mov     eax, 53
  55.     mov     ebx, 2
  56.     push    ecx
  57.     mov     ecx, [socket]
  58.     int     0x40
  59.     pop     ecx
  60.     cmp     eax, 0
  61.     jnz     read_socket
  62.  
  63.     mouse_edit_box inputbox
  64.     ;
  65.     ; Если есть соединение с сервером, посылаем пакеты - подтвеждения каждые 60 с
  66.     ;
  67.     call    sendkeep
  68.    
  69.     jmp     wait_event             ;   else return to the start of main cycle
  70.  
  71.  
  72.   redraw:                          ; redraw event handler
  73.     call    draw_window
  74.     jmp     wait_event
  75.  
  76.  
  77.   key:                             ; key event handler
  78.     mov     eax, 2                 ;   get key code
  79.     int     0x40
  80.  
  81.     cmp ah, 0Dh                    ; Пробел - отправить сообщение
  82.     jz send
  83.  
  84.  
  85.     key_edit_box inputbox
  86.  
  87.     jmp     wait_event
  88.  
  89.  
  90.   button:                          ; button event handler
  91.     mov     eax, 17                ;   get button identifier
  92.     int     0x40
  93.  
  94.     cmp     ah, 2
  95.     jz      connect
  96.  
  97.     cmp     ah, 3
  98.     jz      disconnect
  99.  
  100.     cmp     ah, 4
  101.     jz      send
  102.  
  103.     ;
  104.     ; Проверяем, не нажата ли кнопка в КЛ
  105.     ; 100 <ID <= 100+UINS
  106.     cmp ah, UINS+100
  107.     jnc @f
  108.     cmp ah, 100
  109.     jc @f
  110.     ;
  111.     ; Нажата
  112.     ;
  113.     sub ah, 100
  114.     mov [curruser], ah
  115.     ;
  116.     ; Выводим строчку, кому
  117.     ;
  118.     shr eax, 8
  119.     and eax, 000000FFh
  120.     push eax
  121.     mov eax, CUSER
  122.     call strlen
  123.     mov ecx, eax
  124.     mov eax, CUSER
  125.     mov ebx, buff
  126.     call strcpy
  127.     pop eax
  128.     mov ebx, NAME_LEN
  129.     imul ebx, eax
  130.     lea eax, [names+ebx]
  131.     mov [buff+ecx], ' ' ; Пробел
  132.     lea ebx, [buff+ecx+1]
  133.     mov ecx, NAME_LEN
  134.     call strcpy
  135.     mov eax, buff
  136.     xor ebx, ebx
  137.     call writemsg
  138.  
  139.  
  140.  
  141.  
  142.   @@:
  143.     cmp     ah, 1
  144.     jne     wait_event             ;   return if button id != 1
  145.  
  146.     or      eax, -1                ;   exit application
  147.     int     0x40
  148.  
  149.  
  150.   draw_window:
  151.     mov     eax, 12                ; start drawing
  152.     mov     ebx, 1
  153.     int     0x40
  154.  
  155.     mov     eax, 0                 ; create and draw the window
  156.     mov     ebx, 100*65536+700     ;   (window_cx)*65536+(window_sx)
  157.     mov     ecx, 100*65536+500     ;   (window_cy)*65536+(window_sy)
  158.     mov     edx, 0x03ffffff        ;   work area color & window type 3
  159. ;   mov     esi, 0                 ;   grab color (not used)
  160. ;   mov     edi, 0                 ;   frame color (not used)
  161.     int     0x40
  162.  
  163.     mov     eax, 4                 ; window header
  164.     mov     ebx, 8*65536+8         ;   coordinates
  165.     mov     ecx, 0x10ffffff        ;   color & font N1
  166.     mov     edx, header            ;   address of text
  167.     mov     esi, header.size       ;   length of text
  168.     int     0x40
  169.  
  170.     draw_edit_box inputbox
  171.  
  172.     rect 10, 30, 500, 450, 0
  173.  
  174.     draw_button 600, 460, 60, 15, 2, 'CONNECT'
  175.     ;draw_button 600, 460, 60, 15, 3, 'Disconnect'
  176.     draw_button 530, 460, 60, 15, 4, 'SEND'
  177.  
  178.     call printbuff
  179.     call    buttonbox
  180.    
  181.  
  182.     mov     eax, 12                ; finish drawing
  183.     mov     ebx, 2
  184.     int     0x40
  185.  
  186.   ret
  187.  
  188. ;
  189. ;  Соединение
  190. ;
  191.   connect:
  192.   mov eax, ICQ_IP
  193.   mov ebx, ICQ_PORT
  194.   call srv_connect
  195.   ;call srv_login
  196.  
  197.  
  198.   jmp wait_event
  199.  
  200.  
  201. ;
  202. ;
  203. ;
  204.   disconnect:
  205.   mov ecx, [socket]
  206.   call closesocket
  207.  
  208.   jmp wait_event
  209.  
  210.  
  211. ;
  212. ;
  213. ;
  214.   send:
  215.   ;
  216.   ; Определяем, не сменен ли текущий УИН
  217.   ;
  218.   ; Для смены используется / в начале строки и номер уина
  219.   ; по порядку. Если длина > 2 символов, считается, что передан
  220.   ; сам уин - для отправки сообщений юзерам, которых нет в КЛ
  221.   ;
  222.     mov al, [inputbuff]
  223.     cmp al, '/'
  224.     jnz sd_message
  225.     ; Смена уина
  226.     ;mov al, [inputbuff+2]
  227.     ;cmp al, 20h
  228.     ;jz sd_use_kl
  229.     mov al, [inputbuff+3]
  230.     cmp al, 20h            ; Пробел
  231.     jz sd_use_kl
  232.     ;
  233.     ; Ищем первый пробел, им должен закончиться уин
  234.     ;
  235.     xor ecx, ecx
  236.   sd_loop:
  237.     mov al, [inputbuff+ecx]
  238.     cmp al, 20h
  239.     jz sd_space
  240.     cmp al, 0
  241.     jz  wait_event
  242.     inc ecx
  243.     jmp sd_loop
  244.  
  245.   sd_space:
  246.     ;
  247.     ; Заменяем пробел на 0, отсылаем сообщение
  248.     mov [inputbuff+ecx], byte 0
  249.     lea ebx, [inputbuff+1]
  250.     lea eax, [inputbuff+ecx+1]
  251.     call sendmsg
  252.     mov ebx, 0000FFh
  253.     call writemsg
  254.     jmp wait_event
  255.  
  256.  
  257.  
  258.   sd_use_kl:
  259.     lea eax, [inputbuff+1]
  260.     mov [inputbuff+3], byte 0
  261.     call ascitoint
  262.     lea eax, [eax-1]    ; Т.к. в КЛ отсчет с 0
  263.     mov [curruser], al
  264.    
  265.  
  266.   sd_message:
  267.   ;
  268.   ; Сообщение
  269.     movzx eax, [curruser]
  270.     mov ebx, UIN_LEN
  271.     imul ebx, eax
  272.     lea ebx, [uins+ebx]
  273.     mov al, [inputbuff]
  274.     cmp al, '/'
  275.     jz @f
  276.     mov eax, inputbuff
  277.     jmp sd_send
  278.   @@:
  279.     ;mov al, [inputbuff+2]
  280.     ;cmp al, ' '
  281.     ;jz @f
  282.     lea eax, [inputbuff+4]
  283.     ;jmp sd_send
  284.   ;@@: lea eax, [inputbuff+3]
  285.  
  286.   sd_send:
  287.     call sendmsg
  288.     mov ebx, 0000FFh
  289.     call writemsg
  290.  
  291.  
  292.   jmp wait_event
  293.  
  294.  
  295. ;
  296. ; Есть принятые данные
  297. ;
  298.   read_socket:
  299.     pushf
  300.     pushad
  301.     ;write_debug 'Some data in socket'
  302.     ;
  303.     ; Проверяем, не был ли получен заголовок отдельно от данных
  304.     ; в предыдущем цикле
  305.     ;
  306.     cmp [hrf], 1
  307.     jz rs_head_recived
  308.  
  309.  
  310.     mov eax, 53
  311.     mov ebx, 2
  312.     mov ecx, [socket]
  313.     int 40h
  314.     cmp eax, 6 ; Flap head size
  315.     jc r_end
  316.     ;
  317.     ; Принимаем заголовок
  318.     ;
  319.     xor edx, edx
  320.  
  321.     ;mov ecx, [socket]
  322.    rs_loop:
  323.     mov eax,  53
  324.     mov ebx, 3
  325.    
  326.     int 40h
  327.  
  328.     mov [mbuff+edx], bl
  329.     inc edx
  330.     cmp edx, 6
  331.  
  332.     jnz rs_loop
  333.     ;
  334.     ; Заполняем заголовок
  335.     ;
  336.     ;xor eax, eax
  337.  
  338.     ;
  339.     ; Заголовок принят!
  340.     ;
  341.     mov [hrf], 1
  342.  
  343.     mov bl, [mbuff]
  344.     mov [rflap.bId], bl
  345.  
  346.     mov bl, [mbuff+1]
  347.     mov [rflap.bCh], bl
  348.  
  349.     mov bh, [mbuff+2]
  350.     mov bl, [mbuff+3]
  351.     mov [rflap.wSn], bx
  352.  
  353.     mov bh, [mbuff+4]
  354.     mov bl, [mbuff+5]
  355.     mov [rflap.wDs], bx
  356.  
  357.     ;
  358.     ; Принимаем данные
  359.     ;
  360.     ;xor edx, edx
  361.     cmp [rflap.bId], 2Ah
  362.     jnz rs_flap_error
  363.     ;
  364.     ;  Проверяем, получены ли данные
  365.     ;
  366.   rs_head_recived:
  367.  
  368.     mov eax, 53
  369.     mov ebx, 2
  370.     ;mov ecx, [socket]
  371.     int 40h
  372.     cmp ax, [rflap.wDs]   ; Размер данных
  373.     jc r_end
  374.     ;
  375.     ;
  376.     mov ax, [rflap.wDs]
  377.     ;
  378.     ; Проверяем размер данных
  379.     ;
  380.     cmp ax, MBUFF_SIZE+1
  381.     jnc rs_big_flap
  382.  
  383.     xor esi, esi    
  384.     mov esi, eax
  385.     xor edx, edx
  386.  
  387.     ;mov ecx, [socket]
  388.  
  389.    rs_data_loop:
  390.     cmp edx, esi
  391.     jz rs_data_end
  392.  
  393.     mov eax, 53
  394.     mov ebx, 3
  395.     int 40h
  396.     mov [mbuff+edx], bl
  397.     inc edx
  398.     jmp rs_data_loop
  399.  
  400.     ;
  401.     ; Данные приняты
  402.     ;
  403.     rs_data_end:
  404.     mov [hrf], 0
  405.     write_debug 'Some data received'
  406.     ;
  407.     ;
  408.     ;
  409.     cmp [login], 0
  410.     jz rs_login
  411.     call main_loop
  412.     jmp r_end
  413.  
  414.  
  415.     rs_login:
  416.     call srv_login
  417.     ;write_debug 'Exited srv_login'
  418.     jmp r_end
  419.  
  420.     rs_flap_error:
  421.     write_debug 'Invalid Flap'
  422.     ;
  423.     ; FLAP.id неверный. нужно закрыть сокет
  424.     ;
  425.  
  426.     mov ecx, [socket]
  427.     ;call closesocket
  428.     jmp r_end
  429.  
  430.     ;
  431.     ;  Слишком большой пакет!
  432.     ;
  433.     rs_big_flap:
  434.  
  435.     write_debug 'Too BIG FLAP Received'
  436.     mov [hrf], 0
  437.  
  438.     mov ecx, [socket]
  439.     mov ax, [rflap.wDs]
  440.     xor esi, esi    
  441.     mov esi, eax
  442.     xor edx, edx
  443.  
  444.    rs_data_loop2:
  445.     cmp edx, esi
  446.     jz r_end
  447.  
  448.     mov eax, 53
  449.     mov ebx, 3
  450.     int 40h
  451.     ;mov [mbuff+edx], bl
  452.     inc edx
  453.     jmp rs_data_loop2
  454.  
  455.  
  456.  
  457.  
  458.  
  459.     r_end:
  460.    
  461.     popad
  462.     popf
  463.   jmp wait_event
  464.  
  465. ; Соединение с сервером, возвращает в eax - хэндл сокета
  466. ; передаем в еах IP адрес сервера
  467. ; в ebx - порт
  468.   srv_connect: 
  469.     push ecx
  470.     push edx
  471.     push esi
  472.     push edi
  473.     push ebx
  474.    
  475.     mov esi, eax             ; IP - в esi
  476.     ; find free port
  477.     mov    ecx, 1000         ; Определяем локальный порт, начинаем с 1000
  478.  
  479.     getlp:
  480.     inc    ecx
  481.     push   ecx
  482.     mov    eax, 53
  483.     mov    ebx, 9
  484.     int    0x40
  485.     pop    ecx
  486.     cmp    eax, 0            ; этот локальный порт используется?
  487.     jz     getlp             ; да - продолжаем перебирать
  488.     ;OK ecx = port number
  489.     ;Open Socket
  490.     mov eax, 53
  491.     mov ebx, 5
  492.     xor edx, edx
  493.     ;mov dx, ICQ_PORT
  494.     pop edx
  495.     ;mov esi,ICQ_IP
  496.     mov edi, 1;SOCKET_ACTIVE
  497.  
  498.     int 040h
  499.     ;
  500.     mov [socket], eax
  501.     ;
  502.     ; Ждем установки соедиения
  503.     mov ecx, eax
  504.   srv_loop:
  505.    
  506.     mov eax, 53
  507.     mov ebx, 6
  508.     int 40h
  509.     cmp eax, TCB_ESTABLISHED
  510.     jz fin
  511.     cmp eax, 11
  512.     jae @f
  513.     ;
  514.     mov eax, 5
  515.     mov ebx, 50
  516.     int 40h
  517.     jmp srv_loop
  518.  
  519.  
  520.  
  521.  
  522.     ;cmp eax,-1
  523.     ;jnz fin
  524.     ;delay 100
  525.     write_debug 'CONNECTION FAILED'                   ;Подключение не удалось
  526.     jmp @f
  527.     ;connrcted:  
  528.                                           ;CONNECTED
  529.    
  530.     fin:
  531.     write_debug 'Connected!!!!'
  532.   @@:
  533.     pop edi
  534.     pop esi
  535.     pop edx
  536.     pop ecx
  537.     ;pop ebx
  538.   ret
  539.  
  540. ;
  541. ; --> ecx socket handle
  542. ;
  543.   buff db 1024 dup 0
  544.   lbuff db 8 dup 0       ; Для 1 пакета от сервера
  545.   srv_login:
  546.     pushf
  547.     push eax
  548.     push ebx
  549.     ;push ecx
  550.     push edx
  551.  
  552.     ;
  553.     ; Определяем тип полученных данных
  554.     ;
  555.     movzx eax, [rflap.bCh]
  556.     cmp eax, 01
  557.     jz s_new_connection
  558.     cmp eax, 04
  559.     jz s_cookie        ; cookie
  560.     jmp l_flap_err
  561.  
  562.   s_new_connection:
  563.     ;
  564.     ; Проверяем полученный пакет
  565.     ;
  566.     movzx eax, [rflap.wDs]
  567.     cmp eax, 4
  568.     jnz l_len_err
  569.     mov eax, dword [mbuff]
  570.     cmp eax, 01000000h      ; 00 00 00 01
  571.     jnz l_data_err
  572.     ;
  573.     ;Формируем пакет для соединения
  574.     ;
  575.     ;mov [flap.bId], FLAP_ID
  576.     mov [flap.bCh], NEW_CONNECTION
  577.    
  578.     mov eax, 26
  579.     mov ebx, 9
  580.     int 40h
  581.     mov [seq], ax
  582.  
  583.     mov [flap.wSn], ax      ; Sequence number
  584.     ;mov [buff],0
  585.     ;mov [buff+1],0
  586.     ;mov [buff+2],0
  587.     mov dword [buff], 0x01000000 ;login Protokol version  00 00 00 01
  588.     ;mov[buff+4],0
  589.     mov word [buff+4], 0x0100; TLV.TYPE = UIN     00 01
  590.  
  591.     mov eax, UIN
  592.     call strlen
  593.     mov [buff+6], ah
  594.     mov [buff+7], al ; Length of UIN
  595.     mov edx, eax
  596.     add edx, 7                 ; в edx длина заполненного буфера
  597.    
  598.     mov ecx, eax              ;Длина строки
  599.  
  600.     mov eax, UIN
  601.     lea ebx, [buff+8]         ; + размер данных в буфере + 1
  602.  
  603.     call strcpy
  604.  
  605.    
  606.     mov eax, PASS
  607.     call roast
  608.    
  609.     mov [buff+edx+2], 2 ; TLV.TYPE - rosted password
  610.     call strlen
  611.     mov word [buff+edx+4], ax  ; Length of pass
  612.  
  613.     add edx, 4
  614.     mov ebx, buff
  615.     add ebx, edx               ; назначение
  616.     add edx, eax               ; Сохраняем в EDX длину заполненного буфнра
  617.     mov ecx, eax               ; Длина строки
  618.     mov eax, PASS              ; Источник
  619.     inc ebx
  620.     call strcpy
  621.    
  622.     mov [buff+edx+2], 3 ; TLV.TYPE - client id string
  623.     mov eax, ID_STRING
  624.     call strlen
  625.     mov word [buff+edx+4], ax
  626.  
  627.     add edx, 4
  628.     mov ecx, eax
  629.     mov ebx, buff
  630.     add ebx, edx
  631.     add edx, eax
  632.     inc ebx
  633.     mov eax, ID_STRING
  634.     call strcpy
  635.  
  636.     mov [buff+edx+2], 016h  ; TLV.TYPE - Client id
  637.     mov [buff+edx+4], 2
  638.     mov word [buff+edx+6], ID_NUM
  639.     add edx, 6
  640.  
  641.     mov [buff+edx+2], 017h ; Client major version
  642.     mov [buff+edx+4], 2
  643.     mov [buff+edx+6], MAJOR
  644.     add edx, 6
  645.  
  646.     mov [buff+edx+2], 018h ; Client minor version
  647.     mov [buff+edx+4], 2
  648.     mov [buff+edx+6], MINOR
  649.     add edx, 6
  650.  
  651.     mov [buff+edx+2], 019h ; Client lesser version
  652.     mov [buff+edx+4], 2
  653.     mov [buff+edx+6], LESSER
  654.     add edx, 6
  655.  
  656.     mov [buff+edx+2], 01Ah ; Client build number
  657.     mov [buff+edx+4], 2
  658.     mov word [buff+edx+6], BUILD
  659.     add edx, 6
  660.    
  661.     mov [buff+edx+2], 014h ; Client distribution number
  662.     mov [buff+edx+4], 4
  663.     mov [buff+edx+8], DISTR
  664.     add edx, 8
  665.  
  666.     mov [buff+edx+2], 0Fh ; Client language
  667.     mov eax, CL_LANG
  668.     call strlen
  669.     mov word [buff+edx+4], ax
  670.     add edx, 4
  671.     mov ecx, eax
  672.     mov ebx, buff
  673.     add ebx, edx
  674.     inc ebx
  675.     add edx, eax
  676.     mov eax, CL_LANG
  677.     call strcpy
  678.  
  679.     mov [buff+edx+2], 0Fh ; Client language
  680.     mov eax, CL_COUNTRY
  681.     call strlen
  682.     mov word [buff+edx+4], ax
  683.     add edx, 4
  684.     mov ecx, eax
  685.     mov ebx, buff
  686.     add ebx, edx
  687.     inc ebx
  688.     add edx, eax
  689.     mov eax, CL_COUNTRY
  690.     call strcpy
  691.    
  692.    ;write_debug 'Connect attemption'
  693.    ; mov eax, ICQ_IP
  694.    ; call srv_connect
  695.    ; cmp eax, -1   ; Подключение не удалось
  696.    ; jz l_fin
  697.  
  698.    ; mov ecx, eax
  699.    ; mov eax, rflap
  700.    ; mov ebx, lbuff
  701.    ; call recvflap
  702.    
  703.   ;  cmp eax, -1
  704.    ; jz l_flap_err
  705.    ; cmp [rflap.bCh], 01 ; AUTH channel
  706.    ; jnz l_ch_err
  707.    ; cmp eax, 4
  708.    ; jnz l_len_err
  709.    ; cmp dword [lbuff+3], dword 1
  710.    ; jnz l_data_err
  711.  
  712.     mov ecx, [socket]
  713.     inc dx
  714.     mov [flap.wDs], dx ; Data size
  715.     mov eax, flap
  716.     mov ebx, buff
  717.     call sendflap
  718.     cmp eax, 0
  719.     jnz l_fin           ; Неуспех
  720.     jmp l_end
  721.    
  722.  
  723.     s_cookie:
  724.     ;mov eax, rflap
  725.     ;mov ebx, buff
  726.     ;call recvflap
  727.     ;cmp eax, -1
  728.     ;jz l_flap_err
  729.     ;cmp [rflap.bCh], 4
  730.     ;jnz l_ch_err
  731.  
  732.     ;write_debug 'UIN'
  733.     xor ebx, ebx
  734.  
  735.    uin_loop:
  736.     xor eax, eax
  737.     mov ax, word [mbuff+ebx]
  738.     cmp ax, 0100h              ;  00 01 TLV.Type UIN
  739.     jz l_uin_ok                  ;  Теперь сервер передает еще данные при соединении, а потом опять
  740.     add ebx, 5                         ; тот же TLV 1
  741.     cmp ebx, 5
  742.     ja l_tlvt_err
  743.     jmp uin_loop
  744.  
  745.  
  746.  
  747.  
  748.  
  749.   l_uin_ok:
  750.     mov eax, ebx
  751.     xor ebx, ebx
  752.     mov bl, [mbuff+eax+3]           ;
  753.     mov bh, [mbuff+eax+2]           ;  Длина данных
  754.     ;
  755.     ;  UIN Пока не проверяется
  756.     ;
  757.    
  758.  
  759.     lea ebx, [ebx+eax+4]
  760.     mov ax, word [mbuff+ebx]
  761.     cmp ax, 0500h             ; 00 05 Bos address
  762.     jz l_all_ok
  763.     cmp ax, 0400h             ; UIN incorrect
  764.     jz l_uin_err
  765.     cmp ax, 0800h
  766.     jz l_pass_err
  767.     jmp l_tlvt_err
  768.     ;
  769.     ; если неверный UIN/ пароль, получаем TLV.TYPE 4/8
  770.     ;
  771.  
  772.     l_all_ok:
  773.     xor ecx, ecx
  774.     mov cl, [mbuff+ebx+3]       ;length
  775.     mov ch, [mbuff+ebx+2]       ;
  776.    
  777.     lea eax, [mbuff+ebx+4]
  778.     push ebx
  779.     mov ebx, bos_address
  780.     call strcpy
  781.     pop ebx
  782.     add ebx, ecx
  783.     lea ebx, [ebx+4]                ; Размер заголовка                
  784.     ;        
  785.     ; cookie
  786.     ;
  787.     ;write_debug 'Login Cookie'
  788.  
  789.     xor eax, eax
  790.     mov ax, word [mbuff+ebx]
  791.     cmp ax, 0600h                  ; TLV.Type cookie
  792.     jnz l_tlvt_err
  793.     mov cl, [mbuff+ebx+3]           ;
  794.     mov ch, [mbuff+ebx+2]           ; Length
  795.     mov [cookie_len], cx
  796.     lea eax, [mbuff+ebx+4]
  797.     push ebx
  798.     mov ebx, srv_cookie
  799.     call strcpy
  800.     pop ebx
  801.            
  802.     ;                        
  803.     ;  Соединяемся с BOS    
  804.     ;                      
  805.     ;call srv_disconnect
  806.     mov ecx, [socket]
  807.     ;write_debug 'Closing socket'
  808.     ;call closesocket
  809.     ;
  810.     ;
  811.     ;mov eax, 53
  812.     ;mov ebx, 8
  813.     ;int 40h
  814.  
  815.  
  816.  
  817.                        
  818.     mov eax, bos_address
  819.     call ip_parser
  820.    
  821.     call htonl
  822.     data_debug 'BOS Address: ', eax
  823.     data_debug 'BOS Port: ', ebx
  824.     mov [bos_ip], eax      
  825.     mov [bos_port], ebx    
  826.     call srv_connect
  827.     mov [login], 1                ; Соединение с основным сервером установлено
  828.     ;mov [socket], eax
  829.                            
  830.  
  831.    
  832.     jmp l_end
  833.     ;
  834.     ;
  835.     ;
  836.     l_pass_err:
  837.     write_debug 'PASSWORD INVALID'
  838.     jmp l_fin
  839.  
  840.     l_uin_err:
  841.     write_debug 'UIN INVALID'
  842.     jmp l_fin
  843.  
  844.     l_data_err:
  845.     write_debug 'LOGIN DATA MISMATCH'
  846.     jmp l_fin
  847.  
  848.     l_len_err:
  849.     write_debug 'RECEIVED DATA LENGTH MISMATCH'
  850.     jmp l_fin
  851.  
  852.     l_tlvt_err:
  853.     write_debug 'TLV TYPE MISMATCH'
  854.     jmp l_fin
  855.  
  856.     l_ch_err:
  857.     write_debug 'FLAP CHANNEL MISMATCH'
  858.     jmp l_fin
  859.  
  860.     l_flap_err:
  861.     write_debug 'FLAP ID MISMATCH / RECEIVE ERROR'
  862.  
  863.     l_fin:
  864.  
  865.     ;
  866.     ; Необходимо закрыть сокет
  867.     ;
  868.     ;call srv_disconnect
  869.     ;call closesocket
  870.     l_end:
  871.     pop edx
  872.     ;pop ecx
  873.     pop ebx
  874.     pop eax
  875.     popf                         
  876.   ret                
  877.  
  878. ;
  879. ; Length of string
  880. ; input eax = offset string
  881. ; output eax = strlen
  882. ;
  883.   strlen:
  884.     push ebx
  885.     push ecx
  886.     pushf
  887.     xor ebx, ebx
  888.     xor ecx, ecx
  889.  
  890.     loop_s:
  891.     mov cl, [eax+ebx]
  892.     cmp ecx,0
  893.     jz  nl
  894.     inc ebx
  895.     jmp loop_s
  896.  
  897.     nl:
  898.     mov eax, ebx
  899.     popf
  900.     pop ecx
  901.     pop ebx
  902.   ret
  903.  
  904. ;
  905. ; Roasting password
  906. ; EAX = offset password
  907. ;
  908.  
  909.   roast:
  910.     pushf
  911.     push ecx
  912.     push ebx
  913.  
  914.     xor ecx, ecx
  915.     xor ebx, ebx
  916.  
  917.     loop_r:
  918.     mov bl, [eax+ecx] ;Символ из массива пароля
  919.     cmp bl, 0         ;Конец строки
  920.     jz r_fin
  921.    
  922.     xor bl, [ROASTING_ARRAY+ecx]
  923.     mov [eax+ecx], bl
  924.     inc ecx
  925.     jmp loop_r
  926.  
  927.     r_fin:
  928.     pop ebx
  929.     pop ecx
  930.     popf
  931.   ret
  932.  
  933.  
  934. ;
  935. ;Copy string of bytes
  936. ;В EAX = адрес исходной строки
  937. ;В EBX = адрес назначения
  938. ;В ECX = длина строки
  939. ;
  940.   strcpy:
  941.     pushf
  942.     push esi
  943.     push edi
  944.     push ecx
  945.  
  946.     cld      ;Обрабатываем строку от начала к концу
  947.     mov esi, eax
  948.     mov edi, ebx
  949.  
  950.     rep movsb
  951.  
  952.     pop ecx
  953.     pop edi
  954.     pop esi
  955.     popf    
  956.   ret
  957.  
  958.  
  959. ;
  960. ; Заполняет буфер, по адресу в ebx
  961. ; данными, по адресу eax, в
  962. ; cx  - Тип TLV
  963. ; dx  - длина данных
  964. ;
  965. ;
  966.  
  967.   tlvstr:
  968.     ;pushf
  969.     push edx
  970.     push ecx
  971.     push ebx
  972.  
  973.     mov [ebx], ch     ; Type
  974.     mov [ebx+1], cl
  975.  
  976.     mov [ebx+2], dh   ; Length
  977.     mov [ebx+3], dl
  978.    
  979.     lea ebx, [ebx+4]
  980.     ; EBX = offset of destination
  981.     mov ecx, edx
  982.  
  983.     call strcpy
  984.  
  985.     pop ebx
  986.     pop ecx
  987.     pop edx
  988.     ;popf
  989.   ret
  990.  
  991. ;
  992. ; eax - указатель на FLAP_head
  993. ; ebx - указатель на массив, заполненный данными
  994. ; ecx - хендл сокета
  995. ;
  996. ; В eax возвращает результат записи в сокет
  997. ;
  998.   sendflap:
  999.     pushf
  1000.     push edx
  1001.     ;push ecx
  1002.     push esi
  1003.     push ebx
  1004.     push ecx
  1005.  
  1006.     xor edx, edx
  1007.  
  1008.     mov dl, [eax]          ; ID byte
  1009.     mov [sbuff], dl
  1010.  
  1011.     mov dl, [eax+1]        ; FLAP channel
  1012.     mov [sbuff+1], dl
  1013.  
  1014.     mov dl, [eax+2]        ; FLAP datagramm seq number
  1015.     mov [sbuff+3], dl      ; меняем местами байты для передачи по сети
  1016.     mov dl, [eax+3]
  1017.     mov [sbuff+2], dl
  1018.  
  1019.     mov dl, [eax+4]        ; FLAP data size
  1020.     mov [sbuff+5], dl
  1021.     mov dl, [eax+5]
  1022.     mov [sbuff+4], dl
  1023.     mov dx, word [eax+4]
  1024.  
  1025.     xchg ecx, edx           ; ecx - size edx - handle
  1026.     mov eax, ebx            ; data
  1027.     mov ebx, sbuff          ; dest
  1028.     add ebx, 6              ; + header size
  1029.     call strcpy
  1030.  
  1031.     xchg ecx, edx           ; ecx - handle, edx - data size
  1032.  
  1033.     s_wait:
  1034.     mov eax, 53             ; Проверяем состояние сокета. Если соедиение
  1035.     mov ebx, 6              ; установлено - посылаем буфер, если сокет закрыт, уходим
  1036.     int 40h
  1037.     cmp eax, TCB_ESTABLISHED ; установлено
  1038.     jz s_est
  1039.     cmp eax, TCB_CLOSED
  1040.     jz s_fin
  1041.     cmp eax, 12            ;  У меня такое было, когда соединение устанавливалось с пустотой :-)
  1042.     jnc s_fin              ;
  1043.  
  1044.    
  1045.     mov eax, 5
  1046.     mov ebx, 1
  1047.     int 40h                ; Ждем
  1048.     jmp s_wait
  1049.  
  1050.  
  1051.     s_est:
  1052.     mov eax, 53
  1053.     mov ebx, 7             ; писать в сокет
  1054.     ;xchg ecx, edx          ; ecx - handle, edx - data length
  1055.     add edx, 6             ; + size of header
  1056.     mov esi, sbuff         ; data
  1057.     int 40h
  1058.  
  1059.     s_fin:
  1060.     pop ecx
  1061.     pop ebx
  1062.     pop esi
  1063.     ;pop ecx
  1064.     pop edx
  1065.     popf
  1066.   ret
  1067.  
  1068. ;
  1069. ; Принимает пакет из сокета
  1070. ; eax - указатель на FLAP_head
  1071. ; ebx - указатель на массив
  1072. ; ecx - хендл сокета
  1073. ; Возвращает в eax количество принятых байт в массиве
  1074. ;
  1075. ;  recvflap:
  1076. ;    pushf
  1077. ;
  1078. ;    ;push eax
  1079. ;    push ebx
  1080. ;    push esi
  1081. ;    push edi
  1082. ;    push edx
  1083. ;    mov esi, eax
  1084. ;    mov edi, ebx
  1085. ;
  1086. ;    r_fail:
  1087. ;    mov eax, 53         ;  Опрашивааем сокет
  1088. ;    mov ebx, 2          ;  в eax количество полученных байт
  1089. ;    int 40h             ;
  1090. ;    cmp eax, 6          ;  буфер не пустой
  1091. ;    jnc r_ok
  1092. ;    
  1093. ;    mov eax, 53         ;  Получаем состояние сокета
  1094. ;    mov ebx, 6          ;
  1095. ;    int 40h             ;
  1096. ;
  1097. ;    cmp eax, TCB_CLOSED ; закрыт - уходим
  1098. ;    jz r_err
  1099. ;
  1100. ;
  1101. ;   ;mov eax, 5         ; ждем
  1102. ;    ;mov ebx, 1
  1103. ;    ;int 40h
  1104. ;    ; уходим
  1105. ;
  1106. ;    ;jmp r_fail
  1107. ;    jmp rf_fin
  1108. ;
  1109. ;    r_ok:               ; В буфере данные
  1110. ;    
  1111. ;    mov eax, 53
  1112. ;    mov ebx, 3
  1113. ;    int 40h
  1114. ;    mov [esi], bl       ; flap.bId
  1115. ;    cmp bl, FLAP_ID
  1116. ;    jnz r_err
  1117. ;    
  1118. ;    mov eax, 53
  1119. ;    mov ebx, 3
  1120. ;    int 40h
  1121. ;    mov [esi+1], bl   ; flap.bCh
  1122. ;  
  1123. ;    mov eax, 53
  1124. ;    mov ebx, 3
  1125. ;    int 40h
  1126. ;    mov [esi+3], bl   ; flap.wSn старший байт
  1127. ;
  1128. ;    mov eax, 53
  1129. ;    mov ebx, 3
  1130. ;    int 40h
  1131. ;    mov [esi+2], bl   ; flap.wSn младший байт
  1132. ;
  1133. ;    mov eax, 53
  1134. ;    mov ebx, 3
  1135. ;    int 40h
  1136. ;    mov [esi+5], bl   ; flap.wDs старший байт
  1137. ;
  1138. ;    mov eax, 53
  1139. ;    mov ebx, 3
  1140. ;    int 40h
  1141. ;    mov [esi+4], bl   ; flap.wDs младший байт
  1142. ;
  1143. ;    r_check:
  1144. ;    mov eax, 53       ; Проверяем число полученных байт
  1145. ;    mov eax, 2
  1146. ;    int 40h
  1147. ;    
  1148. ;    xor ebx, ebx
  1149. ;    mov bx, word [esi+4] ; flap.wDs
  1150. ;    cmp eax, ebx
  1151. ;    jnc r_drr           ;>=
  1152. ;    
  1153. ;    mov eax, 68           ; wait
  1154. ;    mov ebx, 1
  1155. ;    int 40h
  1156. ;    jmp r_check
  1157. ;    
  1158. ;    r_drr:            ; ready for data  recive
  1159. ;
  1160. ;
  1161. ;    xor edx, edx
  1162. ;    mov dx, word [esi+4] ; flap.wDs
  1163. ;    xor esi, esi
  1164. ;    
  1165. ;    rf_loop:
  1166. ;    mov eax, 53
  1167. ;    mov ebx, 3
  1168. ;    int 40h
  1169. ;    mov [edi+esi], bl
  1170. ;    inc esi
  1171. ;    cmp esi, edx
  1172. ;    jnz rf_loop
  1173. ;    mov eax, edx
  1174. ;    jmp rf_fin
  1175. ;
  1176. ;    r_err:
  1177. ;    ;pop ebx
  1178. ;    ;pop eax
  1179. ;    mov eax, -1
  1180. ;    jmp rf_fin
  1181. ;
  1182. ;
  1183. ;    rf_fin:
  1184. ;    pop edx
  1185. ;    pop edi
  1186. ;    pop esi
  1187. ;    pop ebx
  1188. ;    ;pop eax
  1189. ;    popf
  1190. ;  ret
  1191.  
  1192. ;
  1193. ; eax - указатель на буфер
  1194. ; ebx - значение, которым необходимо затолнить. Используется только bl
  1195. ; ecx - размер
  1196. ;
  1197.  
  1198.   memset:
  1199.     pushf
  1200.     push edi
  1201.     push eax
  1202.     push ebx
  1203.     push ecx
  1204.  
  1205.     cld
  1206.     mov edi, eax
  1207.     mov eax, ebx
  1208.     rep stosb
  1209.  
  1210.     pop ecx
  1211.     pop ebx
  1212.     pop eax
  1213.     pop edi
  1214.     popf
  1215.   ret
  1216.  
  1217. ;
  1218. ; Парсим TLV
  1219. ; <-- в eax адрес TLV
  1220. ; <-- в ebx адрес буфера, который нужно заполнить
  1221. ; --> в ebx длина полученных данных
  1222. ; --> в eax тип TLV
  1223. ;
  1224.  
  1225.   tlvpar:
  1226.     pushf
  1227.     ;push esi
  1228.     ;push edi
  1229.     push ecx
  1230.     xor ecx, ecx
  1231.  
  1232.     mov cl, [eax+3]  ;TLV.Length
  1233.     mov ch, [eax+2]
  1234.     call strcpy
  1235.  
  1236.     xor eax, eax
  1237.     mov al, [ebx+1]  ;TLV.Type
  1238.     mov ah, [ebx]
  1239.     mov ebx, ecx
  1240.  
  1241.  
  1242.     pop ecx
  1243.     ;pop edi
  1244.     ;pop esi
  1245.     popf
  1246.   ret
  1247.  
  1248. ;
  1249. ;  <-- ECX - хендл сокета, который нужно закрыть
  1250. ;  --> ECX - Результат (Ненадежно)
  1251. ;
  1252.   closesocket:
  1253.     push eax
  1254.     push ebx
  1255.  
  1256.     mov eax, 53
  1257.     mov ebx, 8
  1258.     int 40h
  1259.  
  1260.     mov ecx, eax
  1261.  
  1262.     pop ebx
  1263.     pop eax
  1264.   ret
  1265.  
  1266. ;
  1267. ; ecx <-- хендл сокета
  1268. ;
  1269. ;
  1270.  
  1271.   srv_disconnect:
  1272.     pushf
  1273.     push eax
  1274.     push ebx
  1275.     mov [flap.bId], FLAP_ID
  1276.     mov [flap.bCh], 4      ;Disconnect
  1277.     xor eax, eax
  1278.     mov ax, [seq]
  1279.     mov [flap.wSn], ax
  1280.     mov [flap.wDs], 0
  1281.     mov eax, flap
  1282.     mov ebx, buff
  1283.     call sendflap
  1284.  
  1285.  
  1286.     pop ebx
  1287.     pop eax
  1288.     popf
  1289.   ret
  1290.  
  1291. ;
  1292. ; <-- eax [bos_address]
  1293. ; --> eax = IP ADDRESS
  1294. ; --> ebx = port number
  1295. ;
  1296. par_buff db 9 dup 0
  1297.  
  1298.   ip_parser:
  1299.     pushf
  1300.     push ecx
  1301.     push edx
  1302.     push esi
  1303.     push edi
  1304.  
  1305.     xor ecx, ecx
  1306.     ;xor eax, eax
  1307.     xor ebx, ebx
  1308.     xor edx, edx
  1309.     xor esi, esi
  1310.     xor edi, edi
  1311.    
  1312.     ip_loop:
  1313.     xor eax, eax
  1314.     ;xor edx, edx
  1315.     mov al, [bos_address+ecx]
  1316.     cmp al, '.'
  1317.     jz ip_dot
  1318.    
  1319.     cmp al, 0
  1320.     jz ip_end_str
  1321.    
  1322.     cmp al, ':'
  1323.     jz ip_colon
  1324.    
  1325.     ;sub al, 30h
  1326.     ;cmp al, 9
  1327.     ;ja ip_err        ; Не цифра
  1328.    
  1329.     mov [par_buff+edx], al
  1330.     inc ecx
  1331.     inc edx
  1332.     jmp ip_loop
  1333.  
  1334.     ip_dot:
  1335.     ;xor eax, eax
  1336.     mov [par_buff+edx], 0 ; Конец строки
  1337.     mov eax, par_buff
  1338.     call ascitoint
  1339.  
  1340.     ;data_debug 'Debug eax: ', eax
  1341.  
  1342.     cmp ecx, 0       ; Не может начинаться с точки
  1343.     jz ip_err
  1344.     shl esi, 8       ; Сдвигаем предыдущий байт
  1345.     add esi, eax
  1346.     inc ecx
  1347.     xor edx, edx     ; Счетчик буфера = 0
  1348.     jmp ip_loop
  1349.  
  1350.  
  1351.     ip_colon:         ; : В строке адреса
  1352.     inc edi           ; Было :
  1353.     jmp ip_dot
  1354.    
  1355.     ip_end_str:
  1356.     cmp edi, 1
  1357.     jz @f
  1358.                           ; : Не было
  1359.     mov [par_buff+edx], 0 ; Конец строки
  1360.     mov eax, par_buff
  1361.     call ascitoint
  1362.     shl esi, 8       ; Сдвигаем предыдущий байт
  1363.     add esi, eax
  1364.     ;mov eax, esi     ; IP в 16 ричной форме
  1365.     ;xor ebx, ebx    ; Номера порта нет
  1366.     jmp ip_end
  1367.  
  1368.     @@:                            ; Было :
  1369.     mov [par_buff+edx], 0          
  1370.     mov eax, par_buff
  1371.     call ascitoint
  1372.     mov ebx, eax
  1373.     jmp ip_end
  1374.  
  1375.     ip_err:
  1376.     xor esi, esi
  1377.  
  1378.     ip_end:
  1379.     mov eax, esi
  1380.  
  1381.     pop edi
  1382.     pop esi
  1383.     pop edx
  1384.     pop ecx
  1385.     popf
  1386.   ret
  1387.  
  1388. ;
  1389. ; <-- eax указатель на asci
  1390. ; --> eax int
  1391. ;
  1392.   ascitoint:
  1393.     pushf
  1394.     push ebx
  1395.     push ecx
  1396.     push edx
  1397.     push esi
  1398.     push edi
  1399.  
  1400.     xor ebx, ebx  
  1401.     xor ecx, ecx
  1402.     xor edx, edx
  1403.     ;xor esi, esi
  1404.     xor edi, edi
  1405.    
  1406.     ati_loop:
  1407.     mov bl, [eax+ecx]
  1408.     cmp bl, 0         ; Конец строки
  1409.     jz ati_str_end
  1410.     cmp bl, 39h
  1411.     ja ati_err        ; Не цифра
  1412.     cmp bl, 30h
  1413.     jb ati_err
  1414.  
  1415.     inc ecx
  1416.     jmp ati_loop
  1417.  
  1418.     ati_str_end:      ; В ecx длина строки
  1419.     ;dec ecx           ; Установим на последний символ
  1420.     add eax, ecx      ; Указатель на строку + Длина строки
  1421.     dec eax
  1422.    
  1423.     ati_loop2:
  1424.     cmp edx, ecx
  1425.     jz ati_all
  1426.     push eax
  1427.     sub eax, edx              ; Вычесть счетчик
  1428.     movzx ebx, byte [eax]     ; В bl символ
  1429.     ;pop eax
  1430.     sub bl, 30h       ; Вычисляем 10тичную цифру
  1431.  
  1432.     ;push eax
  1433.     mov eax, ebx     ; В eax - цифра
  1434.     mov ebx, 10      ; Множитель
  1435.  
  1436.     xor esi, esi
  1437.  
  1438.     ati_mul:
  1439.  
  1440.     cmp esi, edx     ; Умножаем на 10 n раз
  1441.     jz ati_mul_end
  1442.     ;push eax
  1443.     ;mov eax, ebx
  1444.     imul eax, ebx
  1445.     ;mov ebx, eax
  1446.     ;pop eax
  1447.     inc esi
  1448.     jmp ati_mul
  1449.  
  1450.  
  1451.     ati_mul_end:
  1452.     mov ebx, eax    ; В ebx вычисленное число
  1453.     pop eax
  1454.  
  1455.     add edi, ebx
  1456.     inc edx
  1457.     jmp ati_loop2
  1458.  
  1459.     ati_all:
  1460.     mov eax, edi
  1461.     jmp ati_end
  1462.  
  1463.     ati_err:
  1464.  
  1465.     ;ati_str_end:
  1466.     xor eax, eax
  1467.  
  1468.     ati_end:
  1469.     pop edi
  1470.     pop esi
  1471.     pop edx
  1472.     pop ecx
  1473.     pop ebx
  1474.     popf
  1475.   ret
  1476.  
  1477. ;
  1478. ;
  1479. ; <-- ecx хендл сокета
  1480. ; <-- eax указатель на структуру SNAC_head
  1481. ; <-- ebx указатель на данные
  1482. ; <-- edx размер данных
  1483. ; --> eax результат записи в сокет
  1484. ;
  1485.  
  1486. snac_buff db 1024 dup 0
  1487.  
  1488.   sendsnac:
  1489.     pushf
  1490.     push esi
  1491.     push edi
  1492.     push ebx
  1493.     push edx
  1494.     ;xor ebx, ebx
  1495.     mov esi, ecx            ; хендл сокета
  1496.     mov edi, ebx            ; Указатель на данные
  1497.  
  1498.     xor ebx, ebx
  1499.     mov bl, [eax]           ;
  1500.     mov [snac_buff+1], bl   ; Family ID
  1501.     mov bl, [eax+1]         ; Конвертируется в BigEndian
  1502.     mov [snac_buff], bl     ;
  1503.  
  1504.     mov bl, [eax+2]         ;
  1505.     mov [snac_buff+3], bl   ; Subtype ID
  1506.     mov bl, [eax+3]         ;
  1507.     mov [snac_buff+2], bl   ;
  1508.    
  1509.     mov bl, [eax+4]         ;
  1510.     mov [snac_buff+5], bl   ;
  1511.     mov bl, [eax+5]         ; Flags
  1512.     mov [snac_buff+4], bl   ;
  1513.  
  1514.     mov bl, [eax+6]         ;
  1515.     mov [snac_buff+9], bl   ;
  1516.     mov bl, [eax+7]         ;
  1517.     mov [snac_buff+8], bl   ;
  1518.     mov bl, [eax+8]         ; Reqest ID
  1519.     mov [snac_buff+7], bl   ;
  1520.     mov bl, [eax+9]         ;
  1521.     mov [snac_buff+6], bl   ;
  1522.  
  1523.     lea ebx, [snac_buff+10]                              
  1524.  
  1525.     mov eax, edi            ; Указатель на данные
  1526.     ;add ebx, 10             ; + размер заголовка SNAC
  1527.     mov ecx, edx            ; размер данных
  1528.     call strcpy
  1529.  
  1530.  
  1531.     mov ecx, esi            ; Хендл сокета
  1532.     mov [flap.bId], FLAP_ID
  1533.     mov [flap.bCh], 2       ; Канал для посылки SNAC
  1534.     xor ebx, ebx
  1535.     inc [seq]               ; seq Увеличивается на 1 при каждой посылке
  1536.     mov bx, [seq]
  1537.     mov [flap.wSn], bx
  1538.     add edx, 10             ; размер данных + размер заголовка SNAC
  1539.     mov [flap.wDs], dx
  1540.     mov eax, flap
  1541.     mov ebx, snac_buff
  1542.     call sendflap
  1543.  
  1544.     pop edx
  1545.     pop ebx
  1546.     pop edi
  1547.     pop esi
  1548.     popf
  1549.   ret
  1550.  
  1551.  
  1552.  
  1553. ; Обработка всех пактов, приходящих от сервера
  1554. ; ECX <-- Хендл сокета
  1555. ;
  1556. ;
  1557. ;
  1558. ;
  1559. ;        
  1560.   main_loop:
  1561.     pushf
  1562.     ;push eax
  1563.     ;push ebx
  1564.     ;push edx
  1565.     pushad
  1566.  
  1567.     mov ecx, [socket]
  1568.     ;
  1569.     ;  ждем пакет
  1570.     ;
  1571.   ;m_loop:
  1572.     ;mov eax, 53
  1573.     ;mov ebx, 2
  1574.     ;int 40h
  1575.     ;cmp eax, 6       ; размер заголоака FLAP
  1576.     ;jnc recived      ; >=
  1577.     ;
  1578.     ; Уходим
  1579.     ;
  1580.     ;jmp m_fin
  1581.     ;mov eax, 5
  1582.     ;mov ebx, 5
  1583.     ;int 40h
  1584.     ;jmp m_loop
  1585.     ;
  1586.     ;  есть пакет
  1587.     ;
  1588.   ;recived:
  1589.     ;mov eax, rflap
  1590.     ;mov ebx, rbuff
  1591.     ;call recvflap
  1592.     ;
  1593.     ; Определяем тип принятого FLAP
  1594.     ;
  1595.     xor ebx, ebx
  1596.     mov bl, [rflap.bCh]
  1597.     cmp bl, 1                ; Установка соединения
  1598.     jz  m_login
  1599.     cmp bl, 2
  1600.     jz m_snac                ; Получен SNAC
  1601.     cmp bl, 3
  1602.     jz m_flap_err            ; FLAP-level error
  1603.     cmp bl, 4
  1604.     jz m_close_conn          ; Закрытие соединения
  1605.     cmp bl, 5
  1606.     jz m_keep_alive          ;
  1607.     ;
  1608.     ; Обработка рассоединения
  1609.     ;
  1610.   m_close_conn:
  1611.     write_debug 'Another Computer is Using YOUR UIN!'
  1612.     call srv_disconnect
  1613.     call closesocket
  1614.     jmp m_fin
  1615.     ;
  1616.     ; обработка соединения
  1617.     ;
  1618.   m_login:
  1619.     ;
  1620.     ; проверяем версию протокола
  1621.     ;
  1622.     xor eax, eax
  1623.     mov al, [mbuff+3]
  1624.     cmp eax, 1
  1625.     jnz m_login_other    ; Не подходит
  1626.  
  1627.  
  1628.     ;
  1629.     ; генерируем случайный seq
  1630.     ; Для этого берем время, прошедшее с момента запуска системы
  1631.     ;
  1632.     mov eax, 26
  1633.     mov ebx, 9
  1634.     int 40h
  1635.     mov [seq], ax
  1636.     ;
  1637.     ; Отдаем серверу cookie
  1638.     ;
  1639.     mov [flap.bCh], 1
  1640.     mov [flap.wSn], ax
  1641.     xor eax, eax
  1642.     mov ax, [cookie_len]
  1643.     add eax, 8            ; TLV len + protocol version len
  1644.     mov [flap.wDs], ax
  1645.     mov dword [buff], 01000000h  ; 00 00 00 01 Номер протокола
  1646.     mov word [buff+4], 0600h     ; 00 06   TLV.Type
  1647.  
  1648.     mov ax, [cookie_len]
  1649.     mov [buff+6], ah             ;
  1650.     mov [buff+7], al             ; TLV.Length
  1651.  
  1652.     mov edx, ecx                 ; edx <-- socket handle
  1653.  
  1654.     mov ecx, eax                 ; ecx <-- cookie len
  1655.     mov eax, srv_cookie          ; Src
  1656.     lea ebx, [buff+8]
  1657.     call strcpy
  1658.    
  1659.     mov ecx, edx                 ; ecx <-- socket handle
  1660.     mov eax, flap
  1661.     mov ebx, buff
  1662.     call sendflap
  1663.     jmp m_fin
  1664.  
  1665.     m_login_other:
  1666.     jmp m_fin
  1667.  
  1668.     ;
  1669.     ; Как обработать ошибку, я не знаю
  1670.     ;
  1671.   m_flap_err:
  1672.   jmp m_fin
  1673.  
  1674.     ;
  1675.     ; Пока не обрабатывается
  1676.     ;
  1677.   m_keep_alive:
  1678.   jmp m_fin
  1679.  
  1680.  
  1681.     ;
  1682.     ; Получен SNAC
  1683.     ; Распознаем его тип
  1684.     ;
  1685.   m_snac:
  1686.     mov eax, rsnac
  1687.     mov ebx, mbuff
  1688.     call snacpar
  1689.     xor ebx, ebx
  1690.     xor edx, edx
  1691.     mov bx, [rsnac.wFid]
  1692.     mov dx, [rsnac.wSid]
  1693.  
  1694.     cmp bx, 1
  1695.     jz m_snac_1              ;Generic service controls
  1696.     cmp bx, 2
  1697.     jz m_snac_2              ;Location services
  1698.     cmp bx, 3
  1699.     jz m_snac_3              ;Buddy List management service
  1700.     cmp bx, 4
  1701.     jz m_snac_4              ;ICBM (messages) service
  1702.     cmp bx, 9
  1703.     jz m_snac_9              ;Privacy management service
  1704.     cmp bx, 015h
  1705.     jz m_snac_15             ;ICQ specific extensions service
  1706.     cmp bx, 013h
  1707.     jz m_snac_13             ;Server Side Information (SSI) service
  1708.    
  1709.     jmp m_other_snac
  1710.     ;
  1711.     ;   FAMILY 1
  1712.     ;
  1713.   m_snac_1:
  1714.     cmp dx, 7
  1715.     jz m_snac_1_7
  1716.     cmp dx, 3
  1717.     jz m_snac_1_3
  1718.     cmp dx, 018h
  1719.     jz m_snac_1_18
  1720.     cmp dx, 01Fh
  1721.     jz m_snac_1_f
  1722.     cmp dx, 13h
  1723.     jz m_snac_13
  1724.     cmp dx, 1
  1725.     jz m_snac_1_1
  1726.     jmp m_snac_1_other
  1727.     ;
  1728.     ; Rate limits information response
  1729.     ;
  1730.   m_snac_1_7:              ; Отвечаем
  1731.     mov [ssnac.wFid], 1    ; Family
  1732.     mov [ssnac.wSid], 8    ; Subtype
  1733.     mov [ssnac.dRi], 8
  1734.     mov word [buff], 0100h   ; 0001
  1735.     mov word [buff+2], 0200h ; 0002
  1736.     mov word [buff+4], 0300h ; 0003
  1737.     mov word [buff+6], 0400h ; 0004
  1738.     mov word [buff+8], 0500h ; 0005
  1739.     mov eax, ssnac
  1740.     mov ebx, buff
  1741.     mov edx, 10              ; Размер данных
  1742.     call sendsnac
  1743.     ;
  1744.     ; Client ask server location service limitations
  1745.     ;
  1746.     mov [ssnac.wFid], 2    ; Family
  1747.     mov [ssnac.wSid], 2    ; Subtype
  1748.     mov [ssnac.dRi], 2
  1749.     mov eax, ssnac
  1750.     mov ebx, buff
  1751.     xor edx, edx
  1752.     call sendsnac
  1753.  
  1754.     jmp m_fin
  1755.  
  1756.     ;
  1757.     ;  Server supported snac families list
  1758.     ;
  1759.   m_snac_1_3:
  1760.     ;
  1761.     ;  Server sends supported services list
  1762.     ;
  1763.  
  1764.     ;
  1765.     ;   SNAC(01,17)      
  1766.     ;   Client ask for services version numbers
  1767.     ;
  1768.     mov [ssnac.wFid], 1    ; Family
  1769.     mov [ssnac.wSid], 17h    ; Subtype
  1770.     mov [ssnac.dRi], 17h
  1771.     ;
  1772.     ;   Список сервисов, которые нам нужны
  1773.     ;
  1774.     ;    xx xx          word            family number #1
  1775.     ;    xx xx          word            family version
  1776.     ;      ...           ...             ...
  1777.     ;
  1778.  
  1779.     ;
  1780.     ; Поправил из дампа &RQ
  1781.     ;
  1782.     mov word [buff], 0100h   ; 0001
  1783.     mov word [buff+2], 0300h ; 0003
  1784.  
  1785.     mov word [buff+4], 1300h ; 0013
  1786.     mov word [buff+6], 0200h ; 0002
  1787.  
  1788.     mov word [buff+8], 0200h ; 0002
  1789.     mov word [buff+10], 0100h ; 0001
  1790.  
  1791.     mov word [buff+12], 0300h ; 0002
  1792.     mov word [buff+14], 0100h ; 0001
  1793.  
  1794.     mov word [buff+16], 1500h ; 0015
  1795.     mov word [buff+18], 0100h ; 0001
  1796.  
  1797.     mov word [buff+20], 0400h ; 0004
  1798.     mov word [buff+22], 0100h ; 0001
  1799.  
  1800.     mov word [buff+24], 0600h ; 0006
  1801.     mov word [buff+26], 0100h ; 0001
  1802.  
  1803.     mov word [buff+28], 0900h ; 0009
  1804.     mov word [buff+30], 0100h ; 0001
  1805.  
  1806.     mov word [buff+32], 1300h ; 0013
  1807.     mov word [buff+34], 0400h ; 0004
  1808.  
  1809.     mov word [buff+36], 1500h ; 0015
  1810.     mov word [buff+38], 0400h ; 0004
  1811.  
  1812.     mov word [buff+40], 1000h ; 0010
  1813.     mov word [buff+42], 0100h ; 0001
  1814.  
  1815.  
  1816.  
  1817.     mov eax, ssnac
  1818.     mov ebx, buff
  1819.     mov edx, 44
  1820.     call sendsnac
  1821.  
  1822.     jmp m_fin
  1823.  
  1824.  
  1825.     ;
  1826.     ; Server services versions
  1827.     ;
  1828.   m_snac_1_18:
  1829.     ;
  1830.     ; Обработки пока нет
  1831.     ;
  1832.  
  1833.     ;
  1834.     ; Client ask server for rate limits info
  1835.     ; SNAC(01,06)
  1836.     ;
  1837.     mov [ssnac.wFid], 1    ; Family
  1838.     mov [ssnac.wSid], 6    ; Subtype
  1839.     mov [ssnac.dRi], 6
  1840.     mov eax, ssnac
  1841.     mov ebx, buff
  1842.     xor edx, edx
  1843.     call sendsnac
  1844.  
  1845.  
  1846.  
  1847.     jmp m_fin
  1848.  
  1849.     ;
  1850.     ; Requested online info response
  1851.     ;
  1852.   m_snac_1_f:
  1853.     ;
  1854.     ;Тут должна быть наша информация, пока обработки нет
  1855.     ;
  1856.  
  1857.  
  1858.     jmp m_fin
  1859.  
  1860.     ;
  1861.     ; Message of the day (MOTD)
  1862.     ;
  1863.   m_snac_1_13:
  1864.     ;
  1865.     ; Нечего обрабатывать :-))
  1866.     ;
  1867.     jmp m_fin
  1868.  
  1869.     ;
  1870.     ; Сообщение об ошибке
  1871.     ;
  1872.  
  1873.   m_snac_1_1:
  1874.     xor eax, eax
  1875.     mov ax, word [mbuff+10]
  1876.     call ntohs
  1877.     data_debug 'SERVER SEND ERROR #', eax
  1878.  
  1879.  
  1880.     jmp m_fin
  1881.  
  1882.  
  1883.   m_snac_1_other:
  1884.      data_debug 'Unknown SNAC Family 1 received, type ', edx
  1885.      jmp m_fin
  1886.  
  1887.  
  1888.  
  1889.     ;
  1890.     ; Family 2
  1891.     ;
  1892.   m_snac_2:
  1893.     cmp dx, 3
  1894.     jz m_snac_2_3
  1895.     jmp m_snac_2_other
  1896.     ;
  1897.     ; Server replies via location service limitations
  1898.     ;
  1899.   m_snac_2_3:
  1900.     ;
  1901.     ;  Обработки пока нет
  1902.     ;
  1903.  
  1904.     ;
  1905.     ;  посылаем capabilities / profile
  1906.     ;
  1907.     mov [ssnac.wFid], 2    ; Family
  1908.     mov [ssnac.wSid], 4    ; Subtype
  1909.     mov [ssnac.dRi], 4
  1910.  
  1911.     ;mov eax, CAPABILITIES
  1912.     ;mov ebx, buff
  1913.     ;push ecx
  1914.     ;mov ecx, 5             ; TLV.Type(0x05) - CLSID values
  1915.     ;mov edx, C_LEN
  1916.     ;call tlvstr
  1917.     ;pop ecx
  1918.     mov word [buff], 0500h  ; 00 05
  1919.     mov eax, C_LEN
  1920.     call htons
  1921.     mov word [buff+2], ax
  1922.  
  1923.  
  1924.  
  1925.     push ecx
  1926.  
  1927.     mov eax, CAPABILITIES
  1928.     lea ebx, [buff+4]
  1929.     mov ecx, C_LEN
  1930.     call strcpy
  1931.  
  1932.     pop ecx
  1933.  
  1934.  
  1935.     mov eax, ssnac
  1936.     mov ebx, buff
  1937.     mov edx, C_LEN+4            ; Длина данных+размер заголовка TLV
  1938.     call sendsnac
  1939.  
  1940.     ;
  1941.     ; запрашиваем server BLM service limitations
  1942.     ;
  1943.     mov [ssnac.wFid], 3    ; Family
  1944.     mov [ssnac.wSid], 2    ; Subtype
  1945.     mov [ssnac.dRi], 2
  1946.     mov eax, ssnac
  1947.     mov ebx, buff
  1948.     xor edx, edx
  1949.     call sendsnac
  1950.  
  1951.  
  1952.     jmp m_fin
  1953.  
  1954.   m_snac_2_other:
  1955.     write_debug 'Unknown SNAC Family 2 Recived'
  1956.     jmp m_fin
  1957.  
  1958.  
  1959.  
  1960.     ;
  1961.     ;  FAMILY 3
  1962.     ;
  1963.   m_snac_3:
  1964.     cmp dx, 3
  1965.     jz m_snac_3_3
  1966.     cmp dx, 0Bh
  1967.     jz m_snac_3_b
  1968.     cmp dx, 0Ch
  1969.     jz m_snac_3_c
  1970.     jmp m_snac_3_other
  1971.  
  1972.     ;
  1973.     ; Server replies via BLM service limitations
  1974.     ;
  1975.   m_snac_3_3:
  1976.     ;
  1977.     ; Обработки пока нет
  1978.     ;
  1979.  
  1980.     ;
  1981.     ; Client ask server for ICBM service parameters
  1982.     ;
  1983.     mov [ssnac.wFid], 4    ; Family
  1984.     mov [ssnac.wSid], 4    ; Subtype
  1985.     mov [ssnac.dRi], 4     ; request-id
  1986.     mov eax, ssnac
  1987.     mov ebx, buff
  1988.     xor edx, edx
  1989.     call sendsnac
  1990.  
  1991.  
  1992.  
  1993.     jmp m_fin
  1994.  
  1995.     ;
  1996.     ;  User online notification
  1997.     ;
  1998.   m_snac_3_b:
  1999.     ;
  2000.     ; Из всей информации пока нужен только статус
  2001.     ;
  2002.     xor edx, edx           ; Счетчик
  2003.     xor ecx, ecx
  2004.     xor eax, eax
  2005.     cld             ; В направлении увеличения адресов
  2006.  
  2007.     dec edx
  2008.   m_snac_3_b_loop:
  2009.     inc edx
  2010.     cmp edx, UINS
  2011.     jnc m_snac_3_b_end     ;>=
  2012.  
  2013.     mov cl, [mbuff+10]     ; Длина УИН
  2014.     mov eax, ecx
  2015.     mov edi, UIN_LEN
  2016.     imul edi ,edx
  2017.     lea edi, [uins+edi]    
  2018.     lea esi, [mbuff+11]
  2019.     repe cmpsb
  2020.    
  2021.     jnz m_snac_3_b_loop
  2022.     ;
  2023.     ; UIN Определен
  2024.     ;
  2025.  
  2026.     lea ecx, [eax+10+11]           ; +sizeof SNAC_head + offset #2 TLV
  2027.     mov ax, word [mbuff+ecx]            ;#2 TLV.Type
  2028.     cmp ax, 0C00h                  ;dc info (optional)
  2029.     jz m_snac_3_b_dc
  2030.     cmp ax, 0A00h                  ;external ip address
  2031.     jz m_snac_3_b_extip
  2032.     jmp m_snac_3_b_bad_tlv
  2033.    
  2034.  
  2035.   m_snac_3_b_dc:
  2036.     ;
  2037.     ; Пропускаем этот TLV
  2038.     ;
  2039.     lea ecx, [ecx+41]
  2040.   m_snac_3_b_extip:
  2041.     ;
  2042.     ; И этот :-)
  2043.     lea ecx, [ecx+8]
  2044.     mov ax, word [mbuff+ecx]
  2045.     cmp ax, 0600h                 ;TLV.Type(0x0A) - external ip address
  2046.     jz m_snac_3_b_status
  2047.     jmp m_snac_3_b_bad_tlv
  2048.  
  2049.   m_snac_3_b_status:
  2050.     ;
  2051.     ; наконец-то статус 8-)
  2052.     ;
  2053.     mov eax, dword [mbuff+ecx+4]
  2054.     call ntohl
  2055.     ;mov ebx, 4
  2056.     ;imul ebx, edx
  2057.     ;mov [stats+ebx], eax
  2058.     mov ecx, eax
  2059.     mov ebx, NAME_LEN
  2060.     imul ebx, edx
  2061.     lea ebx, [names+ebx]
  2062.     mov eax, edx
  2063.     call loadbb
  2064.     jmp m_fin
  2065.  
  2066.  
  2067.   m_snac_3_b_bad_tlv:
  2068.     write_debug 'TLV Type Mismatch in SNAC(3,b)'
  2069.     jmp m_fin
  2070.  
  2071.   m_snac_3_b_end:
  2072.     write_debug 'UIN not in local Contact List'
  2073.     jmp m_fin
  2074.  
  2075.  
  2076.  
  2077.   m_snac_3_c:
  2078.     ;
  2079.     ; User offline notification
  2080.     ;
  2081.   xor edx, edx
  2082.   xor ecx, ecx
  2083.  
  2084.     dec edx
  2085.     m_snac_3_c_loop:
  2086.     inc edx
  2087.     cmp edx, UINS
  2088.     jnc m_snac_3_b_end     ;>=
  2089.  
  2090.     mov cl, [mbuff+10]     ; Длина УИН
  2091.     mov edi, UIN_LEN
  2092.     imul edi ,edx
  2093.     lea edi, [uins+edi]    
  2094.     lea esi, [mbuff+11]
  2095.     repe cmpsb
  2096.     jnz m_snac_3_c_loop
  2097.     ;
  2098.     ; UIN Определен
  2099.     ;
  2100.     ;mov eax, -1
  2101.     ;mov ebx, 4
  2102.     ;imul ebx, edx
  2103.     ;mov [stats+ebx], eax
  2104.     mov ecx, -1
  2105.     mov ebx, NAME_LEN
  2106.     imul ebx, edx
  2107.     lea ebx, [names+ebx]
  2108.     mov eax, edx
  2109.     call loadbb
  2110.     jmp m_fin
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.  
  2117.   m_snac_3_other:
  2118.     write_debug 'Unknown SNAC Family 3 Received'
  2119.     jmp m_fin
  2120.  
  2121.  
  2122.     ;
  2123.     ;  FAMILY 4
  2124.     ;
  2125.   m_snac_4:
  2126.     cmp dx, 5
  2127.     jz m_snac_4_5
  2128.     cmp dx, 7
  2129.     jz m_snac_4_7
  2130.     jmp m_snac_4_other
  2131.  
  2132.     ;
  2133.     ;  Server sends ICBM service parameters to client
  2134.     ;
  2135.   m_snac_4_5:
  2136.     ;
  2137.     ;  Обработки пока нет
  2138.     ;
  2139.  
  2140.     ;
  2141.     ;  Client change default ICBM parameters command
  2142.     ;
  2143.     mov [ssnac.wFid], 4    ; Family
  2144.     mov [ssnac.wSid], 2    ; Subtype
  2145.     mov [ssnac.dRi], 2     ; request-id
  2146.  
  2147.     mov eax, ICBM_PARAMS
  2148.     mov ebx, buff
  2149.     push ecx
  2150.     mov ecx, ICBMP_LEN
  2151.     call strcpy
  2152.     pop ecx
  2153.  
  2154.     mov eax, ssnac
  2155.     mov ebx, buff
  2156.     mov edx, ICBMP_LEN
  2157.     call sendsnac
  2158.  
  2159.     ;
  2160.     ;   Client ask server PRM service limitations
  2161.     ;
  2162.     mov [ssnac.wFid], 9    ; Family
  2163.     mov [ssnac.wSid], 2    ; Subtype
  2164.     mov [ssnac.dRi], 2     ; request-id
  2165.     mov eax, ssnac
  2166.     mov ebx, buff
  2167.     xor edx, edx
  2168.     call sendsnac
  2169.  
  2170.  
  2171.     jmp m_fin
  2172.  
  2173.     ;
  2174.     ;  Message for client from server
  2175.     ;
  2176.   m_snac_4_7:
  2177.     ;
  2178.     ;  Определяем тип сообщения по полю message channel
  2179.     ;
  2180.     xor eax, eax
  2181.     mov ax, word [mbuff+10+8]           ; +10 - размер SNAC
  2182.                                         ; +8 смещение до message channel
  2183.     cmp ax, 0100h                       ; 00 01
  2184.     jz m_snac_ch1
  2185.     cmp ax, 0200h
  2186.     jz m_snac_ch2
  2187.     cmp ax, 0400h
  2188.     jz m_snac_ch4
  2189.     jmp m_ch_other
  2190.     ;
  2191.     ;  channel 1 plain text
  2192.     ;
  2193.   m_snac_ch1:
  2194.     ;
  2195.     ; Т.к в очередной раз описание протокола не совпадает с реальностью
  2196.     ; разбираем все TLV по порядку
  2197.  
  2198.     mov eax, dword [mbuff+10]          ; cookie
  2199.     mov [msg_cookie1], eax
  2200.     mov eax, dword [mbuff+10+4]
  2201.     mov [msg_cookie2], eax             ; Используются для потверждения приема сообщений
  2202.  
  2203.     mov al, [mbuff+10+10]              ; Sender UIN length
  2204.     mov [ui.bUinLength], al
  2205.  
  2206.     push ecx
  2207.     movzx ecx, al
  2208.  
  2209.     lea eax, [mbuff+10+11]             ; UIN string
  2210.     lea ebx, [ui.bUin]                 ; Dest
  2211.     call strcpy
  2212.  
  2213.     lea ecx, [ecx+10+15]               ; первый TLV
  2214.    
  2215.  
  2216.  m_snac_ch1_loop:
  2217.  
  2218.     movzx eax, word [mbuff+ecx]
  2219.     cmp eax, 0100h                     ;TLV.Type(0x01) - user class
  2220.     jz m_snac_ch1_1
  2221.     cmp eax, 0600h                     ;TLV.Type(0x06) - user status
  2222.     jz m_snac_ch1_6
  2223.     cmp eax, 0800h                     ; Unknown type
  2224.     jz m_snac_ch1_8
  2225.     cmp eax, 0500h                     ; Unknown type
  2226.     jz m_snac_ch1_5
  2227.     cmp eax, 0F00h                     ; TLV.Type(0x0f) - user idle time
  2228.     jz m_snac_ch1_f
  2229.     cmp eax, 0300h                     ; TLV.Type(0x03) - account creation time
  2230.     jz m_snac_ch1_3
  2231.     cmp eax, 0400h                     ; TLV.Type(0x04) - automated response flag
  2232.     jz m_snac_ch1_4
  2233.     cmp eax, 0200h                     ; TLV.Type(0x02) - message data
  2234.     jz m_snac_ch1_mess
  2235.     jmp m_snac_msg_tlv_err
  2236.  
  2237.     ;
  2238.     ; Возможно, дополнительная ииформация будет обрабатываться
  2239.     ; но пока нет
  2240.  
  2241.   m_snac_ch1_1:
  2242.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2243.     call ntohs
  2244.     lea ecx, [eax+ecx+4]
  2245.     jmp m_snac_ch1_loop
  2246.  
  2247.   m_snac_ch1_6:
  2248.  
  2249.     mov eax, dword [mbuff+ecx+4]            ; User status
  2250.     call ntohl
  2251.     mov [ui.dUserStatus], eax
  2252.  
  2253.  
  2254.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2255.     call ntohs
  2256.     lea ecx, [eax+ecx+4]
  2257.     ;
  2258.     ;
  2259.    
  2260.    
  2261.     jmp m_snac_ch1_loop
  2262.  
  2263.   m_snac_ch1_8:
  2264.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2265.     call ntohs
  2266.     lea ecx, [eax+ecx+4]
  2267.     jmp m_snac_ch1_loop
  2268.  
  2269.   m_snac_ch1_5:
  2270.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2271.     call ntohs
  2272.     lea ecx, [eax+ecx+4]
  2273.     jmp m_snac_ch1_loop
  2274.  
  2275.   m_snac_ch1_f:
  2276.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2277.     call ntohs
  2278.     lea ecx, [eax+ecx+4]
  2279.     jmp m_snac_ch1_loop
  2280.  
  2281.   m_snac_ch1_3:
  2282.     movzx eax, word [mbuff+ecx+2]       ; TLV.Length
  2283.     call ntohs
  2284.     lea ecx, [eax+ecx+4]
  2285.     jmp m_snac_ch1_loop
  2286.  
  2287.  
  2288.   m_snac_ch1_4:
  2289.     ;movzx eax, word [buff+ecx+2]       ; TLV.Length
  2290.     lea ecx, [ecx+4]
  2291.     jmp m_snac_ch1_loop
  2292.  
  2293.  
  2294.  
  2295.   m_snac_ch1_mess:
  2296.     ;
  2297.     ;
  2298.     movzx eax, word [mbuff+ecx+4]    ;
  2299.     cmp eax, 0105h                   ; 05 fragment identifier (array of required capabilities)
  2300.     jnz m_snac_ch1_fr_err            ; 01 fragment version
  2301.  
  2302.     movzx eax, word [mbuff+ecx+6]    ; Length
  2303.     call ntohs
  2304.  
  2305.     lea ecx, [ecx+eax+8]             ; Пропускаем  byte array of required capabilities (1 - text)
  2306.  
  2307.     movzx eax, word [mbuff+ecx]      ;  fragment identifier (message text)
  2308.     cmp eax, 0101h                   ;  fragment version
  2309.     jnz m_snac_ch1_fr_err
  2310.  
  2311.     movzx eax, word [mbuff+ecx+2]    ; TLV Length
  2312.     call ntohs
  2313.     xchg eax, ecx
  2314.  
  2315.     lea eax, [eax+8]                 ; Начало текстового сообщения
  2316.     lea ecx, [ecx-4]                 ; - sizeof Message charset number, Message charset subset
  2317.  
  2318.     push eax
  2319.     push ecx
  2320.  
  2321.     ;
  2322.     ;  Выводим Message From UIN
  2323.     ;
  2324.  
  2325.     mov eax, MESS
  2326.     call strlen
  2327.     mov ecx, eax
  2328.  
  2329.     mov eax, MESS
  2330.     mov ebx, buff
  2331.     call strcpy
  2332.  
  2333.     lea ebx, [ebx+ecx]
  2334.     lea eax, [ui.bUin]
  2335.     movzx ecx, byte [ui.bUinLength]
  2336.     call strcpy
  2337.  
  2338.     mov [ebx+ecx], byte 0
  2339.  
  2340.     mov eax, buff
  2341.     xor ebx, ebx
  2342.  
  2343.     call writemsg
  2344.     ;
  2345.     ;  Само сообщение
  2346.     ;
  2347.  
  2348.     pop ecx
  2349.     pop eax
  2350.     lea eax, [mbuff+eax]
  2351.  
  2352.     mov ebx, buff
  2353.     call strcpy
  2354.     mov [ebx+ecx], byte 0
  2355.    
  2356.     mov eax, buff
  2357.     call win2dos
  2358.     mov ebx, 00FF0000h
  2359.     call writemsg
  2360.  
  2361.     ;
  2362.     ;  Подтверждаем прием
  2363.     ;
  2364.  
  2365.     pop ecx
  2366.     ;
  2367.     ; Пока не реализовано, т.к. не могу найти клиент, который это использует :-)
  2368.     ;
  2369.  
  2370.     jmp m_fin
  2371.  
  2372.   m_snac_msg_tlv_err:
  2373.     write_debug 'TLV TYPE MISMATCH'
  2374.     pop ecx
  2375.     jmp m_fin
  2376.  
  2377.   m_snac_ch1_fr_err:
  2378.     write_debug 'UNKNOWN FRAGMENT IDENTIFIER OR FRAGMENT VERSION'
  2379.  
  2380.   ;m_snac_ch1_end:
  2381.     pop ecx
  2382.  
  2383.     jmp m_fin
  2384.  
  2385.     ;
  2386.     ;   Channel 2 message format (rtf messages, rendezvous)
  2387.     ;
  2388.   m_snac_ch2:
  2389.     ;
  2390.     ;  отправим сообщение, что канал не поддерживается
  2391.     ;  нужны куки и уин
  2392.     mov eax, dword [mbuff+10]
  2393.     mov [msg_cookie1], eax
  2394.     mov eax, dword [mbuff+10+4]
  2395.     mov [msg_cookie2], eax
  2396.  
  2397.     mov al, [mbuff+10+10]              ; Sender UIN length
  2398.     mov [ui.bUinLength], al
  2399.  
  2400.     push ecx
  2401.     movzx ecx, al
  2402.  
  2403.     lea eax, [mbuff+10+11]             ; UIN string
  2404.     lea ebx, [ui.bUin]                 ; Dest
  2405.     call strcpy
  2406.  
  2407.  
  2408.     mov [ssnac.wFid], 4      ; Family
  2409.     mov [ssnac.wSid], 0Bh    ; Subtype
  2410.     mov [ssnac.dRi], 0Bh
  2411.  
  2412.     mov eax, [msg_cookie1]
  2413.     mov dword [buff], eax
  2414.     mov eax, [msg_cookie2]
  2415.     mov dword [buff+4], eax
  2416.     mov word [buff+8], 0200h      ; Channel 2
  2417.  
  2418.     mov al, [ui.bUinLength]
  2419.     mov [buff+10], al
  2420.     lea eax, [ui.bUin]
  2421.     lea ebx, [buff+11]
  2422.     call strcpy
  2423.     lea ecx, [ecx+11]
  2424.  
  2425.     mov word [buff+ecx], 0100h    ; reason code (1 - unsupported channel, 2 - busted payload, 3 - channel specific)
  2426.     mov edx, ecx
  2427.  
  2428.     pop ecx
  2429.     mov eax, ssnac
  2430.     mov ebx, buff
  2431.     call sendsnac
  2432.  
  2433.  
  2434.     jmp m_fin
  2435.  
  2436.     ;
  2437.     ;  Channel 4 message format (typed old-style messages)
  2438.     ;
  2439.   m_snac_ch4:
  2440.  
  2441.  
  2442.  
  2443.   m_ch_other:
  2444.     write_debug 'Unknown message channel'
  2445.  
  2446.     jmp m_fin
  2447.  
  2448.  
  2449.   m_snac_4_other:
  2450.     write_debug 'Unknown SNAC Family 4 received'
  2451.     jmp m_fin
  2452.  
  2453.  
  2454.  
  2455.     ;
  2456.     ; FAMILY 9
  2457.     ;
  2458.   m_snac_9:
  2459.     cmp dx, 3
  2460.     jz m_snac_9_3
  2461.     jmp m_snac_9_other
  2462.  
  2463.     ;
  2464.     ; Server sends PRM service limitations to client
  2465.     ;
  2466.   m_snac_9_3:
  2467.     ;
  2468.     ; Обработки пока нет
  2469.     ;
  2470.  
  2471.  
  2472.     ; Отключено, тк не поддерживается SIQ
  2473.     ;
  2474.  
  2475.     ;
  2476.     ;  Client ask server for SSI service limitations
  2477.     ;
  2478.     ;mov [ssnac.wFid], 13h  ; Family
  2479.     ;mov [ssnac.wSid], 2    ; Subtype
  2480.     ;mov [ssnac.dRi], 2     ; request-id
  2481.     ;mov eax, ssnac
  2482.     ;mov ebx, buff
  2483.     ;xor edx, edx
  2484.     ;call sendsnac
  2485.  
  2486.     ;
  2487.     ; последняя стадия соединения
  2488.     ;
  2489.  
  2490.     ;
  2491.     ; Запрашиваем свою информацию
  2492.     ;
  2493.     mov [ssnac.wFid], 1  ; Family
  2494.     mov [ssnac.wSid], 0Eh    ; Subtype
  2495.     mov [ssnac.dRi], 0Eh     ; request-id
  2496.  
  2497.     mov eax, ssnac
  2498.     mov ebx, buff
  2499.     xor edx, edx             ; TLV head len
  2500.     call sendsnac
  2501.  
  2502.  
  2503.     ;
  2504.     ; Client sends its DC info and status to server
  2505.     ;
  2506.     mov [ssnac.wFid], 1  ; Family
  2507.     mov [ssnac.wSid], 1Eh    ; Subtype
  2508.     mov [ssnac.dRi], 1Eh     ; request-id
  2509.  
  2510.     mov [buff], 0           ;  TLV type 06
  2511.     mov [buff+1], 6h        ;
  2512.     mov [buff+2], 0         ;  TLV data length
  2513.     mov [buff+3], 4         ;
  2514.     ;
  2515.     ;
  2516.     mov ax, STATUS_DCDISABLED  ; DC disabled
  2517.     call htons
  2518.     mov word [buff+4], ax
  2519.     mov ax, STATUS_ONLINE
  2520.     mov [status], ax
  2521.     mov word [buff+6], ax
  2522.  
  2523.     mov eax, ssnac
  2524.     mov ebx, buff
  2525.     mov edx, 8           ; TLV head len+ data len
  2526.     call sendsnac
  2527.  
  2528.  
  2529.     ;
  2530.     ;  Выгружаем на сервер КЛ
  2531.     ;
  2532.     call uploadkl
  2533.  
  2534.     ;
  2535.     ; Выгружаем инвизибл лист, пока пустой
  2536.     ;
  2537.     mov [ssnac.wFid], 9  ; Family
  2538.     mov [ssnac.wSid], 7    ; Subtype
  2539.     mov [ssnac.dRi], 7
  2540.  
  2541.     mov eax, ssnac
  2542.     mov ebx, buff
  2543.     xor edx, edx
  2544.     call sendsnac
  2545.  
  2546.     ;
  2547.     ; В &RQ Есть пакет установки разрешений. я использую его без изменения
  2548.     ;  т.к. не знаю, что он содержит
  2549.     ;
  2550.  
  2551.     mov [ssnac.wFid], 15  ; Family
  2552.     mov [ssnac.wSid], 2    ; Subtype
  2553.     mov [ssnac.dRi], 2
  2554.  
  2555.     mov word [buff], 0100h   ; 00 01 encapsulated META_DATA
  2556.     mov word [buff+2], 1000h ; 00 10     Len
  2557.     mov word [buff+4], 000Eh ;  LE Len
  2558.     mov word [buff+10], 07D0h ; META_DATA_REQ
  2559.  
  2560.  
  2561.     mov eax, UIN
  2562.     call ascitoint
  2563.     mov dword [buff+6], eax
  2564.  
  2565.     mov word [buff+12], 0102h   ; request sequence number (incrementing)
  2566.     mov word [buff+14], 0424h   ; META_SET_PERMS_USERINFO
  2567.     mov [buff+16], 1            ; authorization (1-required, 0-not required)
  2568.     mov [buff+17], byte 0       ; webaware (0-no, 1-yes)
  2569.     mov [buff+18], 1             ; dc_perms (0-any, 1-contact, 2-authorization)
  2570.     mov [buff+19], 0            ;unknown
  2571.  
  2572.     mov eax, ssnac
  2573.     mov ebx, buff
  2574.     mov edx, 20
  2575.  
  2576.  
  2577.     ;
  2578.     ; Client READY command
  2579.     ;
  2580.     mov [ssnac.wFid], 1  ; Family
  2581.     mov [ssnac.wSid], 2    ; Subtype
  2582.     mov [ssnac.dRi], 2     ; request-id
  2583.  
  2584.     mov eax, FAMILY_ARR
  2585.     mov ebx, buff
  2586.     push ecx
  2587.     mov ecx, FA_LEN
  2588.     call strcpy
  2589.     pop ecx
  2590.  
  2591.     mov eax, ssnac
  2592.     mov ebx, buff
  2593.     mov edx, FA_LEN
  2594.     call sendsnac
  2595.  
  2596.  
  2597.     ;
  2598.     ; Запрашиваем offline сообщения
  2599.     ;
  2600.     mov [ssnac.wFid], 15h  ; Family
  2601.     mov [ssnac.wSid], 2    ; Subtype
  2602.     mov [ssnac.dRi], 2     ; request-id
  2603.  
  2604.     mov word [buff], 0100h      ;  TLV type 01
  2605.     mov word [buff+2], 0A00h    ;  00 0a Длина
  2606.     mov word [buff+4], 0008h    ;  08 00
  2607.     mov eax, UIN
  2608.     call ascitoint
  2609.     mov dword [buff+6], eax
  2610.  
  2611.     mov [buff+10],  003Ch ; 3C 00 - Запрос на оффлайновые сообщения
  2612.     mov [buff+12],  0002  ; 02 00 - request sequence number
  2613.    
  2614.     mov edx, 14        ; Общий размер данных в буфере
  2615.  
  2616.     mov eax, ssnac
  2617.     mov ebx, buff
  2618.     call sendsnac
  2619.  
  2620.    
  2621.  
  2622.     ;
  2623.     ; Запрашиваем информацию всех UIN
  2624.     ;
  2625.     call getinfo
  2626.     ;
  2627.     ; завершено соединение
  2628.     ;
  2629.     mov [login], 2
  2630.  
  2631.     jmp m_fin
  2632.  
  2633.   m_snac_9_other:
  2634.     write_debug 'Unknown SNAC Family 9 Received'
  2635.     jmp m_fin
  2636.  
  2637.  
  2638.     ;
  2639.     ; FAMILY 13
  2640.     ;
  2641.   m_snac_13:
  2642.     cmp dx, 3
  2643.     jz m_snac_13_3
  2644.     cmp dx, 0fh
  2645.     jz m_snac_13_F
  2646.  
  2647.     jmp m_snac_13_other
  2648.  
  2649.     ;
  2650.     ; Server sends SSI service limitations to client
  2651.     ;
  2652.   m_snac_13_3:
  2653.     ;
  2654.     ; Обработки пока нет
  2655.     ;
  2656.  
  2657.     ;
  2658.     ;  SNAC(13,05)        Client check if its local SSI copy is up-to-date
  2659.     ;
  2660.     mov [ssnac.wFid], 13h  ; Family
  2661.     mov [ssnac.wSid], 5    ; Subtype
  2662.     mov [ssnac.dRi], 5     ; request-id
  2663.     mov eax, ssnac
  2664.     ;  3D E7 48 17
  2665.     mov [buff], 03Dh      ;
  2666.     mov [buff+1], 0E7h    ;     modification date/time of client local SSI copy
  2667.     mov [buff+2], 48h     ;
  2668.     mov [buff+3], 17h     ;
  2669.     ; 00 10
  2670.     mov [buff+4], 00      ;
  2671.     mov [buff+5], 10h     ;     number of items in client local SSI copy
  2672.    
  2673.     mov ebx, buff
  2674.     mov edx, 5
  2675.     call sendsnac
  2676.  
  2677.     jmp m_fin
  2678.  
  2679.     ;
  2680.     ;  Server tell client its local copy up-to-date
  2681.     ;
  2682.   m_snac_13_F:
  2683.     ;
  2684.     ;  Обработки нет
  2685.     ;
  2686.  
  2687.     ;
  2688.     ;  Client activates server SSI data
  2689.     ;
  2690.     mov [ssnac.wFid], 13h  ; Family
  2691.     mov [ssnac.wSid], 7    ; Subtype
  2692.     mov [ssnac.dRi], 7     ; request-id
  2693.     mov eax, ssnac
  2694.     mov ebx, buff
  2695.     xor edx, edx
  2696.     call sendsnac
  2697.  
  2698.     ;
  2699.     ; последняя стадия соединения
  2700.     ;
  2701.  
  2702.     ;
  2703.     ; Client sends its DC info and status to server
  2704.     ;
  2705.     mov [ssnac.wFid], 1  ; Family
  2706.     mov [ssnac.wSid], 1Eh    ; Subtype
  2707.     mov [ssnac.dRi], 1Eh     ; request-id
  2708.  
  2709.     mov [buff], 0           ;  TLV type 06
  2710.     mov [buff+1], 6h        ;
  2711.     mov [buff+2], 0         ;  TLV data length
  2712.     mov [buff+3], 4         ;
  2713.     ;
  2714.     ;
  2715.     mov ax, STATUS_DCDISABLED  ; DC disabled
  2716.     call htons
  2717.     mov word [buff+4], ax
  2718.     mov ax, STATUS_ONLINE
  2719.     mov [status], ax
  2720.     mov word [buff+6], ax
  2721.  
  2722.     mov eax, ssnac
  2723.     mov ebx, buff
  2724.     mov edx, 8           ; TLV head len+ data len
  2725.     call sendsnac
  2726.  
  2727.     ;
  2728.     ; Client READY command
  2729.     ;
  2730.     mov [ssnac.wFid], 1  ; Family
  2731.     mov [ssnac.wSid], 2    ; Subtype
  2732.     mov [ssnac.dRi], 2     ; request-id
  2733.  
  2734.     mov eax, FAMILY_ARR
  2735.     mov ebx, buff
  2736.     push ecx
  2737.     mov ecx, FA_LEN
  2738.     call strcpy
  2739.     pop ecx
  2740.  
  2741.     mov eax, ssnac
  2742.     mov ebx, buff
  2743.     mov edx, FA_LEN
  2744.     call sendsnac
  2745.  
  2746.  
  2747.     ;
  2748.     ; Запрашиваем offline сообщения
  2749.     ;
  2750.     mov [ssnac.wFid], 15h  ; Family
  2751.     mov [ssnac.wSid], 2    ; Subtype
  2752.     mov [ssnac.dRi], 2     ; request-id
  2753.  
  2754.     mov word [buff], 0100h      ;  TLV type 01
  2755.     mov word [buff+2], 0A00h    ;  00 0a Длина
  2756.     mov word [buff+4], 0008h    ;  08 00
  2757.     mov eax, UIN
  2758.     call ascitoint
  2759.     mov dword [buff+6], eax
  2760.  
  2761.     mov [buff+10],  003Ch ; 3C 00 - Запрос на оффлайновые сообщения
  2762.     mov [buff+12],  0002  ; 02 00 - request sequence number
  2763.    
  2764.     mov edx, 14        ; Общий размер данных в буфере
  2765.  
  2766.     mov eax, ssnac
  2767.     mov ebx, buff
  2768.     call sendsnac
  2769.  
  2770.  
  2771.  
  2772.     jmp m_fin
  2773.  
  2774.   m_snac_13_other:
  2775.     write_debug 'Unknown SNAC Family 13 Received'
  2776.     jmp m_fin
  2777.  
  2778.  
  2779.  
  2780.  
  2781.     ;
  2782.     ;  Family 15
  2783.     ;
  2784.  
  2785.   m_snac_15:
  2786.    
  2787.     cmp dx, 3
  2788.     jz m_snac_15_3
  2789.    
  2790.     jmp m_snac_15_other
  2791.  
  2792.  
  2793.     ;
  2794.     ; Server sends message #N
  2795.     ;
  2796.   m_snac_15_3:
  2797.     ;
  2798.     ; Определяем подтип принятого пакета
  2799.     ;
  2800.  
  2801.     ;write_debug 'SNAC 15, 3'
  2802.  
  2803.     xor eax, eax
  2804.     mov ax, word [mbuff+10]  ; + SNAC.head size
  2805.     cmp ax, 0100h            ; 00 01 TLV type
  2806.     jnz m_snac_tlv_err
  2807.  
  2808.     mov ax, word [mbuff+10+10]
  2809.     cmp ax, 0041h             ; Offline Message
  2810.     jz m_snac_offline_mes
  2811.     cmp ax, 0042h             ; End messages
  2812.     jz m_snac_offline_end
  2813.     cmp ax, 07DAh
  2814.     jz m_snac_meta_data
  2815.  
  2816.  
  2817.     write_debug 'Unknown Subtype SNAC (15,3)'
  2818.     jmp m_fin
  2819.  
  2820.   m_snac_offline_mes:
  2821.     mov eax, MESS                      ;
  2822.     call strlen                        ;  Выводим строку с сообщением о отправителе и времени отправки
  2823.     push ecx                           ;
  2824.     mov ecx, eax                   ;
  2825.     mov eax, MESS
  2826.     mov ebx, buff
  2827.     call strcpy
  2828.  
  2829.     mov eax, dword [mbuff+14+10]          ; Sender UIN
  2830.     lea ebx, [buff+ecx]                ; После строчки о сообщении
  2831.     call int2strd
  2832.  
  2833.     lea ebx, [ebx+eax]
  2834.     mov [ebx], byte ' '
  2835.     inc ebx
  2836.  
  2837.                                        ; + Длина UIN
  2838.     movzx eax, byte [mbuff+21+10]         ; Day
  2839.     call int2strd
  2840.  
  2841.     lea ebx, [ebx+eax]
  2842.     mov [ebx], byte '.'
  2843.     inc ebx
  2844.  
  2845.    
  2846.     movzx eax, byte [mbuff+20+10]         ;Mounth
  2847.     call int2strd
  2848.  
  2849.     lea ebx, [ebx+eax]
  2850.     mov [ebx], byte ' '
  2851.     inc ebx
  2852.  
  2853.     movzx eax, [mbuff+22+10]              ; Hour
  2854.     call int2strd
  2855.  
  2856.     lea ebx, [ebx+eax]
  2857.     mov [ebx], byte ':'
  2858.     inc ebx
  2859.  
  2860.     movzx eax, [mbuff+23+10]              ; Minute
  2861.     call int2strd
  2862.  
  2863.     lea ebx, [ebx+eax]
  2864.     ;mov [ebx], byte ' '
  2865.     ;inc ebx
  2866.  
  2867.     mov [ebx], byte 0                      ; Str end
  2868.     mov eax, buff
  2869.     xor ebx, ebx
  2870.  
  2871.     call writemsg
  2872.  
  2873.     movzx ecx, word [mbuff+26+10]             ; Длина соообщения
  2874.     lea eax, [mbuff+28+10]
  2875.     mov ebx, buff
  2876.     call strcpy
  2877.  
  2878.     mov [ebx+ecx], byte 0
  2879.  
  2880.     mov eax, buff
  2881.     call win2dos                              ;перекодируем
  2882.  
  2883.     mov ebx, 00FF0000h                        ;Цвет
  2884.  
  2885.     call writemsg
  2886.  
  2887.  
  2888.     pop ecx
  2889.  
  2890.     jmp m_fin
  2891.  
  2892.  
  2893.   m_snac_offline_end:
  2894.     ;
  2895.     ; Удаляем сообщения на сервере
  2896.     ;
  2897.     mov [ssnac.wFid], 15h  ; Family
  2898.     mov [ssnac.wSid], 2    ; Subtype
  2899.     mov [ssnac.dRi], 0602h     ; request-id
  2900.  
  2901.     mov word [buff], 0100h     ;  00 01 TLV.Type(1) - encapsulated META_DATA1
  2902.     mov word [buff+2], 0A00h   ;  00 0A TLV.Length
  2903.     mov word [buff+4], 0008h   ;  08 00 data chunk size (TLV.Length-2)
  2904.     mov eax, UIN
  2905.     call ascitoint
  2906.     mov dword [buff+6], eax    ; xx xx xx xx (LE) client uin
  2907.     mov word [buff+10], 003Eh  ; 3E 00  (LE) data type: delete offline msgs request cmd
  2908.     mov word [buff+12], 0007h  ;  xx xx (LE) request sequence number
  2909.  
  2910.     mov edx, 14                ; Размер данных
  2911.     mov eax, ssnac
  2912.     mov ebx, buff
  2913.     call sendsnac
  2914.  
  2915.  
  2916.  
  2917.     jmp m_fin
  2918.  
  2919.     ;
  2920.     ; Ответ на запрос о пользователях
  2921.     ;
  2922.   m_snac_meta_data:
  2923.     ;
  2924.     ; Определяем очередной подтип :-)
  2925.     ;
  2926.     mov ax, word [mbuff+10+14]
  2927.     cmp ax, 0104h                   ;data subtype: META_SHORT_USERINFO
  2928.     jz m_snac_short_userinfo
  2929.     cmp ax, 00C8h
  2930.     jz m_snac_basic_userinfo        ;data subtype: META_BASIC_USERINFO
  2931.     write_debug 'Unknown META DATA subtype'
  2932.     jmp m_fin
  2933.  
  2934.  
  2935.  
  2936.   m_snac_short_userinfo:
  2937.     ;
  2938.     ; Из всей информации пока нужен только ник
  2939.     ;
  2940.     mov al, [mbuff+10+16]
  2941.      cmp al, 0Ah                    ;success byte
  2942.      jnz m_fin
  2943.  
  2944.      movzx eax, word [mbuff+10+12]  ;request sequence number
  2945.      ;
  2946.      ; В запросе я использовал порядковый номер юзера в КЛ
  2947.      lea ebx, [mbuff+10+19]         ;nickname string
  2948.      ; Длина строки не нужна, т.к. строка Null-Terminated
  2949.      ;Определяем статус
  2950.      mov ecx, 4
  2951.      imul ecx, eax
  2952.      mov ecx, [stats+ecx]
  2953.  
  2954.      call loadbb
  2955.  
  2956.  
  2957.  
  2958.     jmp m_fin
  2959.  
  2960.   ;
  2961.   ; тк SIQ на запрос короткой инфы отвечает
  2962.   ; пакетом базовой информации, реализую пока только его
  2963.   ;
  2964.   m_snac_basic_userinfo:
  2965.      mov al, [mbuff+10+16]
  2966.      cmp al, 0Ah                    ;success byte
  2967.      jnz m_fin
  2968.  
  2969.      movzx eax, word [mbuff+10+12]  ;request sequence number
  2970.      ;
  2971.      ; В запросе я использовал порядковый номер юзера в КЛ
  2972.      lea ebx, [mbuff+10+19]         ;nickname string
  2973.      ; Длина строки не нужна, т.к. строка Null-Terminated
  2974.      ;Определяем статус
  2975.      mov ecx, 4
  2976.      imul ecx, eax
  2977.      mov ecx, [stats+ecx]
  2978.  
  2979.      call loadbb
  2980.  
  2981.        
  2982.  
  2983.     jmp m_fin
  2984.  
  2985.   m_snac_tlv_err:
  2986.     write_debug 'TLV TYPE MISMATCH'
  2987.  
  2988.     jmp m_fin
  2989.    
  2990.  
  2991.   m_snac_15_other:
  2992.  
  2993.     write_debug 'Unknown SNAC Family 15 Received'
  2994.  
  2995.     jmp m_fin
  2996.  
  2997.  
  2998.   m_other_snac:
  2999.     write_debug 'Unknown SNAC received'
  3000.     jmp m_fin
  3001.  
  3002.  
  3003.  
  3004.   m_fin:
  3005.     ;pop edx
  3006.     ;pop ebx
  3007.     ;pop eax
  3008.     popad
  3009.     popf
  3010.   ret
  3011.  
  3012. ; Для перевода DWORD из Little Endian в Big Endian
  3013. ; и наоборот :-)
  3014. ; <--EAX DWORD
  3015. ; -->EAX
  3016. ;
  3017.   ntohl:
  3018.   htonl:
  3019.     ;pushf
  3020.     push ebx
  3021.     ;push ecx
  3022.  
  3023.     xor ebx, ebx
  3024.  
  3025.     mov bl, ah
  3026.     mov bh, al
  3027.     shl ebx, 16
  3028.    
  3029.     shr eax, 16
  3030.     mov bl, ah
  3031.     mov bh, al
  3032.    
  3033.     mov eax, ebx
  3034.  
  3035.     ;pop ecx
  3036.     pop ebx
  3037.     ;popf
  3038.   ret
  3039.  
  3040.  
  3041. ; Для перевода WORD из Little Endian в Big Endian
  3042. ; <--AX WORD                                            
  3043. ; -->AX WORD
  3044. ;
  3045.  
  3046.   ntohs:
  3047.   htons:
  3048.     ;pushf
  3049.     push ebx
  3050.  
  3051.     xor ebx, ebx
  3052.     mov bl, ah
  3053.     mov bh, al
  3054.     mov eax, ebx
  3055.  
  3056.     pop ebx
  3057.     ;popf
  3058.   ret
  3059.  
  3060. ;
  3061. ; парсит SNAC
  3062. ; <--EAX указатель на SNAC_head
  3063. ; <--EBX указатель на буффер
  3064. ; -->EAX указатель начало данных = buffer+sizeof SNAC_head
  3065. ;
  3066. ;
  3067.   snacpar:
  3068.     pushf
  3069.     push ecx
  3070.     ;push edx
  3071.  
  3072.     mov cl, [ebx+1]     ; Family (service) id number младший байт
  3073.     mov ch, [ebx]       ; старший
  3074.     mov word [eax], cx
  3075.  
  3076.     mov cl, [ebx+3]     ; Family subtype id number
  3077.     mov ch, [ebx+2]     ;
  3078.     mov word [eax+2], cx
  3079.  
  3080.     mov cl, [ebx+5]      ; SNAC flags
  3081.     mov ch, [ebx+4]      ;
  3082.     mov word [eax+4], cx ;
  3083.                            
  3084.     mov cl, [ebx+7]         ;
  3085.     mov ch, [ebx+6]         ;
  3086.     mov word [eax+8], cx    ; SNAC request id
  3087.     mov cl, [ebx+8]         ;
  3088.     mov ch, [ebx+7]         ;
  3089.     mov word [eax+6], cx    ;
  3090.    
  3091.     add ebx, 10             ;Размер заголовка
  3092.     mov eax, ebx
  3093.  
  3094.  
  3095.     ;pop edx
  3096.     pop ecx
  3097.     popf
  3098.   ret
  3099.  
  3100. ;
  3101. ; парсит userinfo block
  3102. ;  FIXIT
  3103. ;
  3104.  
  3105. ;  userinfopar:
  3106. ;    pushf
  3107. ;
  3108. ;
  3109. ;
  3110. ;
  3111. ;
  3112. ;
  3113. ;    popf
  3114. ;  ret
  3115.  
  3116. ;
  3117. ;  посылка сообщения
  3118. ;  [eax] <-- текстовый буфер  \
  3119. ;  [ebx] <-- UIN              /  Null-terminated
  3120.  
  3121.   sendmsg:
  3122.     pushf