1,3 → 1,15 |
; version: 0.5 |
; last update: 07/10/2010 |
; written by: Marat Zakiyanov aka Mario79, aka Mario |
; changes: reducing the size of the binary code, |
; program uses far less memory while running |
; (>0x7000, the old version used >0x100000), |
; process only net event at start with parameter |
;----------------------------------------------------------- |
; version 0.3 -0.4 |
; written by: CleverMouse |
; |
;----------------------------------------------------------- |
; wget 0.2 by barsuk |
; based on Menuet Httpc |
|
12,15 → 24,17 |
db 'MENUET01' ; header |
dd 0x01 ; header version |
dd START ; entry point |
dd I_END ; image size |
dd 0x100000 ; required memory |
dd 0x100000 ; esp |
dd IM_END ; image size |
dd I_END ;0x100000 ; required memory |
dd stacktop ; esp |
dd params ; I_PARAM |
dd 0x0 ;I_Path |
|
include 'lang.inc' |
include '../../../macros.inc' |
include "DEBUG.INC" |
include "../../../proc32.inc" |
include "dll.inc" |
include "debug.inc" |
|
URLMAXLEN equ 256 ; maximum length of url string |
|
30,24 → 44,34 |
; webpage headers at buf_headers |
|
START: ; start of execution |
|
;dps <"Program started",13,10> |
; prepare webAddr area |
mov al,' ' |
mov edi,webAddr |
mov ecx,URLMAXLEN |
cld |
rep stosb |
xor eax,eax |
stosb |
; prepare document area |
mov al,'/' |
mov edi,document |
cld |
stosb |
mov al,' ' |
mov ecx,URLMAXLEN-1 |
rep stosb |
|
mov eax,40 ; Report events |
mov ebx,10000111b ; Stack 8 + defaults |
mcall |
; create local heap |
mcall 68,11 |
|
mov eax, 68 ; create local heap |
mov ebx, 11 |
mcall |
|
call load_settings |
cmp [params],byte 0 |
jz prepare_event ;red |
|
cmp byte [params], 0 |
jz red |
mcall 40,10000000b ; only net event!!! |
|
; we have an url |
|
mov edi, document_user |
mov al, ' ' |
mov ecx, URLMAXLEN |
55,16 → 79,20 |
|
mov esi, params |
mov edi, document_user |
|
.copy_param: |
mov al, [esi] |
cmp al, 0 |
jz .done |
|
cmp al, ' ' |
jz .done_inc |
|
mov [edi], al |
inc esi |
inc edi |
jmp .copy_param |
|
.done_inc: |
; url is followed by shared memory name. |
inc esi |
76,41 → 104,39 |
|
jmp still |
|
prepare_event: |
; Report events |
; Stack 8 + defaults |
mcall 40,10000111b |
|
red: ; redraw |
call draw_window |
|
still: |
mov eax,23 ; wait here for event |
mov ebx,1 |
mcall |
|
mcall 23,1 ; wait here for event |
cmp eax,1 ; redraw request ? |
je red |
|
cmp eax,2 ; key in buffer ? |
je key |
|
cmp eax,3 ; button in buffer ? |
je button |
|
; Get the web page data from the remote server |
call read_incoming_data |
|
mov eax,[status] |
mov [prev_status],eax |
|
mov eax,53 |
mov ebx,6 |
mov ecx,[socket] |
mcall |
|
mcall 53,6,[socket] |
mov [status],eax |
|
cmp [prev_status],4 |
jge no_send |
|
cmp [status],4 |
jne no_send |
|
mov [onoff],1 |
|
call send_request |
|
no_send: |
121,16 → 147,9 |
cmp [status],4 ; connection closed by server |
jbe no_close ; respond to connection close command |
; draw page |
|
call read_incoming_data |
|
mov eax,53 |
mov ebx,8 |
mov ecx,[socket] |
mcall |
|
mcall 53,8,[socket] |
call draw_page |
|
mov [onoff],0 |
|
no_close: |
137,8 → 156,7 |
jmp still |
|
key: ; key |
mov eax,2 ; just read it and ignore |
mcall |
mcall 2 ; just read it and ignore |
shr eax,8 |
cmp eax,184 |
jne no_down |
158,13 → 176,11 |
|
button: ; button |
;dps <"Button pressed",13,10> |
mov eax,17 ; get id |
mcall |
mcall 17 ; get id |
cmp ah,26 |
je save |
cmp ah,1 ; button id=1 ? |
jne noclose |
|
;dps "Closing socket before exit... " |
|
close_end_exit: |
179,11 → 195,8 |
save: |
dps "saving" |
newline |
mov eax, 70 |
mov ebx, fileinfo |
mcall |
mcall 70,fileinfo |
;pregs |
|
jmp still |
|
noclose: |
218,15 → 231,13 |
mov edi,[addr] |
|
f11: |
mov eax,10 |
mcall |
mcall 10 |
cmp eax,2 ; key? |
jz fbu |
jmp still |
|
fbu: |
mov eax,2 |
mcall ; get key |
mcall 2 ; get key |
shr eax,8 |
cmp eax,8 |
jnz nobs |
238,30 → 249,27 |
jmp f11 |
|
nobs: |
cmp eax, dword 10 |
cmp eax,10 |
je retkey |
cmp eax, dword 13 |
cmp eax,13 |
je retkey |
|
cmp eax,dword 31 |
cmp eax,31 |
jbe f11 |
|
; Removed in v0.4 |
; cmp eax,dword 95 |
; cmp eax,95 |
; jb keyok |
; sub eax,32 |
|
keyok: |
mov [edi],al |
|
call print_text |
|
add edi,1 |
mov esi,[addr] |
add esi,URLMAXLEN |
cmp esi,edi |
jnz f11 |
|
jmp still |
|
retkey: |
271,7 → 279,6 |
call socket_commands ; opens or closes the connection |
jmp still |
|
|
;**************************************************************************** |
; Function |
; send_request |
283,19 → 290,18 |
;**************************************************************************** |
send_request: |
pusha |
|
mov esi, string0 |
mov edi, request |
movsd |
|
; If proxy is used, make absolute URI - prepend http://<host> |
cmp byte [proxyAddr], 0 |
cmp [proxyAddr],byte 0 |
jz .noproxy |
mov dword [edi], 'http' |
mov byte [edi+4], ':' |
mov word [edi+5], '//' |
mov [edi+4],byte ':' |
mov [edi+5],word '//' |
add edi, 7 |
mov esi, webAddr |
|
.copy_host_loop: |
lodsb |
cmp al, ' ' |
302,9 → 308,10 |
jz .noproxy |
stosb |
jmp .copy_host_loop |
|
.noproxy: |
xor edx,edx ; 0 |
|
mov edx, 0 |
.next_edx: |
; Determine the length of the url to send in the GET request |
mov al, [edx+document] |
314,13 → 321,13 |
inc edi |
inc edx |
jmp .next_edx |
|
.document_done: |
|
mov esi, stringh |
mov ecx, stringh_end-stringh |
rep movsb |
xor edx,edx ; 0 |
|
mov edx, 0 |
.webaddr_next: |
mov al, [webAddr + edx] |
cmp al, ' ' |
329,13 → 336,12 |
inc edi |
inc edx |
jmp .webaddr_next |
|
.webaddr_done: |
|
cmp byte [proxyUser], 0 |
cmp [proxyUser],byte 0 |
jz @f |
call append_proxy_auth_header |
@@: |
|
mov esi, connclose |
mov ecx, connclose_end-connclose |
rep movsb |
348,7 → 354,7 |
mov cl,[edx] |
cmp edx,edi |
jz @f |
int 40h |
mcall |
inc edx |
jmp @b |
@@: |
356,18 → 362,11 |
|
mov edx, edi |
sub edx, request |
|
;;;;now write \r\nConnection: Close \r\n\r\n |
mov eax, 53 ; ' HTTP/1.1 .. ' |
mov ebx, 7 |
mov ecx, [socket] |
mov esi, request |
mcall |
|
mcall 53,7,[socket],,request ;' HTTP/1.1 .. ' |
popa |
ret |
|
|
;**************************************************************************** |
; Function |
; print_status |
378,47 → 377,31 |
;**************************************************************************** |
print_status: |
pusha |
|
mov eax,26 |
mov ebx,9 |
mcall |
|
mcall 26,9 |
cmp eax,[nextupdate] |
jb status_return |
|
add eax,25 |
|
mov [nextupdate],eax |
|
mov eax,13 |
mov ebx,5*65536+100 |
mov ecx,[winys] |
shl ecx,16 |
add ecx,-18*65536+10 |
mov edx,0xffffff |
mcall |
mcall 13,<5,100>,,0xffffff |
|
mov eax,47 |
mov ebx,3*65536 |
mov ecx,[status] |
mov edx,12*65536-18 |
add edx,[winys] |
mov esi,0x000000 |
mcall |
xor esi,esi |
mcall 47,<3,0>,[status],, |
|
mov eax,47 |
mov ebx,6*65536 |
mov ecx,[pos] |
mov edx,40*65536-18 |
add edx,[winys] |
mov esi,0x000000 |
mcall |
mcall ,<6,0>,[pos] |
|
status_return: |
popa |
ret |
|
|
;**************************************************************************** |
; Function |
; read_incoming_data |
433,7 → 416,6 |
ret |
|
rid: |
|
push esi |
push edi |
dps "rid" |
440,39 → 422,20 |
newline |
|
newbyteread: |
|
;call print_status |
|
mov eax, 53 |
mov ebx, 2 |
mov ecx, [socket] |
mcall |
|
mcall 53,2,[socket] |
cmp eax,0 |
je no_more_data |
|
mov eax, 53 |
mov ebx, 11 |
mov edx, primary_buf |
mov ecx, [socket] |
mov esi, primary_buffer_size |
mcall |
mcall 53,11,[socket],primary_buf,primary_buffer_size |
|
;dps "part " |
;dph eax |
;newline |
|
mov edi, [pos] |
|
add [pos], eax |
push eax |
|
mov eax, 68 |
mov ebx, 20 |
mov ecx, [pos] |
mov edx, [buf_ptr] |
mcall |
|
mcall 68,20,[pos],[buf_ptr] |
mov [buf_ptr], eax |
add edi, eax |
mov esi, primary_buf |
481,55 → 444,43 |
rep movsb |
|
no_more_data: |
|
mov eax, 53 |
mov ebx, 6 |
mov ecx, [socket] |
mcall |
mcall 53,6,[socket] |
cmp eax, 4 |
jne no_more_data.finish |
|
jmp newbyteread |
|
.finish: |
|
;dps "finish " |
;pregs |
|
call parse_result |
|
mov ecx, [shared_name] |
cmp byte [ecx], 0 |
cmp [ecx],byte 0 |
jnz save_in_shared |
mov eax, 70 |
mov ebx, fileinfo |
mcall |
|
mcall 70,fileinfo |
;dps "saving " |
;pregs |
|
;jmp close_end_exit |
|
pop edi |
pop esi |
|
; if called from command line, then exit |
cmp byte [params], 0 |
cmp [params],byte 0 |
jnz exit |
|
ret |
|
save_in_shared: |
mov eax, 68 |
mov ebx, 22 |
mov esi, 1 ; SHM_OPEN+SHM_WRITE |
mcall |
mcall 68,22 |
test eax, eax |
jz save_in_shared_done |
|
sub edx, 4 |
jbe save_in_shared_done |
|
mov ecx, [final_size] |
cmp ecx, edx |
jb @f |
|
mov ecx, edx |
@@: |
mov [eax], ecx |
541,6 → 492,7 |
mov ecx, edx |
and ecx, 3 |
rep movsb |
|
save_in_shared_done: |
pop edi |
pop esi |
550,63 → 502,46 |
; in: buf_ptr, pos; out: buf_ptr, pos. |
|
parse_result: |
|
; close socket |
mov eax, 53 |
mov ebx, 8 |
mov ecx, [socket] |
mcall |
mcall 53,8,[socket] |
|
dps "close socket: " |
dph eax |
newline |
|
mov edi, [buf_ptr] |
mov edx, [pos] |
|
mov [buf_size], edx |
;mov eax, 70 |
;mov ebx, fileinfo_tmp |
;mcall |
|
; mcall 70,fileinfo_tmp |
dps "pos = " |
dph edx |
newline |
|
; first, find end of headers |
|
.next_byte: |
cmp dword [edi], 0x0d0a0d0a ; ìíå ëåíü ÷èòàòü ñòàíäàðò, ïóñòü áóäóò îáà âàðèàíòà |
cmp [edi],dword 0x0d0a0d0a ; ìíå ëåíü ÷èòàòü ñòàíäàðò, ïóñòü áóäóò îáà âàðèàíòà |
je .end_of_headers |
cmp dword [edi], 0x0a0d0a0d |
cmp [edi],dword 0x0a0d0a0d |
je .end_of_headers |
inc edi |
dec edx |
jne .next_byte |
|
; no end of headers. it's an error. let client see all those headers. |
ret |
|
.end_of_headers: |
|
|
; here we look at headers and search content-length or transfer-encoding headers |
|
;dps "eoh " |
;newline |
|
sub edi, [buf_ptr] |
add edi, 3 |
mov [body_pos], edi ; store position where document body starts |
mov [is_chunked], 0 |
|
; find content-length in headers |
; not good method, but should work for 'Content-Length:' |
|
mov esi, [buf_ptr] |
mov edi, s_contentlength |
mov ebx, [body_pos] |
mov edx, 0 |
xor edx,edx ; 0 |
.cl_next: |
mov al, [esi] |
cmp al, [edi + edx] |
616,7 → 551,7 |
je .cl_found |
jmp .cl_incr |
.cl_fail: |
mov edx, 0 |
xor edx,edx ; 0 |
.cl_incr: |
inc esi |
dec ebx |
627,16 → 562,14 |
;newline |
;dph esi |
;dps " content-length not found " |
|
; find 'chunked' |
|
; äà, ÿ êîïèðóþ êîä, ýòî óæàñíî, íî ìíå õî÷åòñÿ, ÷òîáû ïîñêîðåå çàðàáîòàëî |
; à òàì óæ îòðåôàêòîðþ |
|
mov esi, [buf_ptr] |
mov edi, s_chunked |
mov ebx, [body_pos] |
mov edx, 0 |
xor edx,edx ; 0 |
|
.ch_next: |
mov al, [esi] |
cmp al, [edi + edx] |
645,15 → 578,17 |
cmp edx, len_chunked |
je .ch_found |
jmp .ch_incr |
|
.ch_fail: |
mov edx, 0 |
xor edx,edx ; 0 |
|
.ch_incr: |
inc esi |
dec ebx |
je .ch_error |
jmp .ch_next |
|
.ch_error: |
|
; if neither of the 2 headers is found, it's an error |
;dps "transfer-encoding: chunked not found " |
mov eax, [pos] |
661,7 → 596,6 |
jmp .write_final_size |
|
.ch_found: |
|
mov [is_chunked], 1 |
mov eax, [body_pos] |
add eax, [buf_ptr] |
670,7 → 604,6 |
jmp parse_chunks |
|
.cl_found: |
|
call read_number ; eax = number from *esi |
inc eax ; bugfix :) |
|
684,7 → 617,6 |
;pregs |
|
; everything is ok, so we return |
|
mov eax, [body_pos] |
mov ebx, [buf_ptr] |
add ebx, eax |
692,33 → 624,26 |
;mov ebx, [pos] |
;sub ebx, eax |
;mov [final_size], ebx |
|
ret |
|
parse_chunks: |
|
;dps "parse chunks" |
;newline |
; we have to look through the data and remove sizes of chunks we see |
|
; 1. read size of next chunk |
; 2. if 0, it's end. if not, continue. |
; 3. make a good buffer and copy a chunk there |
xor eax,eax |
mov [final_buffer],eax ; 0 |
mov [final_size],eax ; 0 |
|
mov [final_buffer], 0 |
mov [final_size], 0 |
|
.read_size: |
|
mov eax, [prev_chunk_end] |
mov ebx, eax |
sub ebx, [buf_ptr] |
|
mov edx, eax |
|
;dps "rs " |
;pregs |
|
cmp ebx, [pos] |
jae chunks_end ; not good |
|
734,39 → 659,24 |
|
;dps "sz " |
;pregs |
|
; do copying: from buf_ptr+edx to final_buffer+prev_final_size count eax |
|
; realloc final buffer |
|
push eax |
push edx |
push dword [final_size] |
|
add [final_size], eax |
|
mov eax, 68 |
mov ebx, 20 |
mov ecx, [final_size] |
mov edx, [final_buffer] |
mcall |
mcall 68,20,[final_size],[final_buffer] |
mov [final_buffer], eax |
;dps "re " |
;pregs |
|
pop edi |
pop esi |
pop ecx |
|
;add [pos], ecx |
|
add edi, [final_buffer] |
|
;dps "cp " |
;pregs |
|
rep movsb |
|
jmp .read_size |
|
chunks_end: |
773,24 → 683,16 |
; free old buffer |
dps "chunks end" |
newline |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, [buf_ptr] |
mcall |
|
mcall 68,13,[buf_ptr] |
; done! |
|
ret |
|
|
|
; reads content-length from [edi+ecx], result in eax |
read_number: |
|
push ebx |
xor eax, eax |
xor ebx, ebx |
|
.next: |
mov bl, [esi] |
;dph ebx |
802,29 → 704,26 |
shl eax, 1 |
lea eax,[eax + eax * 4] ; eax *= 10 |
add eax, ebx |
|
.not_number: |
cmp bl, 13 |
jz .done |
inc esi |
jmp .next |
|
.done: |
pop ebx |
;newline |
;dps "strtoint eax " |
;pregs |
|
ret |
|
|
; reads hex from eax, result in eax, end of text in ebx |
read_hex: |
|
add eax, 2 |
mov ebx, eax |
|
mov eax, [ebx] |
mov [deba], eax |
|
; pushf |
; pushad |
; mov edx,deba |
831,7 → 730,6 |
; call debug_outstr |
; popad |
; popf |
|
xor eax, eax |
xor ecx, ecx |
.next: |
844,13 → 742,17 |
or cl, 0x20 |
sub cl, '0' |
jb .bad |
|
cmp cl, 0x9 |
jbe .adding |
|
sub cl, 'a'-'0'-10 |
cmp cl, 0x0a |
jb .bad |
|
cmp cl, 0x0f |
ja .bad |
|
.adding: |
shl eax, 4 |
or eax, ecx |
864,9 → 766,6 |
;pregs |
ret |
|
|
|
|
;**************************************************************************** |
; Function |
; draw_page |
880,7 → 779,6 |
draw_page: |
ret |
|
|
;**************************************************************************** |
; Function |
; linefeed |
890,7 → 788,6 |
; |
;**************************************************************************** |
linefeed: |
|
ret |
|
;**************************************************************************** |
919,53 → 816,46 |
dps "opening socket" |
newline |
; Clear all page memory |
xor eax,eax |
mov [prev_chunk_end],eax ; 0 |
cmp [buf_ptr],eax ; 0 |
jz no_free |
|
mov [prev_chunk_end], 0 |
mcall 68,13,[buf_ptr] ; free buffer |
|
cmp [buf_ptr], 0 |
jz no_free |
mov eax, 68 ; free buffer |
mov ebx, 13 |
mov ecx, [buf_ptr] |
mcall |
no_free: |
mov [buf_size], 0 |
|
xor eax,eax |
mov [buf_size],eax ; 0 |
; Parse the entered url |
call parse_url |
|
; Get a free port number |
mov ecx, 1000 ; local port starting at 1000 |
|
getlp1: |
inc ecx |
push ecx |
mov eax, 53 |
mov ebx, 9 |
mcall |
mcall 53,9 |
pop ecx |
cmp eax, 0 ; is this local port in use? |
jz getlp1 ; yes - so try next |
|
mov eax,53 |
mov ebx,5 |
mov edx,80 |
cmp [proxyAddr], 0 |
cmp [proxyAddr],byte 0 |
jz sc000 |
mov edx,[proxyPort] |
sc000: |
mov esi,dword [server_ip] |
mov edi,1 |
mcall |
mcall 53,5,,,[server_ip],1 |
mov [socket], eax |
|
mov [pos],0 |
mov [pagex],0 |
mov [pagey],0 |
mov [pagexs],80 |
mov [command_on_off],0 |
|
mov [is_body], 0 |
|
push eax |
xor eax,eax ; 0 |
mov [pos],eax |
mov [pagex],eax |
mov [pagey],eax |
mov [command_on_off],eax |
mov [is_body],eax |
pop eax |
ret |
|
tst3: |
972,20 → 862,11 |
cmp ah,24 ; close socket |
jnz no_24 |
|
mov eax,53 |
mov ebx,8 |
mov ecx,[socket] |
mcall |
|
mcall 53,8,[socket] |
call draw_page |
|
ret |
|
no_24: |
ret |
|
|
|
;**************************************************************************** |
; Function |
; parse_url |
1029,7 → 910,7 |
pu_000: |
cmp [esi], byte ' ' ; end of text? |
je pu_002 ; yep, so not found |
cmp word [esi], ax |
cmp [esi],ax |
je pu_001 ; Found it, so esi+2 is start |
inc esi |
loop pu_000 |
1040,10 → 921,8 |
|
pu_001: |
add esi, 2 |
|
mov ebx, esi ; save address of start of web address |
mov edi, document_user + URLMAXLEN ; end of string |
|
; look for page delimiter - it's a '/' character |
pu_003: |
cmp [esi], byte ' ' ; end of text? |
1068,8 → 947,9 |
cmp esi, ecx |
je pu_007 ; end of string? |
cmp [esi], byte ' ' ; end of text |
je pu_007 |
jmp pu_006 |
; je pu_007 ; äçåí-àññåìáëåð |
; jmp pu_006 ; íå íàäî ïëîäèòü ñóùíîñòè ïî íàïðàñíó |
jne pu_006 |
|
pu_007: |
pop esi ; point esi to '/' delimiter |
1085,12 → 965,12 |
pu_008: |
movsb |
cmp esi, ecx |
je pu_009 |
jmp pu_008 |
; je pu_009 ; äçåí-àññåìáëåð |
; jmp pu_008 ; íå íàäî ïëîäèòü ñóùíîñòè ïî íàïðàñíó |
jne pu_008 |
|
pu_009: |
; For debugging, display resulting strings |
|
if DEBUGGING_STATE = DEBUGGING_ENABLED |
mov esi, document_user |
call debug_print_string |
1099,7 → 979,6 |
mov esi, document |
call debug_print_string |
end if |
|
; Look up the ip address, or was it specified? |
mov al, [proxyAddr] |
cmp al, 0 |
1111,12 → 990,10 |
cmp al, '9' |
ja pu_010 ; Resolve address |
|
|
if DEBUGGING_STATE = DEBUGGING_ENABLED |
mov esi, str2 ; print gotip |
call debug_print_string |
end if |
|
; Convert address |
; If proxy is given, get proxy address instead of server |
mov esi,proxyAddr-1 |
1123,10 → 1000,11 |
cmp byte [esi+1], 0 |
jnz pu_020 |
mov esi,webAddr-1 |
|
pu_020: |
|
mov edi,server_ip |
xor eax,eax |
|
ip1: |
inc esi |
cmp [esi],byte '0' |
1138,6 → 1016,7 |
sub ebx,48 |
add eax,ebx |
jmp ip1 |
|
ip2: |
mov [edi],al |
xor eax,eax |
1144,16 → 1023,13 |
inc edi |
cmp edi,server_ip+3 |
jbe ip1 |
|
jmp pu_011 |
|
pu_010: |
|
if DEBUGGING_STATE = DEBUGGING_ENABLED |
mov esi, str1 ; print resolving |
call debug_print_string |
end if |
|
; Resolve Address |
call translateData ; Convert domain & DNS IP address |
call resolveDomain ; get ip address |
1164,11 → 1040,9 |
end if |
|
pu_011: |
|
; Done |
ret |
|
|
;*************************************************************************** |
; Function |
; translateData |
1181,14 → 1055,10 |
; |
;*************************************************************************** |
translateData: |
|
; first, get the IP address of the DNS server |
; Then, build up the request string. |
|
|
; Build the request string |
|
|
mov eax, 0x00010100 |
mov [dnsMsg], eax |
mov eax, 0x00000100 |
1195,7 → 1065,6 |
mov [dnsMsg+4], eax |
mov eax, 0x00000000 |
mov [dnsMsg+8], eax |
|
; domain name goes in at dnsMsg+12 |
mov esi, dnsMsg + 12 ; location of label length |
mov edi, dnsMsg + 13 ; label start |
1203,6 → 1072,7 |
cmp byte [edx], 0 |
jnz td000 |
mov edx, webAddr |
|
td000: |
mov ecx, 12 ; total string length so far |
|
1214,8 → 1084,10 |
mov al, [edx] |
cmp al, ' ' |
je td001 ; we have finished the string translation |
|
cmp al, 0 |
je td001 |
|
cmp al, '.' ; we have finished the label |
je td004 |
|
1232,10 → 1104,7 |
inc edx |
jmp td002 |
|
|
|
; write label len + label text |
|
td001: |
mov [edi], byte 0 |
inc ecx |
1242,15 → 1111,9 |
inc edi |
mov [edi], dword 0x01000100 |
add ecx, 4 |
|
mov [dnsMsgLen], ecx |
|
ret |
|
|
|
|
|
;*************************************************************************** |
; Function |
; resolveDomain |
1266,40 → 1129,25 |
getlp: |
inc ecx |
push ecx |
mov eax, 53 |
mov ebx, 9 |
mcall |
mcall 53,9 |
pop ecx |
cmp eax, 0 ; is this local port in use? |
jz getlp ; yes - so try next |
|
; Get DNS IP |
mov eax, 52 |
mov ebx, 13 |
mcall |
mcall 52,13 |
mov esi, eax |
; First, open socket |
mov eax, 53 |
mov ebx, 0 |
mov edx, 53 ; remote port - dns |
; mov esi, dword [dns_ip] |
mcall |
|
xor ebx,ebx ; 0 |
mcall 53 |
mov [socketNum], eax |
|
; write to socket ( request DNS lookup ) |
mov eax, 53 |
mov ebx, 4 |
mov ecx, [socketNum] |
mov edx, [dnsMsgLen] |
mov esi, dnsMsg |
mcall |
|
mcall 53,4,[socketNum],[dnsMsgLen],dnsMsg |
; Setup the DNS response buffer |
|
mov eax, dnsMsg |
mov [dnsMsgLen], eax |
|
; now, we wait for |
; UI redraw |
; UI close |
1306,58 → 1154,38 |
; or data from remote |
|
ctr001: |
mov eax,10 ; wait here for event |
mcall |
|
mcall 10 ; wait here for event |
cmp eax,1 ; redraw request ? |
je ctr003 |
|
cmp eax,2 ; key in buffer ? |
je ctr004 |
|
cmp eax,3 ; button in buffer ? |
je ctr005 |
|
|
; Any data in the UDP receive buffer? |
mov eax, 53 |
mov ebx, 2 |
mov ecx, [socketNum] |
mcall |
|
mcall 53,2,[socketNum] |
cmp eax, 0 |
je ctr001 |
|
; we have data - this will be the response |
ctr002: |
mov eax, 53 |
mov ebx, 3 |
mov ecx, [socketNum] |
mcall ; read byte - block (high byte) |
|
mcall 53,3,[socketNum] ; read byte - block (high byte) |
; Store the data in the response buffer |
mov eax, [dnsMsgLen] |
mov [eax], bl |
inc dword [dnsMsgLen] |
|
mov eax, 53 |
mov ebx, 2 |
mov ecx, [socketNum] |
mcall ; any more data? |
|
mcall 53,2,[socketNum] ; any more data? |
cmp eax, 0 |
jne ctr002 ; yes, so get it |
|
; close socket |
mov eax, 53 |
mov ebx, 1 |
mov ecx, [socketNum] |
mcall |
|
mcall 53,1,[socketNum] |
mov [socketNum], dword 0xFFFF |
|
; Now parse the message to get the host IP |
; Man, this is complicated. It's described in |
; RFC 1035 |
|
if DEBUGGING_STATE = DEBUGGING_ENABLED |
mov esi, str4 |
call debug_print_string |
1371,28 → 1199,22 |
|
; Clear the IP address text |
mov [server_ip], dword 0 |
|
mov esi, dnsMsg |
|
; Is this a response to my question? |
mov al, [esi+2] |
and al, 0x80 |
cmp al, 0x80 |
jne ctr002a |
|
; Were there any errors? |
mov al, [esi+3] |
and al, 0x0F |
cmp al, 0x00 |
jne ctr002a |
|
; Is there ( at least 1 ) answer? |
mov ax, [esi+6] |
cmp ax, 0x00 |
je ctr002a |
|
; Header validated. Scan through and get my answer |
|
; Header valdated. Scan through and get my answer |
if DEBUGGING_STATE = DEBUGGING_ENABLED |
pusha |
mov esi, str4 |
1399,9 → 1221,7 |
call debug_print_string |
popa |
end if |
|
add esi, 12 ; Skip to the question field |
|
; Skip through the question field |
call skipName |
add esi, 4 ; skip past the questions qtype, qclass |
1413,15 → 1233,12 |
mov ax, [esi] |
cmp ax, 0x0100 ; Is this the IP address answer? |
jne ctr002c |
|
; Yes! Point esi to the first byte of the IP address |
add esi, 10 |
|
mov eax, [esi] |
mov [server_ip], eax |
ret |
|
|
ctr002c: ; Skip through the answer, move to the next |
add esi, 8 |
movzx eax, byte [esi+1] |
1428,7 → 1245,6 |
mov ah, [esi] |
add esi, eax |
add esi, 2 |
|
; Have we reached the end of the msg? |
; This is an error condition, should not happen |
cmp esi, [dnsMsgLen] |
1443,32 → 1259,22 |
jmp ctr001 |
|
ctr004: ; key |
mov eax,2 ; just read it and ignore |
mcall |
mcall 2 ; just read it and ignore |
jmp ctr001 |
|
ctr005: ; button |
mov eax,17 ; get id |
mcall |
|
mcall 17 ; get id |
mov dl, ah |
|
; close socket |
mov eax, 53 |
mov ebx, 1 |
mov ecx, [socketNum] |
mcall |
|
mcall 53,1,[socketNum] |
cmp dl, 1 |
je exit |
|
mov [socketNum], dword 0xFFFF |
mov [server_ip], dword 0 |
|
ret |
|
|
|
;*************************************************************************** |
; Function |
; skipName |
1508,8 → 1314,6 |
; Load settings from configuration file network.ini |
; |
;*************************************************************************** |
include "proc32.inc" |
include "dll.inc" |
load_settings: |
stdcall dll.Load, @IMPORT |
test eax, eax |
1536,6 → 1340,7 |
rep movsb |
; base64-encode string <user>:<password> |
mov esi, proxyUser |
|
apah000: |
lodsb |
test al, al |
1542,10 → 1347,12 |
jz apah001 |
call encode_base64_byte |
jmp apah000 |
|
apah001: |
mov al, ':' |
call encode_base64_byte |
mov esi, proxyPassword |
|
apah002: |
lodsb |
test al, al |
1552,6 → 1359,7 |
jz apah003 |
call encode_base64_byte |
jmp apah002 |
|
apah003: |
call encode_base64_final |
ret |
1563,9 → 1371,11 |
cmp ecx, 3 |
je ebb001 |
ret |
|
ebb001: |
shl edx, 8 |
inc ecx |
|
ebb002: |
rol edx, 6 |
xor eax, eax |
1584,8 → 1394,10 |
jz ebf001 |
call encode_base64_byte |
mov byte [edi-2], '=' |
|
ebf001: |
mov byte [edi-1], '=' |
|
ebf000: |
ret |
|
1606,9 → 1418,7 |
debug_print_string: |
push esi |
mov cl, '"' |
mov eax,63 |
mov ebx, 1 |
mcall |
mcall 63,1 |
pop esi |
|
dps_000: |
1615,6 → 1425,7 |
mov cl, [esi] |
cmp cl, 0 |
je dps_exit |
|
cmp cl, ' ' |
je dps_exit |
jmp dps_001 |
1621,31 → 1432,21 |
|
dps_exit: |
mov cl, '"' |
mov eax,63 |
mov ebx, 1 |
mcall |
mcall 63,1 |
mov cl, 13 |
mov eax,63 |
mov ebx, 1 |
mcall |
mov cl, 10 |
mov eax,63 |
mov ebx, 1 |
mcall |
ret |
|
dps_001: |
mov eax,63 |
mov ebx, 1 |
push esi |
mcall |
|
mcall 63,1 |
pop esi |
inc esi |
jmp dps_000 |
end if |
|
|
;**************************************************************************** |
; Function |
; print_text |
1656,23 → 1457,16 |
;**************************************************************************** |
print_text: |
; Draw a bar to blank out previous text |
mov eax,13 |
mov ebx,30*65536+URLMAXLEN*6 ; 50 should really be [len], and 103 [xa] |
mov ebx,30*65536+URLMAXLEN*6 ; 50 should really be [len] and 103 [xa] |
mov ecx,[ya] |
shl ecx,16 |
mov cx,9 |
mov edx,0xFFFFFF |
mcall |
|
mcall 13,,,0xFFFFFF |
; write text |
mov eax,4 |
mov ebx,30*65536 |
add ebx,[ya] |
mov ecx,0x000000 |
mov edx,[addr] |
mov esi,URLMAXLEN |
mcall |
|
xor ecx,ecx |
mcall 4,,,[addr],URLMAXLEN |
ret |
|
; ********************************************* |
1680,111 → 1474,88 |
; ********************************************* |
|
draw_window: |
; function 12: tell os about windowdraw |
; 1 start of draw |
mcall 12,1 |
|
cmp byte [params], 0 |
jz .noret |
; cmp [params],byte 0 |
; jz .noret |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
mcall |
|
; ýòî íåñêîëüêî çàãàäî÷íî, íî åñëè íå ðèñîâàòü îêîøêî ñîâñåì, ïðîãà íå ïàøåò. |
; DRAW WINDOW |
; eax function 0 : define and draw window |
; xor eax,eax |
; ebx [x start] *65536 + [x size] |
; xor ebx,ebx |
; ecx [y start] *65536 + [y size] |
; xor ecx,ecx |
; edx color of work area RRGGBB,8->color gl |
; esi color of bar and flags |
; xor esi,esi |
; mcall ,,,0x14ffffff,,title |
|
mov eax,0 ; function 0 : define and draw window |
mov ebx,0 ; [x start] *65536 + [x size] |
mov ecx,0 ; [y start] *65536 + [y size] |
mov edx,0x14ffffff ; color of work area RRGGBB,8->color gl |
mov edi,title ; WINDOW LABEL |
mcall |
; function 12: tell os about windowdraw |
; 2, end of draw |
; mcall 12,2 |
; ret |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
mcall |
|
ret |
|
.noret: |
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
mcall |
|
;.noret: |
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,50*65536+600 ; [x start] *65536 + [x size] |
mov ecx,350*65536+200 ; [y start] *65536 + [y size] |
mov edx,0x14ffffff ; color of work area RRGGBB,8->color gl |
mov edi,title ; WINDOW LABEL |
mcall |
; eax function 0 : define and draw window |
xor eax,eax |
; ebx [x start] *65536 + [x size] |
; ecx [y start] *65536 + [y size] |
; edx color of work area RRGGBB,8->color gl |
; esi color of bar and flags |
xor esi,esi |
; edi WINDOW LABEL |
mcall ,<50,600>,<350,200>,0x14ffffff,,title |
; eax function 4: write text to window |
; ebx [x start] *65536 + [y start] |
; ecx color of text RRGGBB |
; edx pointer to text beginning |
; esi max lenght |
xor ecx,ecx |
mcall 4,<30,38>,,document_user,URLMAXLEN |
|
; xor edx,edx |
; mcall 38,<5,545>,<60,60> |
|
mov esi, URLMAXLEN ; URL |
mov eax,4 ; function 4 : write text to window |
mov ebx,30*65536+38 ; [x start] *65536 + [y start] |
mov ecx,0x000000 ; color of text RRGGBB |
mov edx,document_user ; pointer to text beginning |
mcall |
|
; mov eax,38 |
; mov ebx,5*65536+545 |
; mov ecx,60*65536+60 |
; mov edx,0x000000 |
; mcall |
|
;mov eax,38 |
;mov ebx,5*65536+545 |
; mov ecx,[winys] |
; shl ecx,16 |
; add ecx,[winys] |
; sub ecx,26*65536+26 |
;mov edx,0x000000 |
;mcall |
; mcall 38,<5,545> |
|
; RELOAD |
mov eax,8 ; function 8 : define and draw button |
mov ebx,388*65536+50 ; [x start] *65536 + [x size] |
mov ecx,34*65536+14 ; [y start] *65536 + [y size] |
mov edx,22 ; button id |
mov esi,0x5588dd ; button color RRGGBB |
mcall |
|
; eax function 8 : define and draw button |
; ebx [x start] *65536 + [x size] |
; ecx [y start] *65536 + [y size] |
; edx button id |
; esi button color RRGGBB |
mcall 8,<388,50>,<34,14>,22,0x5588dd |
; URL |
;mov eax,8 ; function 8 : define and draw button |
mov ebx,10*65536+12 ; [x start] *65536 + [x size] |
mov ecx,34*65536+12 ; [y start] *65536 + [y size] |
mov edx,10 ; button id |
;mov esi,0x5588dd ; button color RRGGBB |
mcall |
|
mcall ,<10,12>,<34,12>,10 |
; STOP |
;mov eax,8 ; function 8 : define and draw button |
mov ebx,443*65536+50 ; [x start] *65536 + [x size] |
mov ecx,34*65536+14 ; [y start] *65536 + [y size] |
mov edx,24 ; button id |
;mov esi,0x5588dd ; button color RRGGBB |
mcall |
|
mcall ,<443,50>,<34,14>,24 |
; SAVE |
mov ebx,(443+55)*65536+50 ; [x start] *65536 + [x size] |
mov ecx,34*65536+14 ; [y start] *65536 + [y size] |
mov edx,26 ; button id |
;mov esi,0x5588dd ; button color RRGGBB |
mcall |
|
mcall ,<498,50>,,26 |
; BUTTON TEXT |
mov eax,4 ; function 4 : write text to window |
mov ebx,390*65536+38 ; [x start] *65536 + [y start] |
mov ecx,0xffffff ; color of text RRGGBB |
mov edx,button_text ; pointer to text beginning |
mov esi,30 ; text length |
mcall |
|
; eax function 4 : write text to window |
; ebx [x start] *65536 + [y start] |
; ecx color of text RRGGBB |
; edx pointer to text beginning |
; esi text length |
mcall 4,<390,38>,0xffffff,button_text,30 |
call display_page |
|
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
mcall |
|
; function 12: tell os about windowdraw |
; 2, end of draw |
mcall 12,2 |
ret |
|
;----------------------------------------------------------------------------- |
; Data area |
;----------------------------------------------------------------------------- |
align 4 |
@IMPORT: |
|
1794,7 → 1565,7 |
ini.get_str, 'ini_get_str', \ |
ini.get_int, 'ini_get_int' |
|
|
;--------------------------------------------------------------------- |
fileinfo dd 2, 0, 0 |
final_size dd 0 |
final_buffer dd 0 |
1809,8 → 1580,7 |
|
deba dd 0 |
db 0 |
|
|
;--------------------------------------------------------------------- |
if DEBUGGING_STATE = DEBUGGING_ENABLED |
str1: db "Resolving...",0 |
str3: db "Resolved",0 |
1817,9 → 1587,7 |
str2: db "GotIP",0 |
str4: db "GotResponse",0 |
end if |
|
params db 1024 dup(0) |
|
;--------------------------------------------------------------------- |
button_text db ' RELOAD STOP SAVE ' |
dpx dd 25 ; x - start of html page in pixels in window |
dpy dd 65 ; for y |
1844,13 → 1612,17 |
|
server_ip: db 207,44,212,20 |
;dns_ip: db 194,145,128,1 |
webAddr: times URLMAXLEN db ' ' |
db 0 |
document_user: db 'Click on the button to the left to enter a URL',0 |
times URLMAXLEN+document_user-$ db 0 |
document: db '/' |
times URLMAXLEN-1 db ' ' |
;--------------------------------------------------------------------- |
;webAddr: |
;times URLMAXLEN db ' ' |
;db 0 |
|
;document_user: db 'Click on the button to the left to enter a URL',0 |
;times URLMAXLEN+document_user-$ db 0 |
|
;document: db '/' |
;times URLMAXLEN-1 db ' ' |
;--------------------------------------------------------------------- |
s_contentlength db 'Content-Length:' |
len_contentlength = 15 |
|
1882,11 → 1654,7 |
key_user db 'user',0 |
key_password db 'password',0 |
|
request db 256 dup(0) |
|
proxyAddr db 256 dup(0) |
proxyUser db 256 dup(0) |
proxyPassword db 256 dup(0) |
proxyPort dd 80 |
|
shared_name dd 0 |
1902,9 → 1670,54 |
nextupdate: dd 0 |
winys: dd 400 |
|
primary_buf rb primary_buffer_size |
|
dnsMsgLen: dd 0 |
socketNum: dd 0xFFFF |
;--------------------------------------------------------------------- |
document_user: db 'Click on the button to the left to enter a URL',0 |
;--------------------------------------------------------------------- |
IM_END: |
rb URLMAXLEN-(IM_END - document_user) |
;--------------------------------------------------------------------- |
align 4 |
document: |
rb URLMAXLEN |
;--------------------------------------------------------------------- |
align 4 |
webAddr: |
rb URLMAXLEN+1 |
;--------------------------------------------------------------------- |
align 4 |
primary_buf: |
rb primary_buffer_size |
;--------------------------------------------------------------------- |
align 4 |
params: ; db 1024 dup(0) |
rb 1024 |
;--------------------------------------------------------------------- |
align 4 |
request: ; db 256 dup(0) |
rb 256 |
;--------------------------------------------------------------------- |
align 4 |
proxyAddr: ; db 256 dup(0) |
rb 256 |
;--------------------------------------------------------------------- |
align 4 |
proxyUser: ; db 256 dup(0) |
rb 256 |
;--------------------------------------------------------------------- |
align 4 |
proxyPassword: ; db 256 dup(0) |
rb 256 |
;--------------------------------------------------------------------- |
align 4 |
dnsMsg: |
rb 4096 |
; rb 0x100000 |
;--------------------------------------------------------------------- |
align 4 |
rb 4096 |
stacktop: |
;--------------------------------------------------------------------- |
I_END: |
;--------------------------------------------------------------------- |