thread_start: DEBUGF 1, 'I am the thread!\n' mcall 40, 1 shl 7 ; resolve name push esp ; reserve stack place invoke getaddrinfo, first, 0, 0, esp pop esi ; test for error test eax, eax jnz exit mov eax, [esi+addrinfo.ai_addr] mov eax, [eax+sockaddr_in.sin_addr] mov [sockaddr1.ip], eax ; DEBUGF 1, 'Connecting to %u.%u.%u.%u:%u\n', \ ; [server_ip]:1, [server_ip+1]:1, \ ; [server_ip+2]:1, [server_ip+3]:1, \ ; [server_port]:2 mcall socket, AF_INET4, SOCK_STREAM, 0 mov [socketnum], eax mcall connect, [socketnum], sockaddr1, 18 call wait_for_data cmp dword [receive_buffer], 'RFB ' jne no_rfb DEBUGF 1, 'received: %s\n', receive_buffer mcall send, [socketnum], handshake, 12, 0 DEBUGF 1, 'Sending handshake: protocol version\n' call wait_for_data cmp dword [receive_buffer], 0x00000000 je invalid_security cmp dword [receive_buffer], 0x01000000 je no_security cmp dword [receive_buffer], 0x02000000 je vnc_security jmp exit vnc_security: mov byte[mode], 1 call red_logon no_security: mcall send, [socketnum], shared, 1, 0 DEBUGF 1, 'Sending handshake: shared session?\n' mcall 23, 100*TIMEOUT call wait_for_data ; now the server should send init message DEBUGF 1, 'Serverinit: bpp: %u depth: %u bigendian: %u truecolor: %u\n', \ [receive_buffer+framebuffer.pixelformat.bpp]:1, \ [receive_buffer+framebuffer.pixelformat.depth]:1, \ [receive_buffer+framebuffer.pixelformat.big_endian]:1, \ [receive_buffer+framebuffer.pixelformat.true_color]:1 mov eax, dword [receive_buffer] mov dword [fbur.width], eax bswap eax mov dword [screen], eax mcall send, [socketnum], pixel_format8, 20, 0 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 byte [thread_ready], 1 request_rfb: mov [fbur.inc], 2 mcall send, [socketnum], fbur, 10, 0 thread_loop: mcall 23, 100 call read_data ; Read the data into the buffer ; cmp eax, 2 ; jb 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 align 4 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:',\ [frame.width]:2, [frame.height]:2, [frame.x]:2, [frame.y]:2, 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 sent SetColourMapEntries message\n' jmp thread_loop bell: mcall 55, 55, , , beep jmp thread_loop servercuttext: DEBUGF 1, 'Server cut text\n' jmp thread_loop read_data: mov [datapointer], receive_buffer .loop: mcall 23, 100*TIMEOUT mcall recv, [socketnum], [datapointer], 4096, 0 cmp eax, -1 je .done add [datapointer], eax cmp eax, 4096 je .loop .done: mov eax, [datapointer] sub eax, receive_buffer ret wait_for_data: mcall 23, 500 mcall recv, [socketnum], receive_buffer, 4096, 0 cmp eax, -1 je wait_for_data test eax, eax jz wait_for_data ret