117,7 → 117,8 |
local lp1 |
local correction |
local exit_ |
;/equ |
|
library_fun_memory_alloc equ 0 ;íå èñïîëüçîâàòü â ìàêðîñàõ ïðîâåðêó íà ôóíêöèè 'lib_init' |
err_message1 equ dword [esp+8] |
head1 equ dword [esp+4] |
|
325,6 → 326,16 |
|
|
|
macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load |
{ |
@use_library |
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 |
} |
|
|
macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ |
{ |
local end_steep |
589,6 → 600,9 |
} |
|
|
;âõîäíûå ïàðàìåòðû: |
;eax - àäðåñ áèáëèîòåêè â ïàìÿòè |
;myimport - èìïîðòèðóåìûå ôóíêöèè |
macro import_boxlib myimport, err_message_import__, head_f_i__ |
{ |
local import_loop |
605,33 → 619,53 |
mov edx, eax |
mov esi,myimport |
import_loop: |
lodsd |
lodsd ;mov eax,dword[esi] ;add esi,4 ;ïîëó÷àåì â eax óêàçàòåëü íà èìÿ èìïîðòèðóåìîé ôóíêöèè |
test eax, eax |
jz import_done |
push edx |
jz import_done ;åñëè óêàçàòåëü íà èìÿ ôóíêöèè = 0 (â ïîëüçîâàòåëüñêîé ïðîãðàììå) |
push edx ;ñîõðàíÿåì íà÷àëî áèáëèîòå÷íûõ óêàçàòåëåé íà ôóíêöèè |
import_find: |
mov ebx, [ds:edx] |
test ebx, ebx |
jz import_not_found |
push eax |
jz import_not_found ;åñëè óêàçàòåëü íà èìÿ ôóíêöèè = 0 (â áèáëèîòåêå) |
push eax ;eax - óêàçàòåëü íà èìÿ ýêñïîðòèðóåìîé ôóíêöèè (â ïîëüçîâàòåëüñêîé ïðîãðàììå) |
lp: |
mov cl, [ds:eax] |
cmp cl, [ds:ebx] |
jnz import_find_next |
cmp cl, [ds:ebx] ;ñðàâíèâàåì èìåíà ôóíêöèé â áèáëèîòåêå è â ïîëüçîâàòåëüñêîé ïðîãðàììå |
jnz import_find_next ;åñëè íàçâàíèÿ íå ñîâïàëè |
test cl, cl |
jz import_found |
jz import_found ;åñëè íàçâàíèÿ ñîâïàëè, è óæå êîíåö ñòðîêè (cl=0) |
inc eax |
inc ebx |
jmp lp |
import_find_next: |
pop eax |
add edx, 8 |
add edx, 8 ;8 = 4 áàéòà óêàçàòåëü íà íàçâàíèå è 4 áàéòà óêàçàòåëü íà ôóíêöèþ |
jmp import_find |
import_found: |
pop eax |
mov eax, [ds:edx+4] |
mov [esi-4], eax |
pop edx |
pop ebx ;âîñòàíàâëèâàåì óêàçàòåëü íà èìÿ ôóíêöèè (êîòîðûé áûë â eax) è îñâîáîæäàåì ñòåê |
mov eax, [ds:edx+4] ;eax = óêàçàòåëü íà ôóíêöèþ (â áèáëèîòåêå) |
mov [esi-4], eax ;êîïèðóåì óêàçàòåëü (íà ôóíêöèþ) â ïðîãðàììó, -4 ñòàâèì ïîòîìó ÷òî esi áûëî ñäâèíóòî êîìàíäîé lodsd |
pop edx ;óñòàíàâëèâàåì edx íà íà÷àëî áèáëèîòå÷íûõ ôóíêöèé |
;--- ïðîâåðÿåì ñîâïàäàåò ëè èìÿ ýêñïîðòèðîâàííîé ôóíêöèè ñ 'lib_init' |
if library_fun_memory_alloc eq 0 |
else |
cmp dword[ebx],'lib_' |
jne import_loop |
cmp dword[ebx+4],'init' |
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 |
638,7 → 672,7 |
show_error_window err_message_import__, head_f_i__ ;show error message /create window |
jmp e.exit |
import_done: |
xor eax,eax |
xor eax,eax ;=0 âñå çàãðóçèëîñü óäà÷íî |
e.exit: |
;--------------------------------------------------------------------- |
} |