0,0 → 1,188 |
thread_start: |
DEBUGF 1,'I am the thread!\n' |
|
mov eax,40 ; Report events |
mov ebx,10000000b ; Only Stack |
int 0x40 |
|
resolve first,[server_ip] ; the input window putted the server @ 'first', resolve it into a real ip |
mov [server_port],5900 ; no port input for now, only standard port 5900 |
|
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] |
eth.search_port 1000,edx ; Find a free port starting from 1001 and store in edx |
eth.open_tcp edx,[server_port],[server_ip],1,[socket] ; open socket |
DEBUGF 1,'Socket opened: %u (port %u)\n',[socket],ecx |
|
call read_data |
cmp dword[receive_buffer+1],'RFB ' |
jne no_rfb |
eth.write_tcp [socket],12,handshake |
DEBUGF 1,'Sending handshake: protocol version\n' |
|
call read_data |
mov eax,receive_buffer+1 |
mov eax,[eax] |
bswap eax |
cmp eax,0 |
je invalid_security |
cmp eax,1 |
je no_security |
cmp eax,2 |
je vnc_security |
|
jmp close |
|
vnc_security: |
mov byte[mode],1 |
call red_logon |
|
no_security: |
eth.write_tcp [socket],1,shared |
DEBUGF 1,'Sending handshake: shared session?\n' |
|
eth.wait_for_data [socket],TIMEOUT*10,close |
eth.read_data [socket],framebuffer,[datapointer],IM_END-receive_buffer ; now the server should send init message |
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] |
mov eax,dword[framebuffer] |
bswap eax |
mov dword[screen],eax |
|
eth.write_tcp [socket],20,pixel_format8 |
DEBUGF 1,'Sending pixel format\n' |
call read_data |
|
; eth.write_tcp [socket],8,encodings |
; DEBUGF 1,'Sending encoding info\n' |
; call read_data |
|
mov eax,dword[framebuffer.width] |
mov dword[fbur.width],eax |
|
mov byte[thread_ready],1 |
|
request_rfb: |
mov byte[fbur.inc],2 ;;;;;;;; |
eth.write_tcp [socket],10,fbur ;;;;;;;;; |
|
thread_loop: |
eth.wait_for_data [socket],1000,thread_loop |
|
call read_data ; Read the data into the buffer |
|
mov eax,[datapointer] ; at least 2 bytes should be received |
sub eax,receive_buffer |
cmp eax,1 |
jle mainloop |
|
DEBUGF 1,'Data received, %u bytes\n',eax |
|
cmp byte[receive_buffer],0 |
je framebufferupdate |
|
cmp byte[receive_buffer],1 |
je setcolourmapentries |
|
cmp byte[receive_buffer],2 |
je bell |
|
cmp byte[receive_buffer],3 |
je servercuttext |
|
jmp thread_loop |
|
|
framebufferupdate: |
mov ax,word[receive_buffer+2] |
xchg al,ah |
mov di,ax |
DEBUGF 1,'Framebufferupdate: %u frames\n',di |
mov esi,receive_buffer+4 |
jmp rectangle_loop |
|
next_rectangle: |
call drawbuffer |
|
dec di |
test di,di |
jz request_rfb |
|
rectangle_loop: |
mov edx,[esi] |
bswap edx |
mov ebx,edx |
shr edx,16 |
mov [frame.x],dx |
mov [frame.y],bx |
add esi,4 |
mov ecx,[esi] |
bswap ecx |
mov eax,ecx |
shr ecx,16 |
mov [frame.width],cx |
mov [frame.height],ax |
add esi,4 |
mov eax,[esi] |
add esi,4 |
|
mov ebx,esi |
sub ebx,receive_buffer+12 |
DEBUGF 1,'frame: width=%u height=%u x=%u y=%u offset:%u encoding:',2[frame.width],2[frame.height],2[frame.x],2[frame.y],ebx |
|
cmp eax,0 |
je encoding_raw |
cmp eax,1 |
je encoding_copyrect |
cmp eax,2 |
je encoding_RRE |
cmp eax,5 |
je encoding_hextile |
cmp eax,16 |
je encoding_ZRLE |
|
mov ebx,esi |
sub ebx,receive_buffer+8 |
DEBUGF 1,'\nunknown encoding: %u (offset %u)\n',eax,ebx |
jmp bell |
jmp thread_loop |
|
encoding_RRE: |
DEBUGF 1,'RRE\n' |
|
jmp next_rectangle |
|
encoding_hextile: |
DEBUGF 1,'hextile\n' |
|
jmp next_rectangle |
|
encoding_ZRLE: |
DEBUGF 1,'ZRLE\n' |
|
jmp next_rectangle |
|
|
setcolourmapentries: |
DEBUGF 1,'Server sended SetColourMapEntries message\n' |
|
jmp thread_loop |
|
|
bell: |
mov eax,55 |
mov ebx,eax |
mov esi,beep |
int 0x40 |
|
jmp thread_loop |
|
|
servercuttext: |
DEBUGF 1,'Server cut text\n' |
|
jmp thread_loop |
|
|
|
read_data: |
eth.read_data [socket],receive_buffer,[datapointer],IM_END-receive_buffer |
ret |