kolibrios/programs/develop/libraries/dll/dll.inc

193 lines
4.1 KiB
PHP
Raw Normal View History

;
; (C) KolibriOS team (original dll.inc)
; (C) 2022, Edited by Coldy
;
; This module based on original dll.inc.
;
; - Improved error handling. Now dll.Load return 0 is success guarantie
; Also added corrsponding error codes if one of library or entry not found
;
ERROR_LIBRARY_NOT_LOAD = 0x100
ERROR_ENTRY_NOT_FOUND = 0x101
;-----------------------------------------------------------------------------
; load one or more DLL file in COFF format and try to import functions by our list
; if first function in import list begins with 'lib_', call it as DLL initialization
; return eax = 1 as fail, if anyone of .obj file not found in /sys/lib
; return 0 if all fine or error code LIBRARY_NOT_LOAD or ENTRY_NOT_FOUND
; dirties all registers! eax, ebx, ecx, edx, esi, edi
proc dll.Load, import_table:dword
mov esi, [import_table]
.next_lib:
mov edx, [esi]
or edx, edx
jz .exit
push esi
mov esi, [esi + 4]
mov edi, s_libdir.fname
@@:
lodsb
stosb
or al, al
jnz @b
mcall 68, 19, s_libdir
or eax, eax
jz .fail_load
push eax
stdcall dll.Link, eax, edx
test eax, eax
jnz .fail_link
;push eax
mov eax, [esp]
mov eax, [eax]
cmp dword[eax], 'lib_'
pop eax
jnz @f
stdcall dll.Init, [eax + 4]
@@:
pop esi
add esi, 8
jmp .next_lib
.exit:
xor eax, eax
ret
.fail_load:
add esp, 4
;xor eax, eax
;inc eax
mov eax, ERROR_LIBRARY_NOT_LOAD
ret
.fail_link:
add esp, 4
ret
endp
;-----------------------------------------------------------------------------
; scans dll export table for a functions we want to import
; break scan on first unresolved import
; return value: 0 - success or ENTRY_NOT_FOUND
proc dll.Link, exp:dword, imp:dword
;push eax
mov esi, [imp]
; Import table alreary checked in APP_STARTUP_THUNK
;test esi, esi
;jz .fail1;.done
.next:
lodsd
test eax, eax
jz .done
mov ebx, eax
stdcall dll.GetProcAddress, [exp], eax
or eax, eax
jz .fail ;.done
mov [esi - 4], eax
jmp .next
; @@:
;mov dword[esp], 0
;.fail1:
; No imports
;mov eax, BAD_IMAGE
;jmp .done
.fail:
mov [szEntryName],ebx
mov eax, ERROR_ENTRY_NOT_FOUND
.done:
;pop eax
ret
endp
;-----------------------------------------------------------------------------
; calls lib_init with predefined parameters
; no return value
proc dll.Init, dllentry:dword
pushad
mov eax, mem.Alloc
mov ebx, mem.Free
mov ecx, mem.ReAlloc
mov edx, dll.Load
stdcall [dllentry]
popad
ret
endp
;-----------------------------------------------------------------------------
; scans export table for a sz_name function
; returns in eax function address or 0 if not found
proc dll.GetProcAddress, exp:dword, sz_name:dword
mov edx, [exp]
xor eax, eax
.next:
or edx, edx
jz .end
cmp dword[edx], 0
jz .end
stdcall strcmp, [edx], [sz_name]
test eax, eax
jz .ok
add edx, 8
jmp .next
.ok:
mov eax, [edx + 4]
.end:
cmp eax, -1
jnz @f
xor eax, eax
@@:
ret
endp
;-----------------------------------------------------------------------------
; compares strings
; returns eax = 0 if equal, -1 otherwise
proc strcmp, str1:dword, str2:dword
push esi edi
mov esi, [str1]
mov edi, [str2]
xor eax, eax
@@:
lodsb
scasb
jne .fail
or al, al
jnz @b
jmp .ok
.fail:
or eax, -1
.ok:
pop edi esi
ret
endp
;-----------------------------------------------------------------------------
s_libdir:
db '/sys/lib/'
.fname rb 32
szEntryName dd 0
;-----------------------------------------------------------------------------
proc mem.Alloc, size
push ebx ecx
mov ecx, [size]
mcall 68, 12
pop ecx ebx
ret
endp
;-----------------------------------------------------------------------------
proc mem.ReAlloc, mptr, size
push ebx ecx edx
mov ecx, [size]
mov edx, [mptr]
mcall 68, 20
pop edx ecx ebx
ret
endp
;-----------------------------------------------------------------------------
proc mem.Free, mptr
push ebx ecx
mov ecx,[mptr]
mcall 68, 13
pop ecx ebx
ret
endp
;-----------------------------------------------------------------------------