Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 473 → Rev 474

/programs/fs/kfar/trunk/tools.inc
1,7 → 1,43
xmalloc:
; in: eax=size
pgalloc:
; in: ecx=size
; out: eax=pointer or NULL
call mf_alloc
push ebx
push 68
pop eax
push 12
pop ebx
int 0x40
pop ebx
ret
 
pgfree:
; in: ecx=pointer
; destroys eax
push ebx
push 68
pop eax
push 13
pop ebx
int 0x40
pop ebx
ret
 
pgrealloc:
; in: ecx=size, edx=pointer
; out: eax=pointer
push ebx
push 68
pop eax
push 20
pop ebx
int 0x40
pop ebx
ret
 
xpgalloc:
; in: ecx=size
; out: eax=pointer or NULL
call pgalloc
.common:
test eax, eax
jnz @f
10,11 → 46,11
@@:
ret
 
xrealloc:
; in: eax=pointer, ebx=new size
xpgrealloc:
; in: edx=pointer, ecx=new size
; out: eax=pointer or NULL
call mf_realloc
jmp xmalloc.common
call pgrealloc
jmp xpgalloc.common
 
get_error_msg:
; in: eax=error code
67,3 → 103,171
pop ecx edx
stosb
jmp .ret
 
libini_alloc:
push ecx
mov ecx, [esp+8]
call xpgalloc
pop ecx
ret 4
libini_free:
push ecx
mov ecx, [esp+8]
call pgfree
pop ecx
ret 4
libini_realloc:
push ecx edx
mov edx, [esp+8+4]
mov ecx, [esp+8+8]
call xpgrealloc
pop edx ecx
ret 8
 
libini_dllload:
push esi
mov esi, [esp+8]
.lib:
lodsd
test eax, eax
jz .ret
push eax
lodsd
xchg esi, [esp]
xor ebp, ebp ; no version control
call load_dll_and_import
pop esi
test eax, eax
jz .lib
.ret:
pop esi
ret 4
 
load_dll_and_import:
cmp byte [eax], '/'
jz .do
push esi
mov edi, saved_file_name
push edi
mov esi, standard_dll_path
mov ecx, standard_dll_path_size
rep movsb
mov esi, eax
mov ecx, 1024-standard_dll_path_size
@@:
lodsb
stosb
test al, al
loopnz @b
pop eax
pop esi
jz .do
push eax
mov edi, aFileNameTooBig
.sayerr:
push dword aCannotLoadDLL
push edi
mov eax, esp
push dword aOk
push esp
push 1
push eax
push 3
push -1
push -1
push dword aError
call SayErr
add esp, 16
xor eax, eax
inc eax
ret
.do:
push eax
mov ecx, eax
push 68
pop eax
push 19
pop ebx
int 0x40
mov edi, aInvalidDLL
test eax, eax
jz .sayerr
; initialize import
mov edi, aMissingExport
mov edx, eax
.import_loop:
lodsd
test eax, eax
jz .import_done
call .find_exported_function
jc .sayerr
mov [esi-4], eax
jmp .import_loop
.import_done:
; check version
test ebp, ebp
jz .version_ok
mov edi, aIncompatibleVersion
mov eax, aVersion
call .find_exported_function
jc .sayerr
cmp ax, bp
jb .sayerr
shr eax, 16
cmp eax, ebp
ja .sayerr
.version_ok:
; initialize library
mov eax, aStart
call .find_exported_function
jc @f
push 1 ; DLL_ENTRY
call eax
.ret0:
pop eax
xor eax, eax
ret
@@:
mov eax, aLibInit
call .find_exported_function
jc .ret0
mov esi, eax
mov eax, libini_alloc
mov ebx, libini_free
mov ecx, libini_realloc
mov edx, libini_dllload
call esi
mov edi, aInitFailed
test eax, eax
jnz .sayerr
jmp .ret0
 
.find_exported_function:
push edx
.import_loop_i:
mov ebx, [edx]
test ebx, ebx
jz .import_notfound
push eax
@@:
mov cl, [eax]
cmp cl, [ebx]
jnz .import_find_next
test cl, cl
jz .import_found
inc eax
inc ebx
jmp @b
.import_find_next:
pop eax
add edx, 8
jmp .import_loop_i
.import_found:
pop eax
mov eax, [edx+4]
pop edx
ret
.import_notfound:
pop edx
stc
ret