Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
264 | hidnplayr | 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 |