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     'MENUET01'        ; 8 byte id
  18.     dd     0x01              ; header version
  19.     dd     START             ; start of code
  20.     dd     I_END             ; size of image
  21.     dd     IM_END            ; memory for app
  22.     dd     IM_END            ; esp
  23.     dd     0x0 , 0x0         ; I_Param , I_Icon
  24.  
  25. __DEBUG__ equ 1
  26. __DEBUG_LEVEL__ equ 1
  27.  
  28. STRLEN = 64      ; password and server max length
  29. xpos = 4         ; coordinates of image
  30. ypos = 22        ;
  31.  
  32. TIMEOUT = 60     ; timeout in seconds
  33. BUFFER  = 1500   ; Buffer size for DNS
  34.  
  35. include 'fdo.inc'
  36. include 'ETH.INC'
  37. include 'logon.inc'
  38. include 'raw.inc'
  39. include 'copyrect.inc'
  40. include 'thread.inc'
  41.  
  42.  
  43. START:                                 ; start of execution
  44.  
  45.     call    red_logon
  46.  
  47.     mov     eax,40                     ; Report events
  48.     mov     ebx,00000000b              ; Only Stack
  49.     int     0x40
  50.  
  51.     mov     eax,67                     ; resize the window (hide it)
  52.     xor     ebx,ebx
  53.     mov     ecx,ebx
  54.     mov     edx,ebx
  55.     mov     esi,ebx
  56.     int     0x40
  57.  
  58.     mov     eax,51
  59.     mov     ebx,1
  60.     mov     ecx,thread_start
  61.     mov     edx,thread_stack
  62.     int     0x40
  63.  
  64.     DEBUGF 1,'Thread created: %u\n',eax
  65.  
  66.    @@:
  67.     mov     eax,5
  68.     mov     ebx,10
  69.     int     0x40
  70.  
  71.     cmp     byte[thread_ready],0
  72.     je      @r
  73.  
  74.     mov     eax,40                 ; report events
  75.     mov     ebx,100111b            ; mouse, button, key, redraw
  76.     int     0x40
  77.  
  78.     mov     eax,67                 ; resize the window
  79.     mov     ebx,10
  80.     mov     ecx,10
  81.     mov     edx,dword[framebuffer]
  82.     bswap   edx
  83.     movzx   esi,dx
  84.     shr     edx,16
  85.     add     edx,2*xpos
  86.     add     esi,ypos+xpos
  87.     int     0x40
  88.  
  89.   mainloop:
  90.     eth.socket_status [socket],eax
  91.     cmp     al,TCB_CLOSE_WAIT
  92.     je      close
  93.  
  94.     mov     eax,23                 ; wait for event with timeout
  95.     mov     ebx,50                 ; 0,5 s
  96.     int     0x40
  97.  
  98.     cmp     eax,1
  99.     je      redraw
  100.     cmp     eax,2                  ; key
  101.     je      key
  102.     cmp     eax,3                  ; button
  103.     je      button
  104.     cmp     eax,6                  ; mouse
  105.     je      mouse
  106.  
  107.     call    drawbuffer
  108.  
  109.     jmp     mainloop
  110.  
  111.   key:
  112.     DEBUGF 1,'Sending key event\n'
  113.  
  114.     mov     eax,2
  115.     int     0x40
  116.     mov     byte[keyevent.key+3],ah
  117.  
  118.     eth.write_tcp [socket],8,keyevent
  119.  
  120.     jmp     mainloop
  121.  
  122.   mouse:
  123.     DEBUGF 1,'Sending mouse event\n'
  124.  
  125.     mov     eax,37
  126.     mov     ebx,1
  127.     int     0x40
  128.  
  129.     sub     eax,xpos*65536+ypos
  130.     bswap   eax
  131.     mov     word[pointerevent.x],ax
  132.     shr     eax,16
  133.     mov     word[pointerevent.y],ax
  134.  
  135.     mov     eax,37
  136.     mov     ebx,2
  137.     int     0x40
  138.  
  139.     test    al,00000010b            ; test if right button was pressed  (bit 1 in kolibri)
  140.     jz      @f
  141.     add     al,00000010b            ; in RFB protocol it is bit 2, so if we add bit 2 again, we'll get bit 3 and bit 1 will remain the same
  142.    @@:
  143.  
  144.     mov     byte[pointerevent.mask],al
  145.  
  146.     eth.write_tcp [socket],6,pointerevent
  147.  
  148.     jmp     mainloop
  149.  
  150.   redraw:
  151.  
  152.     DEBUGF 1,'Drawing window\n'
  153.  
  154.     mov     eax,12
  155.     mov     ebx,1
  156.     int     0x40
  157.  
  158.     mov     eax,0                     ; draw window
  159.     mov     ebx,dword[framebuffer]
  160.     bswap   ebx
  161.     movzx   ecx,bx
  162.     shr     ebx,16
  163.     add     ebx,2*xpos
  164.     add     ecx,ypos+xpos
  165.     mov     edx,0x03ffffff
  166.     mov     esi,0x80555599
  167.     mov     edi,0x00ffffff
  168.     int     0x40
  169.  
  170.     mov     eax,4                     ; label
  171.     mov     ebx,9*65536+8
  172.     mov     ecx,0x10ffffff
  173.     mov     edx,name
  174.     mov     esi,[name_length]
  175.     bswap   esi
  176.     int     0x40
  177.  
  178.     call    drawbuffer
  179.  
  180.     mov     eax,12
  181.     mov     ebx,2
  182.     int     0x40
  183.  
  184.     jmp     mainloop
  185.  
  186.   drawbuffer:
  187.  
  188.     mov     eax,7
  189.     mov     ebx,framebuffer_data
  190.     mov     ecx,dword[screen]
  191.     mov     edx,xpos*65536+ypos
  192.     int     0x40
  193.  
  194.     ret
  195.  
  196.  
  197.   button:                         ; button
  198.     mov     eax,17                ; get id
  199.     int     0x40
  200.  
  201.   close:
  202.     call    read_data
  203. ;    eth.close_tcp [socket]             ; We're done, close the socket ;;; BUG WHEN CLOSING SOCKET !!
  204.     DEBUGF 1,'Socket closed\n'
  205.  
  206.     mov     eax,-1
  207.     int     0x40
  208.  
  209.     no_rfb:
  210.     DEBUGF 1,'This is no vnc server!\n'
  211.     jmp     close
  212.  
  213.     invalid_security:
  214.     DEBUGF 1,'Security error: %s\n',receive_buffer+5
  215.     jmp     close
  216.  
  217.  
  218. ; DATA AREA
  219.  
  220. include_debug_strings    ; ALWAYS present in data section
  221.  
  222. handshake          db 'RFB 003.003',0x0a
  223. shared             db 0
  224. beep               db 0x85,0x25,0x85,0x40,0
  225.  
  226. pixel_format32     db 0       ; setPixelformat
  227.                    rb 3       ; padding
  228. .bpp               db 32      ; bits per pixel
  229. .depth             db 32      ; depth
  230. .big_endian        db 0       ; big-endian flag
  231. .true_color        db 1       ; true-colour flag
  232. .red_max           db 0,255   ; red-max
  233. .green_max         db 0,255   ; green-max
  234. .blue_max          db 0,255   ; blue-max
  235. .red_shif          db 0       ; red-shift
  236. .green_shift       db 8       ; green-shift
  237. .blue_shift        db 16      ; blue-shift
  238.                    rb 3       ; padding
  239.  
  240. pixel_format16     db 0       ; setPixelformat
  241.                    rb 3       ; padding
  242. .bpp               db 16      ; bits per pixel
  243. .depth             db 15      ; depth
  244. .big_endian        db 0       ; big-endian flag
  245. .true_color        db 1       ; true-colour flag
  246. .red_max           db 0,31    ; red-max
  247. .green_max         db 0,31    ; green-max
  248. .blue_max          db 0,31    ; blue-max
  249. .red_shif          db 0       ; red-shift
  250. .green_shift       db 5       ; green-shift
  251. .blue_shift        db 10      ; blue-shift
  252.                    rb 3       ; padding
  253.  
  254. pixel_format8      db 0       ; setPixelformat
  255.                    rb 3       ; padding
  256. .bpp               db 8       ; bits per pixel
  257. .depth             db 6       ; depth
  258. .big_endian        db 0       ; big-endian flag
  259. .true_color        db 1       ; true-colour flag
  260. .red_max           db 0,3     ; red-max
  261. .green_max         db 0,3     ; green-max
  262. .blue_max          db 0,3     ; blue-max
  263. .red_shif          db 0       ; red-shift
  264. .green_shift       db 2       ; green-shift
  265. .blue_shift        db 4       ; blue-shift
  266.                    rb 3       ; padding
  267.  
  268. encodings          db 2       ; setEncodings
  269.                    rb 1       ; padding
  270.                    db 1,0     ; number of encodings
  271.                    db 0,0,0,0 ; raw encoding        (DWORD, Big endian order)
  272.                    db 1,0,0,0 ; Copyrect encoding
  273.  
  274. fbur               db 3       ; frame buffer update request
  275. .inc               db 0       ; incremental
  276. .x                 dw 0
  277. .y                 dw 0
  278. .width             dw 0
  279. .height            dw 0
  280.  
  281. keyevent           db 4       ; keyevent
  282. .down              db 0       ; down-flag
  283.                    dw 0       ; padding
  284. .key               dd 0       ; key
  285.  
  286. pointerevent       db 5       ; pointerevent
  287. .mask              db 0       ; button-mask
  288. .x                 dw 0       ; x-position
  289. .y                 dw 0       ; y-position
  290.  
  291. I_END:
  292.  
  293. framebuffer:
  294. .width             dw ?
  295. .height            dw ?
  296. pixelformat:
  297. .bpp               db ?
  298. .depth             db ?
  299. .big_endian        db ?
  300. .true_color        db ?
  301. .red_max           dw ?
  302. .green_max         dw ?
  303. .blue_max          dw ?
  304. .red_shift         db ?
  305. .green_shift       db ?
  306. .blue_shift        db ?
  307. .padding           rb 3
  308. name_length        dd ?
  309. name               rb 256
  310.  
  311. server_ip          dd 0
  312. server_port        dd 0
  313. socket             dd 0
  314. datapointer        dd 0
  315.  
  316. frame:
  317. .width             dw 0
  318. .height            dw 0
  319. .x                 dw 0
  320. .y                 dw 0
  321.  
  322. screen:
  323. .height            dw 0
  324. .width             dw 0
  325.  
  326. thread_ready       db 0
  327.  
  328. dnsMsg:
  329. receive_buffer     rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc)
  330. framebuffer_data   rb 1024*768*3  ; framebuffer
  331.  
  332. thread_stack       rb 0x1000
  333.  
  334. IM_END:
  335.  
  336.  
  337.