/programs/network/vncc/gui.inc |
---|
26,7 → 26,7 |
mcall |
cmp [status], STATUS_CONNECTING |
ja @f |
ja .login? |
mov ebx, 25 shl 16 + 24 |
xor ecx, ecx |
36,7 → 36,24 |
invoke edit_box_draw, URLbox ; Server textbox |
cmp [status], STATUS_INITIAL |
cmp [status], STATUS_CONNECTING |
jne @f |
mov ebx, 220 shl 16 + 85 |
mov ecx, 47 shl 16 + 16 |
mov edx, 4 |
mov esi, 0xCCCCCC |
mcall 8 ; Cancel button |
mov ebx, 240 shl 16 + 52 |
mov edx, cancelstr |
mov esi, okstr-cancelstr |
mcall 4 ; Cancel button text |
jmp .redraw_done |
@@: |
cmp [status], STATUS_CONNECT |
jne .redraw_done |
mov ebx, 220 shl 16 + 85 |
52,7 → 69,7 |
jmp .redraw_done |
@@: |
.login?: |
cmp [status], STATUS_LOGIN |
ja @f |
81,9 → 98,20 |
mov ebx, 240 shl 16 + 52 |
mov edx, loginstr |
mov esi, loginstr_e-loginstr |
mov esi, cancelstr-loginstr |
mcall 4 ; Login button text |
mov ebx, 120 shl 16 + 85 |
mov ecx, 47 shl 16 + 16 |
mov edx, 4 |
mov esi, 0xCCCCCC |
mcall 8 ; Cancel button |
mov ebx, 140 shl 16 + 52 |
mov edx, cancelstr |
mov esi, okstr-cancelstr |
mcall 4 ; Cancel button text |
jmp .redraw_done |
@@: |
90,13 → 118,40 |
cmp [status], STATUS_DISCONNECTED |
jb .redraw_done |
mov ebx, 25 shl 16 + 15 |
mov ecx, 0x80ca0000 ; red ASCIIZ string |
mov ebx, 15 shl 16 + 10 |
mov ecx, 0x00ca0000 ; red ASCIIZ string |
mov edx, [status] |
sub edx, 10 |
mov edx, [err_msg+4*edx] |
.restart: |
xor esi, esi |
.pr_loop: |
cmp byte[edx+esi], 0 |
je .last |
cmp byte[edx+esi], 0x0a |
je .print |
inc esi |
jmp .pr_loop |
.print: |
mcall 4 |
add edx, esi |
inc edx |
add ebx, 10 |
jmp .restart |
.last: |
mcall 4 ; print error message to window |
mov ebx, 220 shl 16 + 85 |
mov ecx, 47 shl 16 + 16 |
mov edx, 5 |
mov esi, 0xCCCCCC |
mcall 8 ; OK button |
mov ebx, 256 shl 16 + 52 |
mov edx, okstr |
mov esi, okstr_e-okstr |
mcall 4 ; OK button text |
.redraw_done: |
mov [update_gui], 0 |
mcall 12, 2 |
124,7 → 179,7 |
.key: ; key event handler |
mcall 2 ; read key |
cmp [status], STATUS_INITIAL |
cmp [status], STATUS_CONNECT |
jne @f |
test [URLbox.flags], ed_focus |
jz mainloop |
131,14 → 186,21 |
cmp ah, 13 ; enter (return) key |
je .connect |
invoke edit_box_key, URLbox |
jmp .loop |
@@: |
cmp [status], STATUS_REQ_LOGIN |
jne .loop |
jne @f |
cmp ah, 13 ; enter (return) key |
je .login |
invoke edit_box_key, USERbox |
invoke edit_box_key, PASSbox |
jmp .loop |
@@: |
cmp [status], STATUS_DISCONNECTED |
jb @f |
cmp ah, 13 |
je .ok |
@@: |
jmp .loop |
.btn: |
150,6 → 212,10 |
je .connect |
cmp ah, 3 ; login ? |
je .login |
cmp ah, 4 |
je .cancel |
cmp ah, 5 |
je .ok |
jmp .loop |
156,17 → 222,7 |
.connect: |
mov eax, [URLbox.pos] |
mov byte[serveraddr+eax], 0 |
mov [status], STATUS_CONNECTING |
inc [update_gui] |
; Create network thread |
mcall 51, 1, thread_start, thread_stack |
cmp eax, -1 |
jne @f |
mov [status], STATUS_THREAD_ERR |
; inc [update_gui] |
@@: |
call open_connection |
jmp .loop |
.login: |
174,8 → 230,16 |
inc [update_gui] |
jmp .loop |
.cancel: |
mcall 18, 18, [thread_id] ; kill thread |
.ok: |
and [URLbox.flags], not ed_disabled |
mov [status], STATUS_CONNECT |
inc [update_gui] |
jmp .loop |
.mouse: |
cmp [status], STATUS_INITIAL |
cmp [status], STATUS_CONNECT |
jne @f |
invoke edit_box_mouse, URLbox |
@@: |
188,4 → 252,21 |
.close: |
mov [status], STATUS_CLOSED |
mcall -1 |
mcall -1 |
open_connection: |
or [URLbox.flags], ed_disabled |
mov [status], STATUS_CONNECTING |
; Create network thread |
mcall 51, 1, thread_start, thread_stack |
cmp eax, -1 |
jne @f |
mov [status], STATUS_THREAD_ERR |
@@: |
mov [thread_id], eax |
inc [update_gui] |
ret |
/programs/network/vncc/network.inc |
---|
70,26 → 70,39 |
cmp eax, -1 |
je err_connect |
; Wait for handshake from server |
; TODO: implement timeout |
; Verify handshake from server |
call wait_for_data |
cmp dword[receive_buffer], "RFB " |
jne err_proto |
add esi, 12 |
; Did we get an error message already? |
cmp eax, 16 |
jb @f |
lodsd |
test eax, eax |
je err_handshake |
@@: |
; Reply to handshake |
DEBUGF 1, "Sending handshake\n" |
mcall send, [socketnum], HandShake, 12, 0 |
; VNC 3.3 protocol: server decides security type |
call wait_for_data |
cmp dword[receive_buffer], 0x01000000 ; no security |
lodsd |
cmp eax, 0x00000000 |
je err_handshake |
cmp eax, 0x01000000 ; no security |
je initialize |
cmp dword[receive_buffer], 0x02000000 ; VNC security |
cmp eax, 0x02000000 ; VNC security |
je vnc_security |
jmp err_proto |
jmp err_security |
vnc_security: |
push esi ; pointer to message |
mov dword[password], 0 |
mov dword[password+4], 0 |
110,7 → 123,6 |
DEBUGF 1, "VNC authentication\n" |
; Bit reverse the password and create DES keys |
mov ebx, dword[password] |
mov edx, ebx |
and ebx, 0xf0f0f0f0 |
157,21 → 169,22 |
call DES_create_keys |
; Encrypt message with DES |
mov ebx, dword[receive_buffer+4] |
mov edx, dword[receive_buffer+8] |
mov esi, [esp] |
mov ebx, dword[esi+0] |
mov edx, dword[esi+4] |
call encrypt_DES |
mov dword[receive_buffer+4], ebx |
mov dword[receive_buffer+8], edx |
mov esi, [esp] |
mov dword[esi+0], ebx |
mov dword[esi+4], edx |
mov ebx, dword[receive_buffer+12] |
mov edx, dword[receive_buffer+16] |
mov ebx, dword[esi+8] |
mov edx, dword[esi+12] |
call encrypt_DES |
mov dword[receive_buffer+12], ebx |
mov dword[receive_buffer+16], edx |
mov esi, [esp] |
mov dword[esi+8], ebx |
mov dword[esi+12], edx |
; Blank out the password and key fields in RAM |
mov edi, password |
mov ecx, 384/4 |
xor eax, eax |
178,13 → 191,14 |
rep stosd |
; Send the authentication response to server |
pop edx |
mcall send, [socketnum], , 16, 0 |
mcall send, [socketnum], receive_buffer+4, 16, 0 |
securityresult: |
; Wait for SecurityResult from server |
call wait_for_data |
cmp dword[receive_buffer], 0 |
cmp dword[receive_buffer], 0 ; OK |
jne err_login |
; jmp initialize |
initialize: |
DEBUGF 1, "Sending ClientInit\n" |
307,12 → 321,10 |
je encoding_CopyRect |
cmp eax, 2 |
je encoding_RRE |
; cmp eax, 5 |
; je encoding_hextile |
; cmp eax, 15 |
; je encoding_TRLE |
; cmp eax, 16 |
; je encoding_ZRLE |
cmp eax, 15 |
je encoding_TRLE |
cmp eax, 16 |
je encoding_ZRLE |
DEBUGF 2, "unknown encoding: %u\n", eax |
jmp thread_loop |
416,6 → 428,8 |
ret |
.buffer_end_reached: |
DEBUGF 1, "end of buffer reached, re-organizing\n" |
pop edi esi edx ecx ebx |
; Buffer is full, first needed data by program is pointed to by esi. |
; Move all usefull data to begin of buffer |
cmp esi, receive_buffer |
436,6 → 450,7 |
je err_sock |
test eax, eax |
jz err_disconnected |
mov esi, receive_buffer |
ret |
466,8 → 481,24 |
mcall -1 |
ret |
err_security: |
err_handshake: |
mov [status], STATUS_SECURITY_ERR |
lodsd ; Custom message from server? |
test eax, eax |
jz .no_msg |
bswap eax |
mov ecx, eax |
cmp ecx, 512 |
jb @f |
mov ecx, 512 |
@@: |
mov edi, sz_err_security_c |
rep movsb |
mov byte[edi], 0 |
mov [status], STATUS_SECURITY_ERR_C |
.no_msg: |
inc [update_gui] |
mcall -1 |
ret |
/programs/network/vncc/vncc.asm |
---|
18,6 → 18,7 |
__DEBUG_LEVEL__ = 2 |
BITS_PER_PIXEL = 8 ; 8, 16 24 |
SERVERADDRLEN = 4096 |
use32 |
29,7 → 30,7 |
dd I_END ; size of image |
dd IM_END ; memory for app |
dd IM_END ; esp |
dd 0x0, 0x0 ; I_Param , I_Path |
dd serveraddr, 0x0 ; I_Param , I_Path |
include "../../macros.inc" |
include "../../debug-fdo.inc" |
68,7 → 69,7 |
RECEIVE_BUFFER_SIZE = 8*1024*1024 ; 8 Mib |
STATUS_INITIAL = 0 |
STATUS_CONNECT = 0 |
STATUS_CONNECTING = 1 |
STATUS_REQ_LOGIN = 2 |
STATUS_LOGIN = 3 |
84,6 → 85,7 |
STATUS_LIB_ERR = 16 |
STATUS_THREAD_ERR = 17 |
STATUS_LOGIN_FAILED = 18 |
STATUS_SECURITY_ERR_C = 19 |
BYTES_PER_PIXEL = (BITS_PER_PIXEL + 7) / 8 |
108,6 → 110,19 |
mov [status], STATUS_LIB_ERR |
@@: |
; Check if we got a server address through parameters |
cmp byte[serveraddr], 0 |
je @f |
xor al, al |
mov edi, serveraddr |
mov ecx, SERVERADDRLEN |
repne scasb |
sub edi, serveraddr+1 |
mov [URLbox.size], edi |
mov [URLbox.pos], edi |
call open_connection |
@@: |
; Present the user with the GUI and wait for network connection |
call draw_gui |
140,6 → 155,7 |
mcall 12, 2 |
draw_framebuffer: |
DEBUGF 1, "Drawing framebuffer\n" |
mcall 7, framebuffer_data, dword[screen], 0 |
mov [update_framebuffer], 0 |
314,13 → 330,12 |
SetEncodings db 2 ; setEncodings |
db 0 ; padding |
db 0, 3 ; number of encodings |
db 0, 4 ; number of encodings |
; db 0, 0, 0, 16 ; ZRLE |
db 0, 0, 0, 15 ; TRLE |
db 0, 0, 0, 2 ; RRE |
db 0, 0, 0, 1 ; Copyrect encoding |
db 0, 0, 0, 2 ; RRE |
db 0, 0, 0, 0 ; raw encoding |
; db 0, 0, 0, 5 ; HexTile |
; db 0, 0, 0, 15 ; TRLE |
; db 0, 0, 0, 16 ; ZRLE |
.length = $ - SetEncodings |
FramebufferUpdateRequest db 3 |
349,16 → 364,17 |
beep db 0x85, 0x25, 0x85, 0x40, 0 |
status dd STATUS_INITIAL |
status dd STATUS_CONNECT |
update_gui dd 0 |
mouse_dd dd 0 |
update_framebuffer dd 0 |
thread_id dd 0 |
deflate_buffer dd 0 |
deflate_length dd ? |
deflate_str dd ? |
URLbox edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0, 65535, serveraddr, mouse_dd, ed_focus, 0, 0 |
URLbox edit_box 235, 70, 20, 0xffffff, 0x6f9480, 0, 0, 0, SERVERADDRLEN, serveraddr, mouse_dd, ed_focus, 0, 0 |
USERbox edit_box 215, 90, 10, 0xffffff, 0x6f9480, 0, 0, 0, 127, username, mouse_dd, ed_focus, 0, 0 |
PASSbox edit_box 215, 90, 30, 0xffffff, 0x6f9480, 0, 0, 0, 127, password, mouse_dd, ed_pass, 0, 0 |
367,14 → 383,16 |
passstr db "password:" |
connectstr db "Connect" |
loginstr db "Log in" |
loginstr_e: |
cancelstr db "Cancel" |
okstr db "OK" |
okstr_e: |
sz_err_disconnected db "Server closed connection unexpectedly.", 0 |
sz_err_disconnected db "The server has closed the connection unexpectedly.", 0 |
sz_err_dns db "Could not resolve hostname.", 0 |
sz_err_sock db "Could not open socket.", 0 |
sz_err_connect db "Could not connect to the server.", 0 |
sz_err_proto db "A protocol error has occured.", 0 |
sz_err_security db "Server requested an unsupported security type.", 0 |
sz_err_security db "An authentication problem has occured.", 0 |
sz_err_library db "Could not load needed libraries.", 0 |
sz_err_thread db "Could not create thread.", 0 |
sz_err_login_failed db "Login failed.", 0 |
388,6 → 406,7 |
dd sz_err_library |
dd sz_err_thread |
dd sz_err_login_failed |
dd sz_err_security_c |
; import |
align 4 |
421,6 → 440,9 |
servername rb 64+1 |
serveraddr db 0 |
rb SERVERADDRLEN |
socketnum dd ? |
datapointer dd ? |
454,7 → 476,8 |
password rb 128 |
keys rd 32*2 ; DES keys for VNC authentication |
serveraddr rb 65536 |
sz_err_security_c rb 512+1 |
receive_buffer rb RECEIVE_BUFFER_SIZE |
framebuffer_data rb 1280*1024*3 ; framebuffer |