; 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
;
}