0,0 → 1,534 |
; 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,'¥ ©¤¥ ¡¨¡«¨®â¥ª ',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 |
|
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: |
} |
;--------------------------------------------------------------------- |
|
macro load_library library_name__, library_path__, system_path__, myimport, point_dir_name__ |
{ |
local i_begin |
local i_error |
local i_exit |
|
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: |
;--------------------------------------------------------------------- |
} |
|
;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 ¨«¨ 㪠§ â¥«ì ¨¬ï äãªæ¨¨ ª®â®àãî ¥ 㤠«®áì § £à㧨âì |
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 |
|
mov edx, eax |
mov esi,myimport |
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 - 㪠§ â¥«ì ¨¬ï íªá¯®àâ¨à㥬®© äãªæ¨¨ (¢ ¯®«ì§®¢ ⥫ì᪮© ¯à®£à ¬¬¥) |
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: |
} |
;--------------------------------------------------------------------- |
|
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 |
; |
} |