Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;
  3. ; VNC Client for kolibrios by hidnplayr
  4. ;
  5. ;
  6. ; WORK IN PROGRESS...
  7. ;
  8. ; FEEL FREE TO CONTRIBUTE !
  9. ;
  10. ; hidnplayr@gmail.com
  11. ;
  12.  
  13. use32
  14.  
  15.                 org     0x0
  16.  
  17.                 db      'MENUET00'              ; 8 byte id
  18.                 dd      38                      ; required os
  19.                 dd      START                   ; program start
  20.                 dd      I_END                   ; program image size
  21.                 dd      IM_END                  ; required amount of memory
  22.                 dd      0                       ; reserved=no extended header
  23.  
  24. __DEBUG__ equ 1
  25. __DEBUG_LEVEL__ equ 1
  26. STRLEN = 64
  27. xpos = 4
  28. ypos = 22
  29.  
  30. TIMEOUT = 60     ; timeout in seconds
  31. BUFFER  = 512    ; Buffer size for DNS
  32.  
  33. include 'fdo.inc'
  34. include 'ETH.INC'
  35. include 'logon.inc'
  36. include 'raw.inc'
  37. include 'copyrect.inc'
  38.  
  39.  
  40. START:                                 ; start of execution
  41.     call    red_logon
  42.  
  43.     mov     eax,40                     ; Report events
  44.     mov     ebx,10000000b              ; Only Stack
  45.     int     0x40
  46.  
  47.     mov     eax,67                     ; resize the window (hide it)
  48.     xor     ebx,ebx
  49.     mov     ecx,ebx
  50.     mov     edx,ebx
  51.     mov     esi,ebx
  52.     int     0x40
  53.  
  54.     resolve first,[server_ip]          ; the input window putted the server @ 'first', resolve it into a real ip
  55.     mov     [server_port],5900         ; no port input for now, only standard port 5900
  56.  
  57.     DEBUGF  1,'connecting to %u.%u.%u.%u:%u\n',1[server_ip],1[server_ip+1],1[server_ip+2],1[server_ip+3],4[server_port]
  58.     eth.search_port 1000,edx                                      ; Find a free port starting from 1001 and store in edx
  59.     eth.open_tcp edx,[server_port],[server_ip],1,[socket]         ; open socket
  60.     DEBUGF 1,'Socket opened: %u (port %u)\n',[socket],ecx
  61.  
  62.     call    read_data
  63.     cmp     dword[receive_buffer+1],'RFB '
  64.     jne     no_rfb
  65.     eth.write_tcp [socket],12,handshake
  66.     DEBUGF 1,'Sending handshake: protocol version\n'
  67.  
  68.     call    read_data
  69.     mov     eax,receive_buffer+1
  70.     mov     eax,[eax]
  71.     bswap   eax
  72.     cmp     eax,0
  73.     je      invalid_security
  74.     cmp     eax,1
  75.     je      no_security
  76.     cmp     eax,2
  77.     je      vnc_security
  78.  
  79.     jmp     close
  80.  
  81.    vnc_security:
  82.     mov     byte[mode],1
  83.     call    red_logon
  84.  
  85.    no_security:
  86.     eth.write_tcp [socket],1,shared
  87.     DEBUGF 1,'Sending handshake: shared session?\n'
  88.  
  89.     eth.wait_for_data [socket],TIMEOUT*10,close
  90.     eth.read_data [socket],framebuffer,[datapointer],IM_END-receive_buffer ; now the server should send init message
  91.     DEBUGF 1,'Serverinit: bpp:%u depth:%u bigendian:%u truecolor:%u\n',1[pixelformat.bpp],1[pixelformat.depth],1[pixelformat.big_endian],1[pixelformat.true_color]
  92.     mov     eax,dword[framebuffer]
  93.     bswap   eax
  94.     mov     dword[screen],eax
  95.  
  96.     eth.write_tcp [socket],20,pixel_format32
  97.     DEBUGF 1,'Sending pixel format\n'
  98.     call    read_data
  99.  
  100. ;    eth.write_tcp [socket],8,encodings
  101. ;    DEBUGF 1,'Sending encoding info\n'
  102. ;    call    read_data
  103.  
  104.     mov     eax,dword[framebuffer.width]
  105.     mov     dword[fbur.width],eax
  106.  
  107.     mov     eax,40                 ; report events
  108.     mov     ebx,10100111b          ; stack, mouse, button, key, redraw
  109.     int     0x40
  110.  
  111.     mov     eax,67                 ; resize the window
  112.     mov     ebx,10
  113.     mov     ecx,10
  114.     mov     edx,dword[framebuffer]
  115.     bswap   edx
  116.     movzx   esi,dx
  117.     shr     edx,16
  118.     add     edx,2*xpos
  119.     add     esi,ypos+xpos
  120.     int     0x40
  121.  
  122. ;    mov     byte[fbur.inc],0       ; request a framebufferupdate
  123. ;    eth.write_tcp [socket],10,fbur
  124.  
  125.   mainloop:
  126.     eth.socket_status [socket],eax
  127.     cmp     al,TCB_CLOSE_WAIT
  128.     je      close
  129.  
  130.     mov     eax,23                 ; wait for event with timeout
  131.     mov     ebx,50                 ; 0,5 s
  132.     int     0x40
  133.  
  134.     cmp     eax,1                  ; redraw
  135.     je      redraw
  136.     cmp     eax,2                  ; key
  137.     je      key
  138.     cmp     eax,3                  ; button
  139.     je      button
  140.     cmp     eax,6                  ; mouse
  141.     je      mouse
  142.     cmp     eax,8
  143.     je      network
  144.  
  145.     ; request an FRB update
  146.     jmp     mainloop
  147.  
  148.  
  149.    network:
  150.     call    read_data              ; Read the data into the buffer
  151.  
  152.     mov     eax,[datapointer]      ; at least 2 bytes should be received
  153.     sub     eax,receive_buffer
  154.     cmp     eax,1
  155.     jle     mainloop
  156.  
  157.     DEBUGF 1,'Data received, %u bytes\n',eax
  158.  
  159.     cmp     byte[receive_buffer],0
  160.     je      framebufferupdate
  161.  
  162.     cmp     byte[receive_buffer],1
  163.     je      setcolourmapentries
  164.  
  165.     cmp     byte[receive_buffer],2
  166.     je      bell
  167.  
  168.     cmp     byte[receive_buffer],3
  169.     je      servercuttext
  170.  
  171.     jmp     mainloop
  172.  
  173.  
  174.    framebufferupdate:
  175.     DEBUGF 1,'Framebufferupdate!\n'
  176.     mov     di,word[receive_buffer+2]
  177.     bswap   edi
  178.     shr     edi,16
  179.     mov     esi,receive_buffer+4
  180.  
  181.    rectangle_loop:
  182.     mov     edx,[esi]
  183.     bswap   edx
  184.     mov     ebx,edx
  185.     shr     edx,16
  186.     mov     [frame.x],dx
  187.     mov     [frame.y],bx
  188.     add     esi,4
  189.     mov     ecx,[esi]
  190.     bswap   ecx
  191.     mov     eax,ecx
  192.     shr     ecx,16
  193.     mov     [frame.width],cx
  194.     mov     [frame.height],ax
  195.     add     esi,4
  196.     mov     eax,[esi]
  197.     add     esi,4
  198.  
  199.     DEBUGF 1,'screen: width=%u height=%u\nframe: width=%u height=%u x=%u y=%u\n',2[screen.width],2[screen.height],2[frame.width],2[frame.height],2[frame.x],2[frame.y]
  200.  
  201.     cmp     eax,0
  202.     je      encoding_raw
  203.  
  204.     cmp     eax,1
  205.     je      encoding_copyrect
  206.  
  207.     cmp     eax,2
  208.     je      encoding_RRE
  209.  
  210.     cmp     eax,5
  211.     je      encoding_hextile
  212.  
  213.     cmp     eax,16
  214.     je      encoding_ZRLE
  215.  
  216.     DEBUGF 1,'FRAME: unknown encoding\n'
  217.     jmp     mainloop
  218.  
  219.    next_rectangle:
  220.     dec     di
  221.     pusha
  222.     call    drawbuffer
  223.     popa
  224.     cmp     di,0
  225.     jg      rectangle_loop
  226.     jmp     mainloop
  227.  
  228.   encoding_RRE:
  229.     DEBUGF 1,'FRAME: RRE\n'
  230.  
  231.     jmp     next_rectangle
  232.  
  233.   encoding_hextile:
  234.     DEBUGF 1,'FRAME: hextile\n'
  235.  
  236.     jmp     next_rectangle
  237.  
  238.   encoding_ZRLE:
  239.     DEBUGF 1,'FRAME: ZRLE\n'
  240.  
  241.     jmp     next_rectangle
  242.  
  243.  
  244.   setcolourmapentries:
  245.  
  246.     DEBUGF 1,'Server sended an SetColourMapEntries message\n'
  247.  
  248.     jmp     mainloop
  249.  
  250.  
  251.   bell:
  252.     mov     eax,55
  253.     mov     ebx,eax
  254.     mov     esi,beep
  255.     int     0x40
  256.  
  257.     jmp     mainloop
  258.  
  259.  
  260.   servercuttext:
  261.  
  262.     jmp mainloop
  263.  
  264.  
  265.   key:
  266.     DEBUGF 1,'Sending key event\n'
  267.  
  268.     mov     eax,2
  269.     int     0x40
  270.     mov     byte[keyevent.key+3],ah
  271.  
  272. ;   eth.write_tcp [socket],8,keyevent
  273.  
  274.     cmp     ah,13
  275.     jne     @f
  276.  
  277.     mov     byte[fbur.inc],1
  278.     eth.write_tcp [socket],10,fbur
  279.     jmp     mainloop
  280.   @@:
  281.  
  282.     cmp     ah,30
  283.     jne     @f
  284.  
  285.     mov     byte[fbur.inc],12
  286.     eth.write_tcp [socket],10,fbur
  287.     jmp     mainloop
  288.   @@:
  289.  
  290.     mov     byte[fbur.inc],0
  291.     eth.write_tcp [socket],10,fbur
  292.  
  293.     jmp     mainloop
  294.  
  295.   mouse:
  296.     DEBUGF 1,'Sending mouse event\n'
  297.  
  298.     mov     eax,37
  299.     mov     ebx,1
  300.     int     0x40
  301.  
  302.     sub     eax,xpos*65536+ypos
  303.     bswap   eax
  304.     mov     word[pointerevent.x],ax
  305.     shr     eax,16
  306.     mov     word[pointerevent.y],ax
  307.  
  308.     mov     eax,37
  309.     mov     ebx,2
  310.     int     0x40
  311.  
  312.     cmp     al,2
  313.     jne     @f        ; in kolibri right click is 2 (decimal), in RFB protocol it is bit 2 (counting from 0)
  314.     mov     al,100b
  315.    @@:
  316.  
  317.     mov     byte[pointerevent.mask],al
  318.  
  319.     eth.write_tcp [socket],6,pointerevent
  320.  
  321.     jmp     mainloop
  322.  
  323.   redraw:
  324.  
  325.     DEBUGF 1,'Drawing window\n'
  326.  
  327.     mov     eax,12
  328.     mov     ebx,1
  329.     int     0x40
  330.  
  331.     mov     eax,0                     ; draw window
  332.     mov     ebx,dword[framebuffer]
  333.     bswap   ebx
  334.     movzx   ecx,bx
  335.     shr     ebx,16
  336.     add     ebx,2*xpos
  337.     add     ecx,ypos+xpos
  338.     mov     edx,0x03ffffff
  339.     mov     esi,0x80555599
  340.     mov     edi,0x00ffffff
  341.     int     0x40
  342.  
  343.     mov     eax,4                     ; label
  344.     mov     ebx,9*65536+8
  345.     mov     ecx,0x10ffffff
  346.     mov     edx,name
  347.     mov     esi,[name_length]
  348.     bswap   esi
  349.     int     0x40
  350.  
  351.     call    drawbuffer
  352.  
  353.     mov     eax,12
  354.     mov     ebx,2
  355.     int     0x40
  356.  
  357.     jmp     mainloop
  358.  
  359.   drawbuffer:
  360.  
  361.     mov     eax,7
  362.     mov     ebx,framebuffer_data
  363.     mov     ecx,dword[screen]
  364.     mov     edx,xpos*65536+ypos
  365.     int     0x40
  366.  
  367.     ret
  368.  
  369.  
  370.   button:                         ; button
  371.     mov     eax,17                ; get id
  372.     int     0x40
  373.  
  374.   close:
  375.     call    read_data
  376. ;    eth.close_tcp [socket]             ; We're done, close the socket ;;; BUG WHEN CLOSING SCOKET !!
  377.     DEBUGF 1,'Socket closed\n'
  378.  
  379.     mov     eax,-1
  380.     int     0x40
  381.  
  382.     no_rfb:
  383.     DEBUGF 1,'This is no vnc server!\n'
  384.     jmp     close
  385.  
  386.     invalid_security:
  387.     DEBUGF 1,'Security error: %s\n',receive_buffer+5
  388.     jmp     close
  389.  
  390. read_data:
  391.     eth.read_data [socket],receive_buffer,[datapointer],IM_END-receive_buffer
  392. ret
  393.  
  394. ; DATA AREA
  395.  
  396. include_debug_strings    ; ALWAYS present in data section
  397.  
  398. handshake          db 'RFB 003.003',0x0a
  399. shared             db 0
  400. beep               db 0x85,0x25,0x85,0x40,0
  401.  
  402. pixel_format32     db 0       ; setPixelformat
  403.                    rb 3       ; padding
  404. .bpp               db 32      ; bits per pixel
  405. .depth             db 32      ; depth
  406. .big_endian        db 0       ; big-endian flag
  407. .true_color        db 1       ; true-colour flag
  408. .red_max           db 0,255   ; red-max
  409. .green_max         db 0,255   ; green-max
  410. .blue_max          db 0,255   ; blue-max
  411. .red_shif          db 0       ; red-shift
  412. .green_shift       db 8       ; green-shift
  413. .blue_shift        db 16      ; blue-shift
  414.                    rb 3       ; padding
  415.  
  416. pixel_format16     db 0       ; setPixelformat
  417.                    rb 3       ; padding
  418. .bpp               db 16      ; bits per pixel
  419. .depth             db 16      ; depth
  420. .big_endian        db 0       ; big-endian flag
  421. .true_color        db 1       ; true-colour flag
  422. .red_max           db 0,32    ; red-max
  423. .green_max         db 0,32    ; green-max
  424. .blue_max          db 0,64    ; blue-max
  425. .red_shif          db 0       ; red-shift
  426. .green_shift       db 5       ; green-shift
  427. .blue_shift        db 10      ; blue-shift
  428.                    rb 3       ; padding
  429.  
  430. pixel_format8      db 0       ; setPixelformat
  431.                    rb 3       ; padding
  432. .bpp               db 8       ; bits per pixel
  433. .depth             db 8       ; depth
  434. .big_endian        db 0       ; big-endian flag
  435. .true_color        db 1       ; true-colour flag
  436. .red_max           db 0,7     ; red-max
  437. .green_max         db 0,7     ; green-max
  438. .blue_max          db 0,3     ; blue-max
  439. .red_shif          db 0       ; red-shift
  440. .green_shift       db 3       ; green-shift
  441. .blue_shift        db 6       ; blue-shift
  442.                    rb 3       ; padding
  443.  
  444. encodings          db 2       ; setEncodings
  445.                    rb 1       ; padding
  446.                    db 1,0     ; number of encodings
  447.                    db 0,0,0,0 ; raw encoding        (DWORD, Big endian order)
  448.                    db 1,0,0,0 ; Copyrect encoding
  449.  
  450. fbur               db 3       ; frame buffer update request
  451. .inc               db 0       ; incremental
  452. .x                 dw 0
  453. .y                 dw 0
  454. .width             dw 0
  455. .height            dw 0
  456.  
  457. keyevent           db 4       ; keyevent
  458. .down              db 0       ; down-flag
  459.                    dw 0       ; padding
  460. .key               dd 0       ; key
  461.  
  462. pointerevent       db 5       ; pointerevent
  463. .mask              db 0       ; button-mask
  464. .x                 dw 0       ; x-position
  465. .y                 dw 0       ; y-position
  466.  
  467. I_END:
  468.  
  469. framebuffer:
  470. .width             dw ?
  471. .height            dw ?
  472. pixelformat:
  473. .bpp               db ?
  474. .depth             db ?
  475. .big_endian        db ?
  476. .true_color        db ?
  477. .red_max           dw ?
  478. .green_max         dw ?
  479. .blue_max          dw ?
  480. .red_shift         db ?
  481. .green_shift       db ?
  482. .blue_shift        db ?
  483. .padding           rb 3
  484. name_length        dd ?
  485. name               rb 256
  486.  
  487. server_ip          dd 0
  488. server_port        dd 0
  489. socket             dd 0
  490. datapointer        dd 0
  491.  
  492. frame:
  493. .width             dw 0
  494. .height            dw 0
  495. .x                 dw 0
  496. .y                 dw 0
  497.  
  498. screen:
  499. .height            dw 0
  500. .width             dw 0
  501.  
  502. dnsMsg:
  503. receive_buffer     rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc)
  504. framebuffer_data   rb 1024*768*3  ; framebuffer
  505.  
  506. IM_END:
  507.  
  508.  
  509.