Subversion Repositories Kolibri OS

Rev

Rev 264 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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