forked from KolibriOS/kolibrios
new macros '@use_library_mem mem_alloc,mem_free,mem_realloc,dll_load'
in file 'load_lib.mac' git-svn-id: svn://kolibrios.org@1488 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a9bc0ed088
commit
4c444c11c9
@ -200,9 +200,14 @@ er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i
|
|||||||
jnz exit ;если не 0, то уходим.
|
jnz exit ;если не 0, то уходим.
|
||||||
mov ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала.
|
mov ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала.
|
||||||
|
|
||||||
Макорос @use_library
|
Макорос @use_library
|
||||||
|
|
||||||
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно.
|
Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса нужно для загрузки библиотек но его можно заменять на @use_library_mem.
|
||||||
|
|
||||||
|
|
||||||
|
Макорос @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
|
||||||
|
|
||||||
|
Этот макрос использует макрос @use_library, но в отличие от него он позволяет для функций с именами 'lib_init' задавать 4 параметра. В даных параметрах могут быть указатели на функции для работы с памятью, которые могут быть нужны для использования внутри библиотеки.
|
||||||
|
|
||||||
|
|
||||||
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?
|
Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе?
|
||||||
|
@ -117,7 +117,8 @@ local lp
|
|||||||
local lp1
|
local lp1
|
||||||
local correction
|
local correction
|
||||||
local exit_
|
local exit_
|
||||||
;/equ
|
|
||||||
|
library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init'
|
||||||
err_message1 equ dword [esp+8]
|
err_message1 equ dword [esp+8]
|
||||||
head1 equ dword [esp+4]
|
head1 equ dword [esp+4]
|
||||||
|
|
||||||
@ -325,6 +326,16 @@ align 4
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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__
|
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
|
local end_steep
|
||||||
@ -589,6 +600,9 @@ macro show_error_window err_message, head
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
;входные параметры:
|
||||||
|
;eax - адрес библиотеки в памяти
|
||||||
|
;myimport - импортируемые функции
|
||||||
macro import_boxlib myimport, err_message_import__, head_f_i__
|
macro import_boxlib myimport, err_message_import__, head_f_i__
|
||||||
{
|
{
|
||||||
local import_loop
|
local import_loop
|
||||||
@ -605,40 +619,60 @@ local import_not_found
|
|||||||
mov edx, eax
|
mov edx, eax
|
||||||
mov esi,myimport
|
mov esi,myimport
|
||||||
import_loop:
|
import_loop:
|
||||||
lodsd
|
lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz import_done
|
jz import_done ;если указатель на имя функции = 0 (в пользовательской программе)
|
||||||
push edx
|
push edx ;сохраняем начало библиотечных указателей на функции
|
||||||
import_find:
|
import_find:
|
||||||
mov ebx, [ds:edx]
|
mov ebx, [ds:edx]
|
||||||
test ebx, ebx
|
test ebx, ebx
|
||||||
jz import_not_found
|
jz import_not_found ;если указатель на имя функции = 0 (в библиотеке)
|
||||||
push eax
|
push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе)
|
||||||
lp:
|
lp:
|
||||||
mov cl, [ds:eax]
|
mov cl, [ds:eax]
|
||||||
cmp cl, [ds:ebx]
|
cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе
|
||||||
jnz import_find_next
|
jnz import_find_next ;если названия не совпали
|
||||||
test cl, cl
|
test cl, cl
|
||||||
jz import_found
|
jz import_found ;если названия совпали, и уже конец строки (cl=0)
|
||||||
inc eax
|
inc eax
|
||||||
inc ebx
|
inc ebx
|
||||||
jmp lp
|
jmp lp
|
||||||
import_find_next:
|
import_find_next:
|
||||||
pop eax
|
pop eax
|
||||||
add edx, 8
|
add edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию
|
||||||
jmp import_find
|
jmp import_find
|
||||||
import_found:
|
import_found:
|
||||||
pop eax
|
pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек
|
||||||
mov eax, [ds:edx+4]
|
mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке)
|
||||||
mov [esi-4], eax
|
mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd
|
||||||
pop edx
|
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
|
jmp import_loop
|
||||||
import_not_found:
|
import_not_found:
|
||||||
add esp,4
|
add esp,4
|
||||||
show_error_window err_message_import__, head_f_i__ ;show error message /create window
|
show_error_window err_message_import__, head_f_i__ ;show error message /create window
|
||||||
jmp e.exit
|
jmp e.exit
|
||||||
import_done:
|
import_done:
|
||||||
xor eax,eax
|
xor eax,eax ;=0 все загрузилось удачно
|
||||||
e.exit:
|
e.exit:
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ otst_panel_left equ 265
|
|||||||
include 'tile_fun.inc'
|
include 'tile_fun.inc'
|
||||||
include 'pl_import.inc'
|
include 'pl_import.inc'
|
||||||
|
|
||||||
@use_library
|
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
|
||||||
|
|
||||||
struct FileInfoBlock
|
struct FileInfoBlock
|
||||||
Function dd ?
|
Function dd ?
|
||||||
@ -80,9 +80,6 @@ start:
|
|||||||
mcall -1 ;exit not correct
|
mcall -1 ;exit not correct
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
stdcall dll.Init,dword[lib_init]
|
|
||||||
stdcall dll.Init,dword[lib_init_ini]
|
|
||||||
|
|
||||||
copy_path ini_name,sys_path,file_name,0x0
|
copy_path ini_name,sys_path,file_name,0x0
|
||||||
stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache
|
stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache
|
||||||
stdcall [str_len],dword[edit1.text],dword[edit1.max]
|
stdcall [str_len],dword[edit1.text],dword[edit1.max]
|
||||||
|
Loading…
Reference in New Issue
Block a user