; 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 if lang eq it l_lib_m1 db '"Errore di sistema',13,10,'Non trovato ',39,0 l_lib_m2 db '"Errore di sistema',13,10,'Import errato ',39,0 l_lib_m3 db 39,13,10,'funzione non trovata ',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 ;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 @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] 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 ; }