kolibrios-fun/programs/load_lib.mac
IgorA faf7939a32 1) some programs use new macros load_lib.mac
2) bcc32 add example use libimg.obj

git-svn-id: svn://kolibrios.org@8236 a494cfbc-eb01-0410-851d-a64ba20cac60
2020-11-22 13:13:45 +00:00

543 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; The macros for load any library/libraries:
; Copyright (c) 2009, <Lrz>
; All rights reserved.
macro @use_library mem_alloc,mem_free,mem_realloc,dll_load
{
local lp1
local lp2
local lp3
local lp4
local lp5
local lp6
local file_name
local l_lib_m1
local l_lib_m2
local l_lib_m3
local l_lib_m4
library_fun_memory_alloc equ mem_alloc
library_fun_memory_free equ mem_free
library_fun_memory_realloc equ mem_realloc
library_fun_dll_load equ dll_load
align 4
arrea_xx dd 0
file_name db '/sys/@notify',0
if lang eq ru
l_lib_m1 db '"‘¨á⥬­ ï ®è¨¡ª ',13,10,'<27>¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,0
l_lib_m2 db '"‘¨á⥬­ ï ®è¨¡ª ',13,10,'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,0
l_lib_m3 db 39,13,10,'­¥ ­ ©¤¥­  äã­ªæ¨ï ',39,0
l_lib_m4 db 39,'" -tE',0
else
l_lib_m1 db '"System error',13,10,'Sorry I cannot found library ',39,0
l_lib_m2 db '"System error',13,10,'Error on load import library ',39,0
l_lib_m3 db 39,13,10,'cannot found function ',39,0
l_lib_m4 db 39,'" -tE',0
end if
align 4
run_notify_struct:
.Function dd 7
.Position dd 0
.Flags dd ?
.Count dd 0
.Buffer dd 0
db 0
.FileName dd file_name
@library_name equ dword [esp+16]
@cur_dir_path equ dword [esp+12]
@library_path equ dword [esp+8]
@point_dir_name equ dword [esp+4]
;description:
; £®â®¢¨¬ ⥪áâ ¤«ï ¯®ª §  ç¥à¥§ @notify:
; 1) ¢ë¤¥«ï¥¬ ¯ ¬ïâì ¢ [arrea_xx] ­® ­¥ ¡®«ìè¥ ®¤­®£® à § 
; 2) ª®¯¨à㥬 § £®«®¢®ª (¥á«¨ ¥áâì ¨¬ï ä㭪樨 â® ¤®¡ ¢«ï¥¬ ¥£® ª § £®«®¢ªã) ¨ ⥪áâ á®®¡é¥­¨ï ¢ [arrea_xx]
;input:
; ebp+8 - library name
; ebp+12 - 0 ¨«¨ ¨¬ï ä㭪樨, ª®â®àãî ­¥ 㤠«®áì íªá¯®àâ¨à®¢ âì
;output:
; eax = -1
align 4
l_lib_init_error_window:
push ebp
mov ebp,esp
cmp dword[arrea_xx],0
jne .no_msg ;¥á«¨ à ­ìè¥ ¡ë«® ᮧ¤ ­® ¤à㣮¥ á®®¡é¥­¨¥
pushad
mcall SF_SYS_MISC,SSF_HEAP_INIT
mcall SF_SYS_MISC,SSF_MEM_ALLOC,4096
mov [arrea_xx],eax
mov edi,eax
mov esi,l_lib_m2 ;á®®¡é¥­¨¥ ¥á«¨ ­¥ 㤠«®áì ¨¬¯®àâ¨à®¢ âì äã­ªæ¨î
cmp dword[ebp+12],0
je @f
mov esi,l_lib_m1 ;á®®¡é¥­¨¥ ¥á«¨ ­¥ 㤠«®áì § £à㧨âì ¡¨¡«¨®â¥ªã
align 4
@@:
movsb
cmp byte[esi],0
jne @b
;¤®¡ ¢«ï¥¬ ¨¬ï ¡¨¡«¨®â¥ª¨
mov esi,[ebp+8]
align 4
@@:
movsb
cmp byte[esi],0
jne @b
cmp dword[ebp+12],0
je .lp1
;¤®¡ ¢«ï¥¬ á¥à¥¤¨­ã á®®¡é¥­¨ï
mov esi,l_lib_m3
align 4
@@:
movsb
cmp byte[esi],0
jne @b
;¤®¡ ¢«ï¥¬ ¨¬ï ä㭪樨
mov esi,[ebp+12]
align 4
@@:
movsb
cmp byte[esi],0
jne @b
.lp1: ;á®®¡é¥­¨¥ ¥á«¨ ­¥ 㤠«®áì § £à㧨âì ¡¨¡«¨®â¥ªã
;¤®¡ ¢«ï¥¬ ª®­¥æ á®®¡é¥­¨ï
mov esi,l_lib_m4
align 4
@@:
movsb
cmp byte[esi],0
jne @b
mov byte[edi],0
popad
.no_msg:
or eax,-1
pop ebp
ret 8
align 4
@copy_path:
mov esi,@cur_dir_path
mov edi,@library_path
xor eax,eax
cld
align 4
.lp1:
lodsb
stosb
test eax,eax
jnz .lp1
mov esi,edi
dec esi ;¯¥à¥å®¤ ­  ᨬ¢®« ª®­æ  áâப¨ @cur_dir_path
std
align 4
.lp2:
lodsb
cmp al,'/'
jnz .lp2
mov edi,esi
add edi,2
cld
mov esi,@point_dir_name
test esi,esi
jz .str_lp4
;¯à®¢¥àª  ®â­®á¨â¥«ì­ëå ¯ã⥩ c ¤¢ã¬ï â®çª ¬¨ '../'
cmp word[esi],'..'
jne .lp3
dec edi ;¤«ï ¯¥à¥å®¤  ­  '/'
.lp6:
add esi,3 ;¯à®¯ã᪠¥¬ ®¤­® ¯®¤­ï⨥ '../'
.lp5:
dec edi ;¨¤¥¬ ¯® ¯ ¯ª ¬
cmp byte[edi],'/'
jnz .lp5
cmp word[esi],'..'
je .lp6
inc edi ;¤«ï ¯¥à¥å®¤  ­  '/'
;ª®¯¨à®¢ ­¨¥ ®â­®á¨â¥«ì­®£® ¯ãâ¨
align 4
.lp3:
lodsb
stosb
test eax,eax
jnz .lp3
dec edi
.str_lp4:
mov esi,@library_name
align 4
.lp4:
lodsb
stosb
test eax,eax
jnz .lp4
ret
}
;---------------------------------------------------------------------
macro sys_load_library library_name__, library_path__, system_path__, myimport, point_dir_name__
{
local i_begin
local i_error
local i_exit
push ebx
mcall SF_SYS_MISC,SSF_LOAD_DLL,system_path__ ; load of sys directory
test eax,eax
jnz i_begin
if point_dir_name__ eq
copy_path library_name__, [32], library_path__,0
else
;the macros making way /current path a program/ + name system library
copy_path library_name__, [32], library_path__,point_dir_name__
end if
mcall SF_SYS_MISC,SSF_LOAD_DLL,library_path__ ; load of alternative
test eax,eax
jnz i_begin
jmp i_error
align 4
i_begin:
import_boxlib myimport
test eax,eax
jz i_exit
i_error:
push eax
push dword library_name__
call l_lib_init_error_window
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
i_exit:
pop ebx
}
;---------------------------------------------------------------------
;output:
; eax - ¥á«¨ 㤠筮 â® 0
macro load_library library_name__, library_path__, system_path__, myimport, point_dir_name__
{
local i_begin
local i_error
local i_exit
push ebx
if point_dir_name__ eq
copy_path library_name__, [32], library_path__,0
else
;the macros making way /current path a program/ + name system library
copy_path library_name__, [32], library_path__,point_dir_name__
end if
mcall SF_SYS_MISC,SSF_LOAD_DLL,library_path__ ; load of alternative
test eax,eax
jnz i_begin
mcall SF_SYS_MISC,SSF_LOAD_DLL,system_path__ ; load of sys directory
test eax,eax
jnz i_begin
jmp i_error
align 4
i_begin:
import_boxlib myimport
test eax,eax
jz i_exit
i_error:
push eax
push dword library_name__
call l_lib_init_error_window
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
i_exit:
pop ebx
;---------------------------------------------------------------------
}
;description:
; ¬ ªà®á § £à㧪¨ ¡¨¡«¨®â¥ª ¨§ á¨á⥬­®© ¯ ¯ª¨, ¥á«¨ ¡¨¡«¨®â¥ª  ­¥ ­ ©¤¥­ 
; ⮣¤  ¯®¨áª ¨¤¥â ¢ ⥪ã饩 ¯ ¯ª¥ á ¯à®£à ¬¬®©
macro sys_load_libraries _start,_end
{
local cycle0
local end_steep
local cycle0n
local cycle1
local cycle1n
local cycle1e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name__ equ [ebp]
library_path__ equ [ebp+4]
system_path__ equ [ebp+8]
my_import equ [ebp+12]
point_dir_name__ equ [ebp+16]
adr_load_lib equ dword [ebp+20]
status_lib equ dword [ebp+24]
mov ebp,_start
mov ecx,(_end-_start)/ll_struc_size
align 4
cycle0:
push ecx
mcall SF_SYS_MISC,SSF_LOAD_DLL,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
;the macros making way /current path a program/ + name system library
copy_path library_name__, [32], library_path__,point_dir_name__
mcall SF_SYS_MISC,SSF_LOAD_DLL,library_path__ ; load of alternative
test eax,eax
jnz end_steep
or status_lib,1 ; status of code - enable error - not found library
push eax
push dword library_name__
call l_lib_init_error_window
jmp cycle0n
align 4
end_steep:
mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import
test eax,eax
jz cycle0n
or status_lib,2 ; status of code - enable error - import error
push eax
push dword library_name__
call l_lib_init_error_window
cycle0n:
pop ecx
add ebp,ll_struc_size
dec ecx
jnz cycle0
;¢ë¢®¤ á®®¡é¥­¨ï ®¡ ®è¨¡ª¥ ¯à¨ § £à㧪¥
mov ebp,_start
mov ecx,(_end-_start)/ll_struc_size
align 4
cycle1:
mov eax,status_lib
test eax,eax
jz cycle1n
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
mov eax,-1
jmp cycle1e
align 4
cycle1n:
add ebp,ll_struc_size
dec ecx
jnz cycle1
cycle1e:
}
;description:
; ¬ ªà®á § £à㧪¨ ¡¨¡«¨®â¥ª ¨§ ⥪ã饩 ¯ ¯ª¨ á ¯à®£à ¬¬®©, ¥á«¨ ¡¨¡«¨®â¥ª  ­¥ ­ ©¤¥­ 
; ⮣¤  ¯®¨áª ¨¤¥â ¢ á¨á⥬­®© ¯ ¯ª¥
macro load_libraries _start,_end
{
local cycle0
local end_steep
local cycle0n
local cycle1
local cycle1n
local cycle1e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
library_name__ equ [ebp]
library_path__ equ [ebp+4]
system_path__ equ [ebp+8]
my_import equ [ebp+12]
point_dir_name__ equ [ebp+16]
adr_load_lib equ dword [ebp+20]
status_lib equ dword [ebp+24]
mov ebp,_start
mov ecx,(_end-_start)/ll_struc_size
align 4
cycle0:
push ecx
;the macros making way /current path a program/ + name system library
copy_path library_name__, [32], library_path__,point_dir_name__
mcall SF_SYS_MISC,SSF_LOAD_DLL,library_path__ ; load of alternative
test eax,eax
jnz end_steep
mcall SF_SYS_MISC,SSF_LOAD_DLL,system_path__ ; load of sys directory
test eax,eax
jnz end_steep
or status_lib,1 ; status of code - enable error - not found library
push eax
push dword library_name__
call l_lib_init_error_window
jmp cycle0n
align 4
end_steep:
mov adr_load_lib,eax ;save adr lib in memory
import_boxlib my_import
test eax,eax
jz cycle0n
or status_lib,2 ; status of code - enable error - import error
push eax
push dword library_name__
call l_lib_init_error_window
cycle0n:
pop ecx
add ebp,ll_struc_size
dec ecx
jnz cycle0
;¢ë¢®¤ á®®¡é¥­¨ï ®¡ ®è¨¡ª¥ ¯à¨ § £à㧪¥
mov ebp,_start
mov ecx,(_end-_start)/ll_struc_size
align 4
cycle1:
mov eax,status_lib
test eax,eax
jz cycle1n
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
mov eax,-1
jmp cycle1e
align 4
cycle1n:
add ebp,ll_struc_size
dec ecx
jnz cycle1
cycle1e:
}
macro copy_path lib_name,dir_path,lib_path,point_dir_name
{
pushad ;save all registers
push dword lib_name
push dword dir_path
push dword lib_path
push dword point_dir_name
call @copy_path
add esp,16
;notify_window_run lib_path ;unblok for test load path
popad ;restore all registers
}
; ¢ª«îç ¥¬ ¯®ª § á®®¡é¥­¨ï ç¥à¥§ @notify:
macro notify_window_run message
{
push eax ebx
mov eax,message ;¯ à ¬¥âàë ¤«ï ª®¬ ­¤­®© áâப¨
mov [run_notify_struct.Flags],eax
mcall SF_FILE,run_notify_struct
pop ebx eax
}
;input:
; eax -  ¤à¥á ¡¨¡«¨®â¥ª¨ ¢ ¯ ¬ïâ¨
; myimport - ¨¬¯®àâ¨àã¥¬ë¥ ä㭪樨
;output:
; eax - ¥á«¨ 㤠筮 â® 0 ¨«¨ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 ª®â®àãî ­¥ 㤠«®áì § £à㧨âì
; ebx - à §àãè ¥âáï
macro import_boxlib myimport
{
local import_loop
local import_find
local lp
local import_find_next
local import_found
local import_done
local exit
local import_not_found
; initialize import
push esi
mov edx, eax
mov esi, myimport
cld
import_loop:
lodsd ;mov eax,dword[esi] ;add esi,4 ;¯®«ãç ¥¬ ¢ eax 㪠§ â¥«ì ­  ¨¬ï ¨¬¯®àâ¨à㥬®© ä㭪樨
test eax, eax
jz import_done ;¥á«¨ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 = 0 (¢ ¯®«ì§®¢ â¥«ì᪮© ¯à®£à ¬¬¥)
push edx ;á®å࠭塞 ­ ç «® ¡¨¡«¨®â¥ç­ëå 㪠§ â¥«¥© ­  ä㭪樨
import_find:
mov ebx, [edx]
test ebx, ebx
jz import_not_found ;¥á«¨ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 = 0 (¢ ¡¨¡«¨®â¥ª¥)
push eax ;eax - 㪠§ â¥«ì ­  ¨¬ï íªá¯®àâ¨à㥬®© ä㭪樨 (¢ ¯®«ì§®¢ â¥«ì᪮© ¯à®£à ¬¬¥)
align 4
lp:
mov cl, [eax]
cmp cl, [ebx] ;áà ¢­¨¢ ¥¬ ¨¬¥­  ä㭪権 ¢ ¡¨¡«¨®â¥ª¥ ¨ ¢ ¯®«ì§®¢ â¥«ì᪮© ¯à®£à ¬¬¥
jnz import_find_next ;¥á«¨ ­ §¢ ­¨ï ­¥ ᮢ¯ «¨
test cl, cl
jz import_found ;¥á«¨ ­ §¢ ­¨ï ᮢ¯ «¨, ¨ 㦥 ª®­¥æ áâப¨ (cl=0)
inc eax
inc ebx
jmp lp
import_find_next:
pop eax
add edx, 8 ;8 = 4 ¡ ©â  㪠§ â¥«ì ­  ­ §¢ ­¨¥ ¨ 4 ¡ ©â  㪠§ â¥«ì ­  äã­ªæ¨î
jmp import_find
import_found:
pop ebx ;¢®áâ ­ ¢«¨¢ ¥¬ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 (ª®â®àë© ¡ë« ¢ eax) ¨ ®á¢®¡®¦¤ ¥¬ á⥪
mov eax, [edx+4] ;eax = 㪠§ â¥«ì ­  äã­ªæ¨î (¢ ¡¨¡«¨®â¥ª¥)
mov [esi-4], eax ;ª®¯¨à㥬 㪠§ â¥«ì (­  äã­ªæ¨î) ¢ ¯à®£à ¬¬ã, -4 áâ ¢¨¬ ¯®â®¬ã çâ® esi ¡ë«® ᤢ¨­ãâ® ª®¬ ­¤®© lodsd
pop edx ;ãáâ ­ ¢«¨¢ ¥¬ edx ­  ­ ç «® ¡¨¡«¨®â¥ç­ëå ä㭪権
;--- ¯à®¢¥à塞 ᮢ¯ ¤ ¥â «¨ ¨¬ï íªá¯®àâ¨à®¢ ­­®© ä㭪樨 á 'lib_init'
if library_fun_memory_alloc eq
else
cmp dword[ebx],'lib_'
jne import_loop
cmp dword[ebx+4],'init'
jne import_loop
;cmp byte[ebx+8],0
;jne import_loop
;--- ¥á«¨ ¨¬ï ä㭪樨 ᮢ¯ «® á 'lib_init' ¯®¯ ¤ ¥¬ á
;¯®¤ª«î祭¨¥ ä㭪権 ¤«ï à ¡®âë á ¯ ¬ïâìî
;push eax
;call dll.Init
pushad
mov esi,eax
mov eax,library_fun_memory_alloc
mov ebx,library_fun_memory_free
mov ecx,library_fun_memory_realloc
mov edx,library_fun_dll_load
call dword esi
popad
end if
jmp import_loop
import_not_found:
add esp,4
jmp exit
import_done:
xor eax,eax ;=0 ¢á¥ § £à㧨«®áì 㤠筮
exit:
pop esi
}
;---------------------------------------------------------------------
ll_struc_size = 28;($-library_name__) ; constant size of struct
struc l_libs library_name__, library_path__, system_path__, my_import, point_dir_name; struct for loading libraries
{
.library_name__ dd library_name__ ; ¨¬ï § £à㦠¥¬®© ¡¨¡«¨®â¥ª¨
.library_path__ dd library_path__ ; 㪠§ â¥«ì ­  ¡ãä¥à ¢ ª®â®à®¬ ¡ã¤¥â á®ä®à¨¬¨à®¢ ­ ¯ãâì ª ¡¨¡«¨®â¥ª¨, ¥á«¨ ­ã¦­® ¢ëç¨á«¨âì ¯ãâì ¤® «¨¡ë á ¬¥áâ  § ¯ã᪠ ¯à®£à ¬¬ë, ®¡ëç­® ­ã¦­®, ¢ á«ãç ïå, ¥á«¨ «¨¡  à á¯®«®¦¥­  ¢ ⮩ ¦¥ ¯ ¯ª¥
.complete_path dd system_path__ ; ¯ãâì ª®â®àë© ç¥âª® ᮤ¥à¦¨â ¯ãâì
.my_import dd my_import
if point_dir_name eq
.point_dir_name__ dd 0
else
.point_dir_name__ dd point_dir_name ; ¨¬ï ¢«®¦¥­­®© ¤¨à४â®à¨¨ ¢ ªâ®à®© åà ­ïâìáï ¯®¤£à㦠¥¬ë¥ ¬®¤ã«¨.
end if
.adr_load_lib dd 0
.status_lib dd 0 ;status of load library
;
}