Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1645 → Rev 1646

/programs/network/downloader/trunk/lang.inc
File deleted
\ No newline at end of file
/programs/network/downloader/trunk/build.bat
0,0 → 1,6
@erase lang.inc
@echo lang fix ru >lang.inc
@fasm downloader.asm downloader
@kpack downloader
@erase lang.inc
@pause
/programs/network/downloader/trunk/build.sh
0,0 → 1,13
#!/bin/bash
# This script does for linux the same as build.bat for DOS,
# it compiles the KoOS kernel, hopefully ;-)
 
echo "lang fix ru"
echo "lang fix ru" > lang.inc
fasm -m 16384 downloader.asm downloader
rm -f lang.inc
exit 0
 
 
 
 
/programs/network/downloader/trunk/downloader.asm
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:
;---------------------------------------------------------------------