Libraries: fixed a bug in lib_init functions

added verification of the second initialization attempt
This commit is contained in:
Mikhail Frolov 2025-07-25 19:55:32 +05:00
parent e423bfb2d1
commit 4a5c577952
4 changed files with 409 additions and 395 deletions

View File

@ -100,6 +100,10 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
mov [mem.alloc], eax mov [mem.alloc], eax
mov [mem.free], ebx mov [mem.free], ebx
mov [mem.realloc], ecx mov [mem.realloc], ecx
cmp [dll.load], edx
je .ok
mov [dll.load], edx mov [dll.load], edx
invoke dll.load, @IMPORT invoke dll.load, @IMPORT
@ -115,6 +119,7 @@ lib_init: ;//////////////////////////////////////////////////////////////////;;
invoke ini.get_str, inifile, sec_proxy, key_password, proxyPassword, 256, proxyPassword invoke ini.get_str, inifile, sec_proxy, key_password, proxyPassword, 256, proxyPassword
popa popa
.ok:
DEBUGF 1, "HTTP library: init OK\n" DEBUGF 1, "HTTP library: init OK\n"
xor eax, eax xor eax, eax
ret ret

View File

@ -78,6 +78,10 @@ proc lib_init ;///////////////////////////////////////////////////////////////;;
mov [mem.alloc], eax mov [mem.alloc], eax
mov [mem.free], ebx mov [mem.free], ebx
mov [mem.realloc], ecx mov [mem.realloc], ecx
cmp [dll.load], edx
je .ok
mov [dll.load], edx mov [dll.load], edx
or edx, edx or edx, edx

View File

@ -34,21 +34,25 @@ proc libini._.init ;////////////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = 1 (fail) / 0 (ok) (library initialization result) ;; ;< eax = 1 (fail) / 0 (ok) (library initialization result) ;;
;;================================================================================================;; ;;================================================================================================;;
mov [mem.alloc], eax mov [mem.alloc], eax
mov [mem.free], ebx mov [mem.free], ebx
mov [mem.realloc], ecx mov [mem.realloc], ecx
mov [dll.load], edx
invoke dll.load, @IMPORT cmp [dll.load], edx
or eax, eax je .ok
jz .ok
xor eax, eax mov [dll.load], edx
inc eax
ret
.ok: xor eax,eax invoke dll.load, @IMPORT
ret or eax, eax
jz .ok
xor eax, eax
inc eax
ret
.ok: xor eax,eax
ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -60,16 +64,16 @@ proc libini._.unget_char _f ;///////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push eax ecx push eax ecx
mov ecx, [_f] mov ecx, [_f]
inc [ecx + IniFile.cnt] inc [ecx + IniFile.cnt]
dec esi dec esi
mov eax, [ecx + IniFile.bsize] mov eax, [ecx + IniFile.bsize]
cmp [ecx + IniFile.cnt], eax cmp [ecx + IniFile.cnt], eax
jle @f jle @f
stdcall libini._.unload_block, [_f] stdcall libini._.unload_block, [_f]
@@: pop ecx eax @@: pop ecx eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -81,13 +85,13 @@ proc libini._.get_char _f ;/////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
mov ecx, [_f] mov ecx, [_f]
dec [ecx + IniFile.cnt] dec [ecx + IniFile.cnt]
jns @f jns @f
stdcall libini._.preload_block, [_f] stdcall libini._.preload_block, [_f]
dec [ecx + IniFile.cnt] dec [ecx + IniFile.cnt]
@@: lodsb @@: lodsb
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -99,22 +103,22 @@ proc libini._.skip_nonblanks _f ;///////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
mov ecx, [_f] mov ecx, [_f]
@@: stdcall libini._.get_char, [_f] @@: stdcall libini._.get_char, [_f]
cmp al, 32 cmp al, 32
je @b je @b
cmp al, 13 cmp al, 13
je @b je @b
cmp al, 10 cmp al, 10
je @b je @b
cmp al, 9 cmp al, 9
je @b je @b
cmp al, ini.COMMENT_CHAR cmp al, ini.COMMENT_CHAR
jne @f jne @f
stdcall libini._.skip_line, [_f] stdcall libini._.skip_line, [_f]
jmp @b jmp @b
@@: stdcall libini._.unget_char, [_f] @@: stdcall libini._.unget_char, [_f]
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -126,14 +130,14 @@ proc libini._.skip_spaces _f ;//////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
mov ecx, [_f] mov ecx, [_f]
@@: stdcall libini._.get_char, [_f] @@: stdcall libini._.get_char, [_f]
cmp al, 32 cmp al, 32
je @b je @b
cmp al, 9 cmp al, 9
je @b je @b
@@: stdcall libini._.unget_char, [_f] @@: stdcall libini._.unget_char, [_f]
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -145,16 +149,16 @@ proc libini._.skip_line _f ;////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
mov ecx, [_f] mov ecx, [_f]
@@: stdcall libini._.get_char, [_f] @@: stdcall libini._.get_char, [_f]
or al, al or al, al
jz @f jz @f
cmp al, 13 cmp al, 13
je @f je @f
cmp al, 10 cmp al, 10
jne @b jne @b
@@: stdcall libini._.unget_char, [_f] @@: stdcall libini._.unget_char, [_f]
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -166,16 +170,16 @@ proc libini._.unload_block _f ;/////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push eax ebx ecx push eax ebx ecx
mov ebx, [_f] mov ebx, [_f]
mov eax, [ebx + IniFile.pos] mov eax, [ebx + IniFile.pos]
add eax, -ini.BLOCK_SIZE add eax, -ini.BLOCK_SIZE
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
stdcall libini._.preload_block, ebx stdcall libini._.preload_block, ebx
add esi, eax add esi, eax
mov [ebx + IniFile.cnt], 0 mov [ebx + IniFile.cnt], 0
pop ecx ebx eax pop ecx ebx eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -187,25 +191,25 @@ proc libini._.preload_block _f ;////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push eax ebx ecx push eax ebx ecx
mov ebx, [_f] mov ebx, [_f]
@@: mov esi, [ebx + IniFile.buf] @@: mov esi, [ebx + IniFile.buf]
push edi push edi
mov edi, esi mov edi, esi
mov ecx, ini.BLOCK_SIZE / 4 mov ecx, ini.BLOCK_SIZE / 4
xor eax, eax xor eax, eax
rep stosd rep stosd
pop edi pop edi
invoke file.tell, [ebx + IniFile.fh] invoke file.tell, [ebx + IniFile.fh]
mov [ebx + IniFile.pos], eax mov [ebx + IniFile.pos], eax
invoke file.read, [ebx + IniFile.fh], esi, ini.BLOCK_SIZE invoke file.read, [ebx + IniFile.fh], esi, ini.BLOCK_SIZE
mov esi,[ebx + IniFile.buf] mov esi,[ebx + IniFile.buf]
cmp eax,ini.BLOCK_SIZE cmp eax,ini.BLOCK_SIZE
jl @f jl @f
@@: mov [ebx + IniFile.cnt], eax @@: mov [ebx + IniFile.cnt], eax
mov [ebx + IniFile.bsize], eax mov [ebx + IniFile.bsize], eax
pop ecx ebx eax pop ecx ebx eax
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -217,18 +221,18 @@ proc libini._.reload_block _f ;/////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push eax ebx ecx push eax ebx ecx
mov ebx, [_f] mov ebx, [_f]
push [ebx + IniFile.bsize] push [ebx + IniFile.bsize]
push esi [ebx + IniFile.cnt] push esi [ebx + IniFile.cnt]
invoke file.seek, [ebx + IniFile.fh], [ebx + IniFile.pos], SEEK_SET invoke file.seek, [ebx + IniFile.fh], [ebx + IniFile.pos], SEEK_SET
stdcall libini._.preload_block, ebx stdcall libini._.preload_block, ebx
pop [ebx + IniFile.cnt] esi pop [ebx + IniFile.cnt] esi
pop eax pop eax
sub eax,[ebx + IniFile.bsize] sub eax,[ebx + IniFile.bsize]
sub [ebx + IniFile.cnt], eax sub [ebx + IniFile.cnt], eax
pop ecx ebx eax pop ecx ebx eax
ret ret
endp endp
; f_info - contains current file block number ; f_info - contains current file block number
@ -249,91 +253,91 @@ locals
buf dd ? buf dd ?
endl endl
xor eax, eax xor eax, eax
cmp [_delta], 0 cmp [_delta], 0
je .skip je .skip
push ebx ecx push ebx ecx
invoke mem.alloc, ini.BLOCK_SIZE invoke mem.alloc, ini.BLOCK_SIZE
or eax, eax or eax, eax
jz .fail jz .fail
mov [buf], eax mov [buf], eax
cmp [_delta], 0 cmp [_delta], 0
jl .down jl .down
mov ebx, [_f] mov ebx, [_f]
mov ecx, [ebx + IniFile.cnt] mov ecx, [ebx + IniFile.cnt]
mov ebx, [ebx + IniFile.fh] mov ebx, [ebx + IniFile.fh]
invoke file.tell, ebx invoke file.tell, ebx
sub eax, ecx sub eax, ecx
invoke file.seek, ebx, eax, SEEK_SET invoke file.seek, ebx, eax, SEEK_SET
@@: invoke file.seek, ebx, [_delta], SEEK_CUR @@: invoke file.seek, ebx, [_delta], SEEK_CUR
invoke file.eof?, ebx invoke file.eof?, ebx
or eax, eax or eax, eax
jnz .done jnz .done
invoke file.read, ebx, [buf], ini.BLOCK_SIZE invoke file.read, ebx, [buf], ini.BLOCK_SIZE
mov ecx, eax mov ecx, eax
mov eax, [_delta] mov eax, [_delta]
neg eax neg eax
sub eax, ecx sub eax, ecx
invoke file.seek, ebx, eax, SEEK_CUR invoke file.seek, ebx, eax, SEEK_CUR
push ecx push ecx
invoke file.write, ebx, [buf], ecx invoke file.write, ebx, [buf], ecx
pop ecx pop ecx
cmp eax, ecx cmp eax, ecx
jz @b jz @b
.fail: .fail:
or eax, -1 or eax, -1
pop ecx ebx pop ecx ebx
ret ret
.done: .done:
mov eax, [_delta] mov eax, [_delta]
neg eax neg eax
invoke file.seek, ebx, eax, SEEK_CUR invoke file.seek, ebx, eax, SEEK_CUR
invoke file.seteof, ebx invoke file.seteof, ebx
stdcall libini._.reload_block, [_f] stdcall libini._.reload_block, [_f]
invoke mem.free, [buf] invoke mem.free, [buf]
pop ecx ebx pop ecx ebx
.skip: .skip:
ret ret
.down: .down:
neg [_delta] neg [_delta]
mov ebx, [_f] mov ebx, [_f]
mov ecx, [ebx + IniFile.cnt] mov ecx, [ebx + IniFile.cnt]
mov ebx, [ebx + IniFile.fh] mov ebx, [ebx + IniFile.fh]
invoke file.tell, ebx invoke file.tell, ebx
sub eax, ecx sub eax, ecx
lea edx, [eax - 1] lea edx, [eax - 1]
push edx push edx
@@: invoke file.seek, ebx, edx, SEEK_SET @@: invoke file.seek, ebx, edx, SEEK_SET
invoke file.eof?, ebx invoke file.eof?, ebx
or eax, eax or eax, eax
jnz @f jnz @f
add edx, ini.BLOCK_SIZE add edx, ini.BLOCK_SIZE
jmp @b jmp @b
@@: cmp edx, [esp] @@: cmp edx, [esp]
je .skip.2 je .skip.2
add edx, -ini.BLOCK_SIZE add edx, -ini.BLOCK_SIZE
cmp edx, [esp] cmp edx, [esp]
jl @f jl @f
invoke file.seek, ebx, edx, SEEK_SET invoke file.seek, ebx, edx, SEEK_SET
invoke file.read, ebx, [buf], ini.BLOCK_SIZE invoke file.read, ebx, [buf], ini.BLOCK_SIZE
mov ecx, eax mov ecx, eax
mov eax, [_delta] mov eax, [_delta]
sub eax, ecx sub eax, ecx
invoke file.seek, ebx, eax, SEEK_CUR invoke file.seek, ebx, eax, SEEK_CUR
invoke file.write, ebx, [buf], ecx invoke file.write, ebx, [buf], ecx
jmp @b jmp @b
@@: @@:
.skip.2: .skip.2:
add esp, 4 add esp, 4
stdcall libini._.reload_block, [_f] stdcall libini._.reload_block, [_f]
invoke mem.free, [buf] invoke mem.free, [buf]
pop ecx ebx pop ecx ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -345,25 +349,25 @@ proc libini._.get_value_length _f ;/////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx ecx edx eax push ebx ecx edx eax
mov ebx, [_f] mov ebx, [_f]
invoke file.tell, [ebx + IniFile.fh] invoke file.tell, [ebx + IniFile.fh]
push esi [ebx + IniFile.cnt] [ebx + IniFile.pos] push esi [ebx + IniFile.cnt] [ebx + IniFile.pos]
sub eax, [ebx + IniFile.cnt] sub eax, [ebx + IniFile.cnt]
mov edx, eax mov edx, eax
stdcall libini._.skip_line, [_f] stdcall libini._.skip_line, [_f]
invoke file.tell, [ebx + IniFile.fh] invoke file.tell, [ebx + IniFile.fh]
sub eax, [ebx + IniFile.cnt] sub eax, [ebx + IniFile.cnt]
sub eax, edx sub eax, edx
mov [esp + 4 * 3], eax mov [esp + 4 * 3], eax
pop eax pop eax
invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET invoke file.seek, [ebx + IniFile.fh], eax, SEEK_SET
stdcall libini._.preload_block, [_f] stdcall libini._.preload_block, [_f]
pop [ebx + IniFile.cnt] esi pop [ebx + IniFile.cnt] esi
pop eax edx ecx ebx pop eax edx ecx ebx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -376,10 +380,10 @@ proc libini._.string_copy ;/////////////////////////////////////////////////////
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
@@: lodsb @@: lodsb
or al, al or al, al
jz @f jz @f
stosb stosb
jmp @b jmp @b
@@: ret @@: ret
endp endp
@ -392,26 +396,26 @@ proc libini._.find_next_section _f ;////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx edi push ebx edi
@@: stdcall libini._.skip_nonblanks, [_f] @@: stdcall libini._.skip_nonblanks, [_f]
cmp al, '[' cmp al, '['
je @f je @f
or al, al or al, al
jz .exit_error jz .exit_error
stdcall libini._.skip_line, [_f] stdcall libini._.skip_line, [_f]
or al, al or al, al
jz .exit_error jz .exit_error
jmp @b jmp @b
@@: @@:
pop edi ebx pop edi ebx
xor eax, eax xor eax, eax
ret ret
.exit_error: .exit_error:
pop edi ebx pop edi ebx
or eax, -1 or eax, -1
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -425,50 +429,50 @@ proc libini._.find_section _f, _sec_name ;//////////////////////////////////////
;< eax = -1 (fail) / 0 (ok) ;; ;< eax = -1 (fail) / 0 (ok) ;;
;< [_f.pos] = new cursor position (right after ']' char if eax = 0, at the end of file otherwise) ;; ;< [_f.pos] = new cursor position (right after ']' char if eax = 0, at the end of file otherwise) ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx edi push ebx edi
mov ecx, [_f] mov ecx, [_f]
invoke file.seek, [ecx + IniFile.fh], 0, SEEK_SET invoke file.seek, [ecx + IniFile.fh], 0, SEEK_SET
stdcall libini._.preload_block, [_f] stdcall libini._.preload_block, [_f]
.next_section: .next_section:
stdcall libini._.find_next_section, [_f] stdcall libini._.find_next_section, [_f]
or eax, eax or eax, eax
jnz .exit_error jnz .exit_error
stdcall libini._.get_char, [_f] stdcall libini._.get_char, [_f]
stdcall libini._.skip_spaces, [_f] stdcall libini._.skip_spaces, [_f]
mov edi, [_sec_name] mov edi, [_sec_name]
@@: stdcall libini._.get_char, [_f] @@: stdcall libini._.get_char, [_f]
cmp al, ']' cmp al, ']'
je @f je @f
or al, al or al, al
jz .exit_error jz .exit_error
cmp al, 13 cmp al, 13
je .next_section je .next_section
cmp al, 10 cmp al, 10
je .next_section je .next_section
scasb scasb
je @b je @b
cmp byte[edi - 1], 0 cmp byte[edi - 1], 0
jne .next_section jne .next_section
dec edi dec edi
stdcall libini._.unget_char, [_f] stdcall libini._.unget_char, [_f]
stdcall libini._.skip_spaces, [_f] stdcall libini._.skip_spaces, [_f]
stdcall libini._.get_char, [_f] stdcall libini._.get_char, [_f]
cmp al, ']' cmp al, ']'
jne .next_section jne .next_section
@@: @@:
cmp byte[edi], 0 cmp byte[edi], 0
jne .next_section jne .next_section
pop edi ebx pop edi ebx
xor eax, eax xor eax, eax
ret ret
.exit_error: .exit_error:
pop edi ebx pop edi ebx
or eax, -1 or eax, -1
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -483,44 +487,44 @@ proc libini._.find_key _f, _key_name ;//////////////////////////////////////////
;< [_f.pos] = new cursor position (right after '=' char if eax = 0, at the end of file or right ;; ;< [_f.pos] = new cursor position (right after '=' char if eax = 0, at the end of file or right ;;
;< before '[' char otherwise) ;; ;< before '[' char otherwise) ;;
;;================================================================================================;; ;;================================================================================================;;
push ebx edi push ebx edi
.next_value: .next_value:
mov edi, [_key_name] mov edi, [_key_name]
stdcall libini._.skip_line, [_f] stdcall libini._.skip_line, [_f]
stdcall libini._.skip_nonblanks, [_f] stdcall libini._.skip_nonblanks, [_f]
or al, al or al, al
jz .exit_error jz .exit_error
cmp al, '[' cmp al, '['
je .exit_error je .exit_error
@@: stdcall libini._.get_char, [_f] @@: stdcall libini._.get_char, [_f]
or al, al or al, al
jz .exit_error jz .exit_error
cmp al, '=' cmp al, '='
je @f je @f
scasb scasb
je @b je @b
cmp byte[edi - 1], 0 cmp byte[edi - 1], 0
jne .next_value jne .next_value
dec edi dec edi
stdcall libini._.unget_char, [_f] stdcall libini._.unget_char, [_f]
stdcall libini._.skip_spaces, [_f] stdcall libini._.skip_spaces, [_f]
stdcall libini._.get_char, [_f] stdcall libini._.get_char, [_f]
cmp al, '=' cmp al, '='
je @f je @f
jmp .next_value jmp .next_value
@@: @@:
cmp byte[edi], 0 cmp byte[edi], 0
jne .next_value jne .next_value
pop edi ebx pop edi ebx
xor eax, eax xor eax, eax
ret ret
.exit_error: .exit_error:
pop edi ebx pop edi ebx
or eax, -1 or eax, -1
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -532,31 +536,31 @@ proc libini._.low.read_value _f_addr, _buffer, _buf_len ;///////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push edi eax push edi eax
mov edi, [_buffer] mov edi, [_buffer]
stdcall libini._.skip_spaces, [_f_addr] stdcall libini._.skip_spaces, [_f_addr]
@@: dec [_buf_len] @@: dec [_buf_len]
jz @f jz @f
stdcall libini._.get_char, [_f_addr] stdcall libini._.get_char, [_f_addr]
cmp al, 13 cmp al, 13
je @f je @f
cmp al, 10 cmp al, 10
je @f je @f
stosb stosb
or al, al or al, al
jnz @b jnz @b
@@: stdcall libini._.unget_char, [_f_addr] @@: stdcall libini._.unget_char, [_f_addr]
mov byte[edi], 0 mov byte[edi], 0
dec edi dec edi
@@: cmp edi, [_buffer] @@: cmp edi, [_buffer]
jb @f jb @f
cmp byte[edi], 32 cmp byte[edi], 32
ja @f ja @f
mov byte[edi], 0 mov byte[edi], 0
dec edi dec edi
jmp @b jmp @b
@@: pop eax edi @@: pop eax edi
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -568,25 +572,25 @@ proc libini._.str_to_int ;//////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< eax = binary number representation (no overflow checks made) ;; ;< eax = binary number representation (no overflow checks made) ;;
;;================================================================================================;; ;;================================================================================================;;
push edx push edx
xor eax, eax xor eax, eax
xor edx, edx xor edx, edx
@@: lodsb @@: lodsb
cmp al, '0' cmp al, '0'
jb @f jb @f
cmp al, '9' cmp al, '9'
ja @f ja @f
add eax, -'0' add eax, -'0'
imul edx, 10 imul edx, 10
add edx, eax add edx, eax
jmp @b jmp @b
@@: dec esi @@: dec esi
mov eax, edx mov eax, edx
pop edx pop edx
ret ret
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -600,29 +604,29 @@ proc libini._.int_to_str ;//////////////////////////////////////////////////////
;;------------------------------------------------------------------------------------------------;; ;;------------------------------------------------------------------------------------------------;;
;< --- TBD --- ;; ;< --- TBD --- ;;
;;================================================================================================;; ;;================================================================================================;;
push ecx edx push ecx edx
or eax, eax or eax, eax
jns @f jns @f
mov byte[edi], '-' mov byte[edi], '-'
inc edi inc edi
@@: call .recurse @@: call .recurse
pop edx ecx pop edx ecx
ret ret
.recurse: .recurse:
cmp eax,ecx cmp eax,ecx
jb @f jb @f
xor edx,edx xor edx,edx
div ecx div ecx
push edx push edx
call .recurse call .recurse
pop eax pop eax
@@: cmp al,10 @@: cmp al,10
sbb al,0x69 sbb al,0x69
das das
stosb stosb
retn retn
endp endp
;;================================================================================================;; ;;================================================================================================;;
@ -635,50 +639,50 @@ proc libini._.ascii_to_scan ;_ascii_code ;//////////////////////////////////////
;< eax = 0 (error) / scancode (success) ;; ;< eax = 0 (error) / scancode (success) ;;
;;================================================================================================;; ;;================================================================================================;;
; /sys/keymap.key ; /sys/keymap.key
sub esp, 256 sub esp, 256
mov eax, esp mov eax, esp
push ebx push ebx
push 'key' push 'key'
push 'map.' push 'map.'
push '/key' push '/key'
push '/sys' push '/sys'
push eax ; buffer in the stack push eax ; buffer in the stack
push 0x100 ; read 0x100 bytes push 0x100 ; read 0x100 bytes
push 0 push 0
push 0 ; from position zero push 0 ; from position zero
push 0 ; subfunction: read push 0 ; subfunction: read
mov ebx, esp mov ebx, esp
push 70 push 70
pop eax pop eax
mcall mcall
add esp, 36 add esp, 36
pop ebx pop ebx
test eax, eax test eax, eax
jnz .die jnz .die
mov al, [esp+256+4] ; get ASCII code mov al, [esp+256+4] ; get ASCII code
push edi push edi
; first keytable - no modifiers pressed ; first keytable - no modifiers pressed
; check scancodes from 1 to 36h (inclusive) ; check scancodes from 1 to 36h (inclusive)
lea edi, [esp+4+1] lea edi, [esp+4+1]
mov edx, edi mov edx, edi
mov ecx, 36h mov ecx, 36h
repnz scasb repnz scasb
jz .found jz .found
; second keytable - Shift pressed ; second keytable - Shift pressed
lea edi, [esp+4+128+1] lea edi, [esp+4+128+1]
mov edx, edi mov edx, edi
mov ecx, 36h mov ecx, 36h
repnz scasb repnz scasb
jz .found jz .found
pop edi pop edi
.die: .die:
xor eax, eax xor eax, eax
jmp .ret jmp .ret
.found: .found:
mov eax, edi mov eax, edi
sub eax, edx sub eax, edx
pop edi pop edi
.ret: .ret:
add esp, 256 add esp, 256
ret 4 ret 4
endp endp

View File

@ -33,38 +33,39 @@ use_ColorDialog
;-------------------------------------------------- ;--------------------------------------------------
align 16 align 16
lib_init: lib_init:
ret xor eax, eax
ret
;-------------------------------------------------- ;--------------------------------------------------
align 16 align 16
EXPORTS: EXPORTS:
dd sz_init, lib_init dd sz_init, lib_init
dd sz_version, 0x00000001 dd sz_version, 0x00000001
dd sz_OpenDialog_init, OpenDialog.init dd sz_OpenDialog_init, OpenDialog.init
dd sz_OpenDialog_start, OpenDialog.start dd sz_OpenDialog_start, OpenDialog.start
dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name
dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext
dd szVersion_OpenDialog, 0x00010001 dd szVersion_OpenDialog, 0x00010001
dd sz_ColorDialog_init, ColorDialog.init dd sz_ColorDialog_init, ColorDialog.init
dd sz_ColorDialog_start, ColorDialog.start dd sz_ColorDialog_start, ColorDialog.start
dd szVersion_ColorDialog, 0x00010001 dd szVersion_ColorDialog, 0x00010001
dd 0,0 dd 0,0
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
sz_init db 'lib_init',0 sz_init db 'lib_init',0
sz_version db 'version',0 sz_version db 'version',0
sz_OpenDialog_init db 'OpenDialog_init',0 sz_OpenDialog_init db 'OpenDialog_init',0
sz_OpenDialog_start db 'OpenDialog_start',0 sz_OpenDialog_start db 'OpenDialog_start',0
sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0 sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0
sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0 sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0
szVersion_OpenDialog db 'Version_OpenDialog',0 szVersion_OpenDialog db 'Version_OpenDialog',0
sz_ColorDialog_init db 'ColorDialog_init',0 sz_ColorDialog_init db 'ColorDialog_init',0
sz_ColorDialog_start db 'ColorDialog_start',0 sz_ColorDialog_start db 'ColorDialog_start',0
szVersion_ColorDialog db 'Version_ColorDialog',0 szVersion_ColorDialog db 'Version_ColorDialog',0
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------