use @notify

new macros 'notify_window_run'

git-svn-id: svn://kolibrios.org@3374 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2013-03-13 14:37:54 +00:00
parent 26657b44a4
commit a2d96a4749

View File

@ -1,4 +1,6 @@
;08.05.2009 - bugfix ;13.03.2013 - use @notify
;08.06.2010 - new macros @use_library_mem
;08.05.2009 - bugfix
;14.04.2009 - a macros for code load library the box_lib.obj from '/sys/lib/' or current dirrectory. ;14.04.2009 - a macros for code load library the box_lib.obj from '/sys/lib/' or current dirrectory.
; The macros for load any library/libraries: ; The macros for load any library/libraries:
; Copyright (c) 2009, <Lrz> ; Copyright (c) 2009, <Lrz>
@ -27,9 +29,9 @@
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;***************************************************************************** ;*****************************************************************************
; This macros based on source code: ; This macros based on source code:
; <Lrz> - Alexey Teplov / Алексей Теплов ; <Lrz> - Alexey Teplov / €«¥ªá¥© ’¥¯«®¢
; Mario79, Mario - Marat Zakiyanov / Марат Закиянов ; Mario79, Mario - Marat Zakiyanov / Œ à â ‡ ª¨ï­®¢
; Diamondz - Evgeny Grechnikov / Евгений Гречников ; Diamondz - Evgeny Grechnikov / …¢£¥­¨© ƒà¥ç­¨ª®¢
;------------------------ ;------------------------
; DESCRIPTION ; DESCRIPTION
; Macro load_library ; Macro load_library
@ -62,13 +64,13 @@
;- Well, if you get ;- Well, if you get
; ;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные ;DATA ¤ ­­ë¥
;Всегда соблюдать последовательность в имени. ;‚ᥣ¤  ᮡ«î¤ âì ¯®á«¥¤®¢ â¥«ì­®áâì ¢ ¨¬¥­¨.
;system_path__ db '/sys/lib/' ;system_path__ db '/sys/lib/'
;library_name__ db 'box_lib.obj',0 ;library_name__ db 'box_lib.obj',0
; Если есть желание разъединить, то нужно использовать следующию конструкцию ; …᫨ ¥áâì ¦¥« ­¨¥ ࠧꥤ¨­¨âì, â® ­ã¦­® ¨á¯®«ì§®¢ âì á«¥¤ãîé¨î ª®­áâàãªæ¨î
;system_path__ db '/sys/lib/box_lib.obj',0 ;system_path__ db '/sys/lib/box_lib.obj',0
;... любая последовательность других команд и определений. ;... «î¡ ï ¯®á«¥¤®¢ â¥«ì­®áâì ¤àã£¨å ª®¬ ­¤ ¨ ®¯à¥¤¥«¥­¨©.
;library_name__ db 'box_lib.obj',0 ;library_name__ db 'box_lib.obj',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -112,158 +114,25 @@
macro @use_library macro @use_library
{ {
local __sc
local lp local lp
local lp1 local lp1
local correction local file_name
local exit_
library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init' library_fun_memory_alloc equ 0 ;­¥ ¨á¯®«ì§®¢ âì ¢ ¬ ªà®á å ¯à®¢¥àªã ­  ä㭪樨 'lib_init'
err_message1 equ dword [esp+8]
head1 equ dword [esp+4]
__sc.frame equ dword [__sc+0]
__sc.grab equ dword [__sc+4]
__sc.grab_button equ dword [__sc+8]
__sc.grab_button_text equ dword [__sc+12]
__sc.grab_text equ dword [__sc+16]
__sc.work equ dword [__sc+20]
__sc.work_button equ dword [__sc+24]
__sc.work_button_text equ dword [__sc+28]
__sc.work_text equ dword [__sc+32]
__sc.work_graph equ dword [__sc+36]
;;;;;;;;;;;CALC WIDTH & HIGHT WINDOW & CENTER MONITOR POSITION;;;;;;;;;;
show_err_:
;check memory
push dword [arrea_xx]
pop eax
test eax,eax
jnz @f
mcall 68,11
mcall 68,12,4096
push eax
pop dword [arrea_xx]
push head1
pop dword[eax]
push 0x0
pop dword[eax+4]
@@:
mov eax,48 ;get system color
mov ebx,3
mov ecx,__sc
mov edx,sizeof.system_colors
mcall
;-----------------------------------
xor eax,eax
mov esi,err_message1
mov ecx,30
align 4
lp: add ecx,7
lodsb
test eax,eax
jnz lp
push dword [arrea_xx]
pop ebp
align 4 align 4
@@: add ebp,4 arrea_xx dd 0
mov eax,dword [ebp] file_name db '/rd/1/@notify',0
test eax,eax
jnz @b
push err_message1
pop dword[ebp]
mov dword [ebp+4],eax
mcall 48,5 ;get system window
cmp word[on_x],cx
jae @f; не нужно обновлять
sub eax,ecx
shl eax,15
mov ax,cx
mov dword [on_x],eax
@@:
add word [on_y],12
sub bx,word [on_y]
shl ebx,15
mov bx,word [on_y]
mov dword [on_y],ebx
ret
;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;;
align 4
start__:
mcall 40,0x5 ;set mask on events rewraw window and get id button.
.red_win:
;draw_window:
mcall 12,1
xor eax,eax
mov ebp,dword [arrea_xx] ; set point
mov ebx,dword [on_x]
mov ecx,dword [on_y]
mov edx,__sc.work
or edx,0x33000000
mov esi,__sc.grab_text
xor edi,edi
mov edi,dword [ebp] ;head1
mcall
mov ebx,(10*65536+25-12)
add ebp,4 ;inc index
@@:
mov eax,4
add bx,12
mov ecx,__sc.grab_text
or ecx,0x90000000
mov edx,dword [ebp] ;err_message1
mcall
add ebp,4 ;inc index
mov eax,dword [ebp]
test eax,eax
jnz @b
mcall 12,2
align 4
.still: ;main loop
mcall 10 ;wait event
dec eax
jz .red_win
sub eax,2
jnz .still ;go to main loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.button:
mcall 17 ;get id button
test ah,ah ;if in ah 0, then go to still
jz .still
mcall -1
ret
align 4 align 4
__sc system_colors run_notify_struct:
on_x dd 0x0 .Function dd 7
on_y dd 0x0000004E .Position dd 0
arrea_xx dd 0x0 .Flags dd ?
rb 0x50 .Count dd 0
end_tr: .Buffer dd 0
db 0
.FileName dd file_name
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
@library_name equ dword [esp+16] @library_name equ dword [esp+16]
@ -368,7 +237,7 @@ exit:
test eax,eax test eax,eax
jz @f jz @f
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
or eax,-1 or eax,-1
@@: @@:
@ -408,7 +277,7 @@ exit:
test eax,eax test eax,eax
jz @f jz @f
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
or eax,-1 or eax,-1
@@: @@:
@ -481,7 +350,7 @@ lp2:
test eax,eax test eax,eax
jz @f jz @f
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
or eax,-1 or eax,-1
jmp exit_lp2 jmp exit_lp2
@ -561,7 +430,7 @@ lp2:
test eax,eax test eax,eax
jz @f jz @f
mcall 51,1,start__,end_tr ; создаем новый поток по шаблону notify_window_run [arrea_xx] ; ᮧ¤ ¥¬ ®ª­® @notify
or eax,-1 or eax,-1
jmp exit_lp2 jmp exit_lp2
@ -587,22 +456,57 @@ macro copy_path lib_name,dir_path,lib_path,point_dir_name
popad ;restore all registers popad ;restore all registers
} }
; £®â®¢¨¬ ⥪áâ ¤«ï ¯®ª §  ç¥à¥§ @notify:
; 1) ¢ë¤¥«ï¥¬ ¯ ¬ïâì ¢ [arrea_xx]
; 2) ª®¯¨à㥬 err_message ¨ head ¢ [arrea_xx]
macro show_error_window err_message, head macro show_error_window err_message, head
{ pushad ;save all registers {
push dword err_message local lp0
push dword head local lp1
call show_err_ pushad
mcall 68,11
mcall 68,12,4096
push eax
pop dword [arrea_xx]
add esp,8 mov edi,eax
popad ;restore all registers mov esi,dword head
or eax,-1 ;увы cld
align 4
lp0:
movsb
cmp byte[esi],0
jne lp0
mov word[edi],'. '
add edi,2
mov esi,dword err_message
align 4
lp1:
movsb
cmp byte[esi],0
jne lp1
mov byte[edi],0
popad
or eax,-1 ;ã¢ë
}
; ¢ª«îç ¥¬ ¯®ª § á®®¡é¥­¨ï ç¥à¥§ @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
} }
;входные параметры: ;¢å®¤­ë¥ ¯ à ¬¥âàë:
;eax - адрес библиотеки в памяти ;eax -  ¤à¥á ¡¨¡«¨®â¥ª¨ ¢ ¯ ¬ïâ¨
;myimport - импортируемые функции ;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
@ -619,42 +523,42 @@ local import_not_found
mov edx, eax mov edx, eax
mov esi,myimport mov esi,myimport
import_loop: import_loop:
lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции lodsd ;mov eax,dword[esi] ;add esi,4 ;¯®«ãç ¥¬ ¢ eax 㪠§ â¥«ì ­  ¨¬ï ¨¬¯®àâ¨à㥬®© ä㭪樨
test eax, eax test eax, eax
jz import_done ;если указатель на имя функции = 0 (в пользовательской программе) 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 ;если указатель на имя функции = 0 (в библиотеке) jz import_not_found ;¥á«¨ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 = 0 (¢ ¡¨¡«¨®â¥ª¥)
push eax ;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 ;если названия совпали, и уже конец строки (cl=0) 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 ;8 = 4 байта указатель на название и 4 байта указатель на функцию add edx, 8 ;8 = 4 ¡ ©â  㪠§ â¥«ì ­  ­ §¢ ­¨¥ ¨ 4 ¡ ©â  㪠§ â¥«ì ­  äã­ªæ¨î
jmp import_find jmp import_find
import_found: import_found:
pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек pop ebx ;¢®áâ ­ ¢«¨¢ ¥¬ 㪠§ â¥«ì ­  ¨¬ï ä㭪樨 (ª®â®àë© ¡ë« ¢ eax) ¨ ®á¢®¡®¦¤ ¥¬ á⥪
mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке) mov eax, [ds:edx+4] ;eax = 㪠§ â¥«ì ­  äã­ªæ¨î (¢ ¡¨¡«¨®â¥ª¥)
mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd mov [esi-4], eax ;ª®¯¨à㥬 㪠§ â¥«ì (­  äã­ªæ¨î) ¢ ¯à®£à ¬¬ã, -4 áâ ¢¨¬ ¯®â®¬ã çâ® esi ¡ë«® ᤢ¨­ãâ® ª®¬ ­¤®© lodsd
pop edx ;устанавливаем edx на начало библиотечных функций pop edx ;ãáâ ­ ¢«¨¢ ¥¬ edx ­  ­ ç «® ¡¨¡«¨®â¥ç­ëå ä㭪権
;--- проверяем совпадает ли имя экспортированной функции с 'lib_init' ;--- ¯à®¢¥à塞 ᮢ¯ ¤ ¥â «¨ ¨¬ï íªá¯®àâ¨à®¢ ­­®© ä㭪樨 á 'lib_init'
if library_fun_memory_alloc eq 0 if library_fun_memory_alloc eq 0
else else
cmp dword[ebx],'lib_' cmp dword[ebx],'lib_'
jne import_loop jne import_loop
cmp dword[ebx+4],'init' cmp dword[ebx+4],'init'
jne import_loop jne import_loop
;--- если имя функции совпало с 'lib_init' попадаем сюда ;--- ¥á«¨ ¨¬ï ä㭪樨 ᮢ¯ «® á 'lib_init' ¯®¯ ¤ ¥¬ á
;подключение функций для работы с памятью ;¯®¤ª«î祭¨¥ ä㭪権 ¤«ï à ¡®âë á ¯ ¬ïâìî
;push eax ;push eax
;call dll.Init ;call dll.Init
pushad pushad
@ -672,18 +576,18 @@ import_not_found:
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 ;=0 все загрузилось удачно xor eax,eax ;=0 ¢á¥ § £à㧨«®áì 㤠筮
e.exit: e.exit:
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
} }
ll_struc_size = 48;($-library_name__) ; constant size of struct ll_struc_size = 48;($-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 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_name__ dd library_name__ ; ¨¬ï § £à㦠¥¬®© ¡¨¡«¨®â¥ª¨
.cur_dir_path__ dd cur_dir_path__ ; указатель на буфер в котором содержиться путь от куда была запущена программа .cur_dir_path__ dd cur_dir_path__ ; 㪠§ â¥«ì ­  ¡ãä¥à ¢ ª®â®à®¬ ᮤ¥à¦¨âìáï ¯ãâì ®â ªã¤  ¡ë«  § ¯ã饭  ¯à®£à ¬¬ 
.library_path__ dd library_path__ ; указатель на буфер в котором будет софоримирован путь к библиотеки, если нужно вычислить путь до либы с места запуска программы, обычно нужно, в случаях, если либа расположена в той же папке .library_path__ dd library_path__ ; 㪠§ â¥«ì ­  ¡ãä¥à ¢ ª®â®à®¬ ¡ã¤¥â á®ä®à¨¬¨à®¢ ­ ¯ãâì ª ¡¨¡«¨®â¥ª¨, ¥á«¨ ­ã¦­® ¢ëç¨á«¨âì ¯ãâì ¤® «¨¡ë á ¬¥áâ  § ¯ã᪠ ¯à®£à ¬¬ë, ®¡ëç­® ­ã¦­®, ¢ á«ãç ïå, ¥á«¨ «¨¡  à á¯®«®¦¥­  ¢ ⮩ ¦¥ ¯ ¯ª¥
.complete_path dd system_path__ ; путь который четко содержит путь .complete_path dd system_path__ ; ¯ãâì ª®â®àë© ç¥âª® ᮤ¥à¦¨â ¯ãâì
.err_message_found_lib__ dd err_message_found_lib__ .err_message_found_lib__ dd err_message_found_lib__
.head_f_l__ dd head_f_l__ .head_f_l__ dd head_f_l__
@ -693,7 +597,7 @@ struc l_libs library_name__, cur_dir_path__, library_path__, system_path__, err_
if point_dir_name eq if point_dir_name eq
.point_dir_name__ dd 0x0 .point_dir_name__ dd 0x0
else else
.point_dir_name__ dd point_dir_name ; имя вложенной дирректории в кторой храняться подгружаемые модули. .point_dir_name__ dd point_dir_name ; ¨¬ï ¢«®¦¥­­®© ¤¨à४â®à¨¨ ¢ ªâ®à®© åà ­ïâìáï ¯®¤£à㦠¥¬ë¥ ¬®¤ã«¨.
end if end if
.adr_load_lib dd 0x0 .adr_load_lib dd 0x0
.status_lib dd 0x0 ;status of load library .status_lib dd 0x0 ;status of load library