0,0 → 1,144 |
;----------------------------------------------------------------------------- |
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 |
stdcall dll.Link,eax,edx |
stdcall dll.Init,[eax+4] |
pop esi |
add esi,8 |
jmp .next_lib |
.exit: |
xor eax,eax |
ret |
.fail: |
add esp,4 |
xor eax,eax |
inc eax |
ret |
endp |
;----------------------------------------------------------------------------- |
proc dll.Link, exp:dword,imp:dword |
push eax |
mov esi,[imp] |
test esi,esi |
jz .done |
.next: |
lodsd |
test eax,eax |
jz .done |
stdcall dll.GetProcAddress,[exp],eax |
or eax,eax |
jz @f |
mov [esi-4],eax |
jmp .next |
@@: |
mov dword[esp],0 |
.done: |
pop eax |
ret |
endp |
;----------------------------------------------------------------------------- |
proc dll.Init, dllentry:dword |
pushad |
mov eax,mem.Alloc ;libini_alloc |
mov ebx,mem.Free ;libini_free |
mov ecx,mem.ReAlloc ;libini_realloc |
mov edx,dll.Load |
stdcall [dllentry] |
popad |
ret |
endp |
;----------------------------------------------------------------------------- |
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: |
ret |
endp |
;----------------------------------------------------------------------------- |
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 |
;----------------------------------------------------------------------------- |
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] |
or ecx,ecx |
jz @f |
@@: |
mov edx,[mptr] |
or edx,edx |
jz @f |
@@: |
mcall 68,20 |
or eax,eax |
jz @f |
@@: |
pop edx ecx ebx |
ret |
endp |
;----------------------------------------------------------------------------- |
proc mem.Free,mptr |
push ebx ecx |
mov ecx,[mptr] |
or ecx,ecx |
jz @f |
@@: |
mcall 68,13 |
pop ecx ebx |
ret |
endp |
;----------------------------------------------------------------------------- |