forked from KolibriOS/kolibrios
188 lines
4.6 KiB
PHP
188 lines
4.6 KiB
PHP
|
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
|