mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-15 11:22:34 +03:00
4982b912eb
git-svn-id: svn://kolibrios.org@8219 a494cfbc-eb01-0410-851d-a64ba20cac60
620 lines
18 KiB
Plaintext
620 lines
18 KiB
Plaintext
; The macros for load any library/libraries:
|
||
; Copyright (c) 2009, <Lrz>
|
||
; All rights reserved.
|
||
;
|
||
; Redistribution and use in source and binary forms, with or without
|
||
; modification, are permitted provided that the following conditions are met:
|
||
; * Redistributions of source code must retain the above copyright
|
||
; notice, this list of conditions and the following disclaimer.
|
||
; * Redistributions in binary form must reproduce the above copyright
|
||
; notice, this list of conditions and the following disclaimer in the
|
||
; documentation and/or other materials provided with the distribution.
|
||
; * Neither the name of the <organization> nor the
|
||
; names of its contributors may be used to endorse or promote products
|
||
; derived from this software without specific prior written permission.
|
||
;
|
||
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka <Lrz> ''AS IS'' AND ANY
|
||
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
;*****************************************************************************
|
||
; This macros based on source code:
|
||
; <Lrz> - Alexey Teplov / €«¥ªá¥© ’¥¯«®¢
|
||
; Mario79, Mario - Marat Zakiyanov / Œ à â ‡ ª¨ï®¢
|
||
; Diamondz - Evgeny Grechnikov / …¢£¥¨© ƒà¥ç¨ª®¢
|
||
;------------------------
|
||
; DESCRIPTION
|
||
; Macro load_library
|
||
; Logick of work.
|
||
; A first time we must to check system path, where I belive find a system library. System path is "/sys/lib/".
|
||
; If I cannot found my library, i must to check second way. Second way is current dirrectory.
|
||
; If we cannot load library, we must show the error message:
|
||
; "I'm sorry,the programm cannot found system library box_lib.obj."
|
||
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
|
||
;
|
||
;
|
||
;---------------------------------------------------------------------
|
||
; Macro sys_load_library
|
||
; A first time we must to check own path in current dirrectory the program, where I belive find a system library.
|
||
; If I cannot found my library, i must to check second way. Second way is system path a "/sys/lib/".
|
||
; If we cannot load library, we must show the error message:
|
||
; "I'm sorry,the programm cannot found system library box_lib.obj."
|
||
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
|
||
;
|
||
;---------------------------------------------------------------------
|
||
; How can I use it?
|
||
;---------------------------------------------------------------------
|
||
;-Example using single load library
|
||
;-universal load library/librarys
|
||
;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__
|
||
;-if return code =-1 then exit, else normally work
|
||
; cmp eax,-1
|
||
; jz exit
|
||
;- Well, if you get
|
||
;
|
||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||
;DATA ¤ ë¥
|
||
;‚ᥣ¤ ᮡ«î¤ âì ¯®á«¥¤®¢ ⥫ì®áâì ¢ ¨¬¥¨.
|
||
;system_path__ db '/sys/lib/'
|
||
;library_name__ db 'box_lib.obj',0
|
||
; …᫨ ¥áâì ¦¥« ¨¥ à §ê¥¤¨¨âì, ⮠㦮 ¨á¯®«ì§®¢ âì á«¥¤ãîé¨î ª®áâàãªæ¨î
|
||
;system_path__ db '/sys/lib/box_lib.obj',0
|
||
;... «î¡ ï ¯®á«¥¤®¢ ⥫ì®áâì ¤àã£¨å ª®¬ ¤ ¨ ®¯à¥¤¥«¥¨©.
|
||
;library_name__ db 'box_lib.obj',0
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
||
;err_message_found_lib__ db 'Sorry I cannot found library box_lib.obj',0
|
||
;head_f_i__:
|
||
;head_f_l__ db 'System error',0
|
||
;err_message_import__ db 'Error on load import library box_lib.obj',0
|
||
|
||
;myimport:
|
||
;
|
||
;edit_box_draw dd aEdit_box_draw
|
||
;edit_box_key dd aEdit_box_key
|
||
;edit_box_mouse dd aEdit_box_mouse
|
||
;version_ed dd aVersion_ed
|
||
; dd 0,0
|
||
;aEdit_box_draw db 'edit_box',0
|
||
;aEdit_box_key db 'edit_box_key',0
|
||
;aEdit_box_mouse db 'edit_box_mouse',0
|
||
;aVersion_ed db 'version_ed',0
|
||
|
||
|
||
|
||
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
|
||
|
||
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
|
||
|
||
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 - head message
|
||
; ebp+12 - error message
|
||
; ebp+16 - 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 68,11
|
||
mcall 68,12,4096
|
||
mov [arrea_xx],eax
|
||
|
||
mov edi,eax
|
||
mov esi,[ebp+8]
|
||
align 4
|
||
@@:
|
||
movsb
|
||
cmp byte[esi],0
|
||
jne @b
|
||
mov word[edi],0xa0d
|
||
add edi,2
|
||
|
||
;¤®¡ ¢«ï¥¬ ¨¬ï äãªæ¨¨ ¢ § £®«®¢®ª
|
||
mov esi,[ebp+16]
|
||
or esi,esi
|
||
jz .lp1
|
||
mov word[edi-2],0x2020
|
||
@@:
|
||
movsb
|
||
cmp byte[esi],0
|
||
jne @b
|
||
mov word[edi],0xa0d
|
||
add edi,2
|
||
.lp1:
|
||
|
||
mov esi,[ebp+12]
|
||
align 4
|
||
@@:
|
||
movsb
|
||
cmp byte[esi],0
|
||
jne @b
|
||
mov byte[edi],0
|
||
popad
|
||
.no_msg:
|
||
or eax,-1
|
||
pop ebp
|
||
ret 12
|
||
|
||
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 @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
|
||
{
|
||
@use_library mem_alloc,mem_free,mem_realloc,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 i_begin
|
||
local i_error
|
||
local i_exit
|
||
|
||
mcall 68,19,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 68,19,library_path__ ; load of alternative
|
||
test eax,eax
|
||
jnz i_begin
|
||
push eax
|
||
push dword err_message_found_lib__
|
||
push dword head_f_l__
|
||
jmp i_error
|
||
align 4
|
||
i_begin:
|
||
import_boxlib myimport
|
||
test eax,eax
|
||
jz i_exit
|
||
push eax
|
||
push dword err_message_import__
|
||
push dword head_f_i__
|
||
i_error:
|
||
call l_lib_init_error_window
|
||
notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª® @notify
|
||
i_exit:
|
||
}
|
||
;---------------------------------------------------------------------
|
||
|
||
macro 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 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 68,19,library_path__ ; load of alternative
|
||
test eax,eax
|
||
jnz i_begin
|
||
|
||
mcall 68,19,system_path__ ; load of sys directory
|
||
test eax,eax
|
||
jnz i_begin
|
||
push eax
|
||
push dword err_message_found_lib__
|
||
push dword head_f_l__
|
||
jmp i_error
|
||
align 4
|
||
i_begin:
|
||
import_boxlib myimport
|
||
test eax,eax
|
||
jz i_exit
|
||
push eax
|
||
push dword err_message_found_lib__
|
||
push dword head_f_l__
|
||
i_error:
|
||
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]
|
||
err_message_found_lib__ equ [ebp+12]
|
||
head_f_l__ equ [ebp+16]
|
||
my_import equ [ebp+20]
|
||
err_message_import__ equ [ebp+24]
|
||
head_f_i__ equ [ebp+28]
|
||
point_dir_name__ equ [ebp+32]
|
||
adr_load_lib equ dword [ebp+36]
|
||
status_lib equ dword [ebp+40]
|
||
|
||
mov ebp,_start
|
||
mov ecx,(_end-_start)/ll_struc_size
|
||
align 4
|
||
cycle0:
|
||
push ecx
|
||
mcall 68,19,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 68,19,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 err_message_found_lib__
|
||
push dword head_f_l__
|
||
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 err_message_import__
|
||
push dword head_f_i__
|
||
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]
|
||
err_message_found_lib__ equ [ebp+12]
|
||
head_f_l__ equ [ebp+16]
|
||
my_import equ [ebp+20]
|
||
err_message_import__ equ [ebp+24]
|
||
head_f_i__ equ [ebp+28]
|
||
point_dir_name__ equ [ebp+32]
|
||
adr_load_lib equ dword [ebp+36]
|
||
status_lib equ dword [ebp+40]
|
||
|
||
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 68,19,library_path__ ; load of alternative
|
||
test eax,eax
|
||
jnz end_steep
|
||
|
||
mcall 68,19,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 err_message_found_lib__
|
||
push dword head_f_l__
|
||
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 err_message_import__
|
||
push dword head_f_i__
|
||
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
|
||
mov eax,70 ;run @notify
|
||
mov ebx,run_notify_struct
|
||
int 0x40
|
||
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
|
||
;--- ¥á«¨ ¨¬ï äãªæ¨¨ ᮢ¯ «® á '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 = 44;($-library_name__) ; constant size of struct
|
||
struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, my_import, err_message_import__, head_f_i__,point_dir_name; struct for loading libraries
|
||
{
|
||
.library_name__ dd library_name__ ; ¨¬ï § £à㦠¥¬®© ¡¨¡«¨®â¥ª¨
|
||
|
||
.library_path__ dd library_path__ ; 㪠§ â¥«ì ¡ãä¥à ¢ ª®â®à®¬ ¡ã¤¥â á®ä®à¨¬¨à®¢ ¯ãâì ª ¡¨¡«¨®â¥ª¨, ¥á«¨ 㦮 ¢ëç¨á«¨âì ¯ãâì ¤® «¨¡ë á ¬¥áâ § ¯ã᪠¯à®£à ¬¬ë, ®¡ëç® ã¦®, ¢ á«ãç ïå, ¥á«¨ «¨¡ à ᯮ«®¦¥ ¢ ⮩ ¦¥ ¯ ¯ª¥
|
||
.complete_path dd system_path__ ; ¯ãâì ª®â®àë© ç¥âª® ᮤ¥à¦¨â ¯ãâì
|
||
|
||
.err_message_found_lib__ dd err_message_found_lib__
|
||
.head_f_l__ dd head_f_l__
|
||
.my_import dd my_import
|
||
.err_message_import__ dd err_message_import__
|
||
.head_f_i__ dd head_f_i__
|
||
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
|
||
;
|
||
}
|