Subversion Repositories Kolibri OS

Rev

Rev 1204 | Rev 3374 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1108 Lrz 1
;08.05.2009 - bugfix
2
;14.04.2009 - a macros for code load library the box_lib.obj from '/sys/lib/' or current dirrectory.
3
; The macros for load any library/libraries:
4
; Copyright (c) 2009, 
5
; All rights reserved.
6
;
7
; Redistribution and use in source and binary forms, with or without
8
; modification, are permitted provided that the following conditions are met:
9
;       * Redistributions of source code must retain the above copyright
10
;       notice, this list of conditions and the following disclaimer.
11
;       * Redistributions in binary form must reproduce the above copyright
12
;       notice, this list of conditions and the following disclaimer in the
13
;       documentation and/or other materials provided with the distribution.
14
;       * Neither the name of the  nor the
15
;       names of its contributors may be used to endorse or promote products
16
;       derived from this software without specific prior written permission.
17
;
18
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov aka  ''AS IS'' AND ANY
19
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
22
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
;*****************************************************************************
29
; This macros based on source code:
30
;  - Alexey Teplov / Алексей Теплов
31
; Mario79, Mario - Marat Zakiyanov / Марат Закиянов
32
; Diamondz - Evgeny Grechnikov / Евгений Гречников
33
;------------------------
34
; DESCRIPTION
35
; Macro load_library
36
; Logick of work.
37
; A first time we must to check system path, where I belive find a system library. System path is "/sys/lib/".
38
; If I cannot found my library, i must to check second way. Second way is current dirrectory.
39
; If we cannot load library, we must show the error message:
40
; "I'm sorry,the programm cannot found system library box_lib.obj."
41
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
42
;
43
;
44
;---------------------------------------------------------------------
45
; Macro sys_load_library
46
; A first time we must to check own path in current dirrectory the program, where I belive find a system library.
47
; If I cannot found my library, i must to check second way. Second way is system path a "/sys/lib/".
48
; If we cannot load library, we must show the error message:
49
; "I'm sorry,the programm cannot found system library box_lib.obj."
50
; "The find was make on 2 ways: /sys/lib/ and current dirrectory."
51
;
52
;---------------------------------------------------------------------
53
; How can I use it?
54
;---------------------------------------------------------------------
55
;-Example using single load library
56
;-universal load library/librarys
1127 Lrz 57
;load_library  library_name__, cur_dir_path__, library_path__, system_path__, \
58
;err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__
1108 Lrz 59
;-if return code =-1 then exit, else normally work
60
;        cmp     eax,-1
61
;        jz      exit
62
;- Well, if you get
63
;
64
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
65
;DATA данные
66
;Всегда соблюдать последовательность в имени.
1127 Lrz 67
;system_path__      db '/sys/lib/'
68
;library_name__     db 'box_lib.obj',0
1108 Lrz 69
; Если есть желание разъединить, то нужно использовать следующию конструкцию
1127 Lrz 70
;system_path__      db '/sys/lib/box_lib.obj',0
1108 Lrz 71
;... любая последовательность других команд и определений.
1127 Lrz 72
;library_name__     db 'box_lib.obj',0
1108 Lrz 73
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74
 
1127 Lrz 75
;err_message_found_lib__   db 'Sorry I cannot found library box_lib.obj',0
76
;head_f_i__:
77
;head_f_l__        db 'System error',0
78
;err_message_import__      db 'Error on load import library box_lib.obj',0
1108 Lrz 79
 
80
;myimport:
81
;
82
;edit_box_draw   dd      aEdit_box_draw
83
;edit_box_key    dd      aEdit_box_key
84
;edit_box_mouse  dd      aEdit_box_mouse
85
;version_ed      dd      aVersion_ed
86
;
87
;check_box_draw  dd      aCheck_box_draw
88
;check_box_mouse dd      aCheck_box_mouse
89
;version_ch      dd      aVersion_ch
90
;
91
;option_box_draw  dd      aOption_box_draw
92
;option_box_mouse dd      aOption_box_mouse
93
;version_op       dd      aVersion_op
94
 
95
;                dd      0
96
;                dd      0
97
;
98
;aEdit_box_draw  db 'edit_box',0
99
;aEdit_box_key   db 'edit_box_key',0
100
;aEdit_box_mouse db 'edit_box_mouse',0
101
;aVersion_ed     db 'version_ed',0
102
 
103
;aCheck_box_draw  db 'check_box_draw',0
104
;aCheck_box_mouse db 'check_box_mouse',0
105
;aVersion_ch      db 'version_ch',0
106
 
107
;aOption_box_draw  db 'option_box_draw',0
108
;aOption_box_mouse db 'option_box_mouse',0
109
;aVersion_op       db 'version_op',0
110
 
111
;---------------------------------------------------------------------
112
macro @use_library
113
{
1127 Lrz 114
 
1108 Lrz 115
local __sc
116
local lp
1127 Lrz 117
local lp1
1108 Lrz 118
local correction
1127 Lrz 119
local exit_
1488 IgorA 120
 
121
library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init'
1108 Lrz 122
err_message1     equ    dword [esp+8]
123
head1            equ    dword [esp+4]
124
 
125
 
126
__sc.frame                equ  dword [__sc+0]
127
__sc.grab                 equ  dword [__sc+4]
128
__sc.grab_button          equ  dword [__sc+8]
129
__sc.grab_button_text     equ  dword [__sc+12]
130
__sc.grab_text            equ  dword [__sc+16]
131
__sc.work                 equ  dword [__sc+20]
132
__sc.work_button          equ  dword [__sc+24]
133
__sc.work_button_text     equ  dword [__sc+28]
134
__sc.work_text            equ  dword [__sc+32]
135
__sc.work_graph           equ  dword [__sc+36]
136
 
1127 Lrz 137
;;;;;;;;;;;CALC WIDTH & HIGHT WINDOW & CENTER MONITOR POSITION;;;;;;;;;;
138
show_err_:
139
;check memory
140
        push    dword [arrea_xx]
141
        pop     eax
142
        test    eax,eax
143
        jnz     @f
1108 Lrz 144
 
1127 Lrz 145
        mcall   68,11
146
        mcall   68,12,4096
147
        push    eax
148
        pop     dword [arrea_xx]
149
 
150
        push    head1
151
        pop     dword[eax]
152
 
153
        push    0x0
154
        pop     dword[eax+4]
155
 
156
@@:
1108 Lrz 157
        mov     eax,48             ;get system color
158
        mov     ebx,3
159
        mov     ecx,__sc
160
        mov     edx,sizeof.system_colors
161
        mcall
1127 Lrz 162
;-----------------------------------
1108 Lrz 163
        xor     eax,eax
164
        mov     esi,err_message1
165
        mov     ecx,30
166
align 4
1127 Lrz 167
lp:     add     ecx,7
168
        lodsb
1108 Lrz 169
        test    eax,eax
1127 Lrz 170
        jnz     lp
171
 
172
        push    dword [arrea_xx]
173
        pop     ebp
174
 
175
align 4
176
@@:     add     ebp,4
177
        mov     eax,dword [ebp]
178
 
179
        test    eax,eax
180
        jnz     @b
181
 
182
        push    err_message1
183
        pop     dword[ebp]
184
 
185
        mov     dword [ebp+4],eax
186
 
1108 Lrz 187
        mcall   48,5    ;get system window
1127 Lrz 188
        cmp     word[on_x],cx
189
        jae     @f; не нужно обновлять
190
 
1108 Lrz 191
        sub     eax,ecx
192
        shl     eax,15
193
        mov     ax,cx
1127 Lrz 194
        mov     dword [on_x],eax
1108 Lrz 195
 
1127 Lrz 196
@@:
197
        add     word [on_y],12
198
        sub     bx,word [on_y]
199
        shl     ebx,15
200
        mov     bx,word [on_y]
1108 Lrz 201
        mov     dword [on_y],ebx
202
 
1127 Lrz 203
        ret
1108 Lrz 204
 
205
 
206
;;;;;;;;;;;DRAW WINDOW;;;;;;;;;;;;;;
1127 Lrz 207
align 4
208
start__:
1108 Lrz 209
        mcall   40,0x5         ;set mask on events rewraw window and get id button.
1127 Lrz 210
.red_win:
1108 Lrz 211
;draw_window:
212
        mcall 12,1
213
 
214
        xor     eax,eax
1127 Lrz 215
        mov     ebp,dword [arrea_xx]      ; set point
1108 Lrz 216
        mov     ebx,dword [on_x]
217
        mov     ecx,dword [on_y]
218
        mov     edx,__sc.work
219
        or      edx,0x33000000
220
        mov     esi,__sc.grab_text
1127 Lrz 221
        xor     edi,edi
222
        mov     edi,dword [ebp]         ;head1
1108 Lrz 223
        mcall
224
 
1127 Lrz 225
        mov     ebx,(10*65536+25-12)
226
        add     ebp,4   ;inc index
227
 
228
@@:
1108 Lrz 229
        mov     eax,4
1127 Lrz 230
        add     bx,12
1108 Lrz 231
        mov     ecx,__sc.grab_text
232
        or      ecx,0x90000000
1127 Lrz 233
        mov     edx,dword [ebp]       ;err_message1
1108 Lrz 234
        mcall
1127 Lrz 235
 
236
        add     ebp,4   ;inc index
237
 
238
        mov     eax,dword [ebp]
239
        test    eax,eax
240
        jnz     @b
241
 
1108 Lrz 242
        mcall 12,2
243
align 4
1127 Lrz 244
 
245
.still:                          ;main loop
1108 Lrz 246
        mcall   10              ;wait event
247
        dec  eax
1127 Lrz 248
        jz   .red_win
1108 Lrz 249
        sub  eax,2
1127 Lrz 250
        jnz  .still   ;go to main loop
1108 Lrz 251
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1127 Lrz 252
.button:
1108 Lrz 253
        mcall   17      ;get id button
254
        test    ah,ah      ;if in ah 0, then go to still
1127 Lrz 255
        jz      .still
256
        mcall   -1
1108 Lrz 257
        ret
258
 
1127 Lrz 259
align 4
260
__sc     system_colors
261
on_x     dd     0x0
262
on_y     dd     0x0000004E
263
arrea_xx dd     0x0
264
rb      0x50
265
end_tr:
266
 
1108 Lrz 267
;---------------------------------------------------------------------
268
 
1204 Lrz 269
@library_name     equ    dword [esp+16]
270
@cur_dir_path     equ    dword [esp+12]
271
@library_path     equ    dword [esp+8]
272
@point_dir_name   equ    dword [esp+4]
273
 
1108 Lrz 274
align 4
275
@copy_path:
1204 Lrz 276
;        mov     ebx,@library_name
1108 Lrz 277
        mov     esi,@cur_dir_path
278
        mov     edi,@library_path
279
 
280
        xor     eax,eax
281
        cld
1204 Lrz 282
align 4
1108 Lrz 283
.lp1:
284
        lodsb
285
        stosb
286
        test    eax,eax
287
        jnz     .lp1
288
        mov     esi,edi
289
 
290
        std
1204 Lrz 291
align 4
1108 Lrz 292
.lp2:
293
        lodsb
294
        cmp     al,'/'
295
        jnz     .lp2
296
        mov     edi,esi
1204 Lrz 297
 
1108 Lrz 298
        add     edi,2
1204 Lrz 299
        cld
300
;	mov     esi,@library_name
1108 Lrz 301
 
1204 Lrz 302
	mov	esi,@point_dir_name
303
	test	esi,esi
304
	jz      .str_lp4
1108 Lrz 305
 
1204 Lrz 306
align 4
1108 Lrz 307
.lp3:
308
        lodsb
309
        stosb
310
        test    eax,eax
311
        jnz     .lp3
1204 Lrz 312
 
313
 
314
	dec 	edi
315
.str_lp4:
316
	mov     esi,@library_name
317
align 4
318
.lp4:
319
        lodsb
320
        stosb
321
        test    eax,eax
322
        jnz     .lp4
1108 Lrz 323
;---------------------------------------------------------------------
1127 Lrz 324
        ret
1108 Lrz 325
}
326
 
327
 
328
 
1488 IgorA 329
macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load
330
{
331
@use_library
332
library_fun_memory_alloc equ mem_alloc
333
library_fun_memory_free equ mem_free
334
library_fun_memory_realloc equ mem_realloc
335
library_fun_dll_load equ dll_load
336
}
337
 
338
 
1204 Lrz 339
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__
1108 Lrz 340
{
341
local end_steep
342
local exit
343
;---------------------------------------------------------------------
344
; loading Box_Lib library
345
 
1127 Lrz 346
        mcall   68,19,system_path__   ; load of sys directory
1108 Lrz 347
        test    eax,eax
348
        jnz     end_steep
349
 
1204 Lrz 350
if point_dir_name__ eq
351
  copy_path   library_name__, cur_dir_path__, library_path__,0x0
352
else
353
  copy_path   library_name__, cur_dir_path__, library_path__,point_dir_name__    ;the macros making way /current pach a program/+ name system library
354
end if
1108 Lrz 355
 
1127 Lrz 356
        mcall   68,19,library_path__ ; load of alternative
1108 Lrz 357
        test    eax,eax
358
        jnz     end_steep
1127 Lrz 359
        show_error_window  err_message_found_lib__, head_f_l__    ;show error message /create window
1108 Lrz 360
        jmp     exit
361
 
362
 
363
align 4
364
end_steep:
365
 
1127 Lrz 366
        import_boxlib myimport, err_message_import__, head_f_i__  ;import
1108 Lrz 367
exit:
1127 Lrz 368
        test    eax,eax
369
        jz      @f
370
 
371
        mcall   51,1,start__,end_tr            ; создаем новый поток по шаблону
372
        or      eax,-1
373
@@:
374
 
1108 Lrz 375
;---------------------------------------------------------------------
376
}
377
 
378
 
1204 Lrz 379
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__
1108 Lrz 380
{
381
local end_steep
382
local exit
383
;---------------------------------------------------------------------
384
; loading Box_Lib library
385
 
1204 Lrz 386
if point_dir_name__ eq
387
  copy_path   library_name__, cur_dir_path__, library_path__,0x0
388
else
389
  copy_path   library_name__, cur_dir_path__, library_path__,point_dir_name__    ;the macros making way /current pach a program/+ name system library
390
end if
1108 Lrz 391
 
1127 Lrz 392
        mcall   68,19,library_path__ ; load of alternative
1108 Lrz 393
        test    eax,eax
394
        jnz     end_steep
395
 
1127 Lrz 396
        mcall   68,19,system_path__ ; load of sys directory
1108 Lrz 397
        test    eax,eax
398
        jnz     end_steep
399
 
1127 Lrz 400
        show_error_window  err_message_found_lib__, head_f_l__    ;show error message /create window
1108 Lrz 401
        jmp     exit
402
 
403
align 4
404
end_steep:
405
 
1127 Lrz 406
        import_boxlib myimport, err_message_import__, head_f_i__  ;import
1108 Lrz 407
exit:
1127 Lrz 408
        test    eax,eax
409
        jz      @f
410
 
411
        mcall   51,1,start__,end_tr            ; создаем новый поток по шаблону
412
        or      eax,-1
413
@@:
414
 
1108 Lrz 415
;---------------------------------------------------------------------
416
}
417
macro sys_load_libraries _start,_end
418
{
1127 Lrz 419
local exit_lp2
420
local lp2
1108 Lrz 421
local lp
422
local end_steep
423
local next
424
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1127 Lrz 425
library_name__            equ [ebp]
426
cur_dir_path__            equ [ebp+4]
427
library_path__            equ [ebp+8]
428
system_path__             equ [ebp+12]
429
err_message_found_lib__   equ [ebp+16]
430
head_f_l__                equ [ebp+20]
1204 Lrz 431
my_import                 equ [ebp+24]
1127 Lrz 432
err_message_import__      equ [ebp+28]
433
head_f_i__                equ [ebp+32]
1204 Lrz 434
point_dir_name__          equ [ebp+36]
435
adr_load_lib              equ dword [ebp+40]
436
status_lib                equ dword [ebp+44]
1108 Lrz 437
 
438
        mov     ebp,_start
439
        mov     ecx,((_end-_start)/ll_struc_size)
440
 
441
align 4
442
lp:     push    ecx
1127 Lrz 443
        mcall   68,19,system_path__   ; load of sys directory
1108 Lrz 444
        test    eax,eax
445
        jnz     end_steep
446
 
1204 Lrz 447
        copy_path  library_name__, cur_dir_path__, library_path__,point_dir_name__     ;the macros making way /current pach a program/+ name system library
1108 Lrz 448
 
1127 Lrz 449
        mcall   68,19,library_path__ ; load of alternative
1108 Lrz 450
        test    eax,eax
451
        jnz     end_steep
452
 
453
        or      status_lib,0x1          ; status of code - enable error - not found library
454
 
1204 Lrz 455
        show_error_window  err_message_found_lib__, head_f_l__,    ;show error message /create window
1108 Lrz 456
        jmp      next
457
 
458
align 4
459
end_steep:
460
        mov     adr_load_lib,eax        ;save adr lib in memory
1127 Lrz 461
        import_boxlib my_import, err_message_import__, head_f_i__  ;import
1108 Lrz 462
 
463
        test    eax,eax
464
        jz      next
465
 
466
        or      status_lib,0x2          ; status of code - enable error - import error
467
 
468
next:
469
        pop     ecx
470
        add     ebp,ll_struc_size
471
        dec     ecx
472
        jnz     lp
1127 Lrz 473
 
474
;----------------------------------
475
        mov     ebp,_start
476
        mov     ecx,((_end-_start)/ll_struc_size)
477
 
478
align 4
479
lp2:
480
        mov     eax,status_lib
481
        test    eax,eax
482
        jz      @f
483
 
484
        mcall   51,1,start__,end_tr            ; создаем новый поток по шаблону
485
        or      eax,-1
486
        jmp     exit_lp2
487
 
488
@@:
489
        add     ebp,ll_struc_size
490
        dec     ecx
491
        jnz     lp2
492
exit_lp2:
1108 Lrz 493
}
494
 
495
macro load_libraries _start,_end
496
{
1127 Lrz 497
local lp2
498
local exit_lp2
1108 Lrz 499
local lp
500
local end_steep
501
local next
502
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1127 Lrz 503
library_name__            equ [ebp]
504
cur_dir_path__            equ [ebp+4]
505
library_path__            equ [ebp+8]
506
system_path__             equ [ebp+12]
507
err_message_found_lib__   equ [ebp+16]
508
head_f_l__                equ [ebp+20]
1204 Lrz 509
my_import                 equ [ebp+24]
1127 Lrz 510
err_message_import__      equ [ebp+28]
511
head_f_i__                equ [ebp+32]
1204 Lrz 512
point_dir_name__          equ [ebp+36]
513
adr_load_lib              equ dword [ebp+40]
514
status_lib                equ dword [ebp+44]
1108 Lrz 515
 
516
        mov     ebp,_start
517
        mov     ecx,((_end-_start)/ll_struc_size)
518
 
519
align 4
520
lp:     push    ecx
521
 
1204 Lrz 522
        copy_path    library_name__, cur_dir_path__, library_path__,point_dir_name__   ;the macros making way /current pach a program/+ name system library
1108 Lrz 523
 
1127 Lrz 524
        mcall   68,19,library_path__  ; load of alternative
1108 Lrz 525
        test    eax,eax
526
        jnz     end_steep
527
 
1127 Lrz 528
        mcall   68,19,system_path__   ; load of sys directory
1108 Lrz 529
        test    eax,eax
530
        jnz     end_steep
531
 
532
        or      status_lib,0x1          ; status of code - enable error - not found library
533
 
1127 Lrz 534
        show_error_window  err_message_found_lib__, head_f_l__    ;show error message /create window
1108 Lrz 535
        jmp      next
536
 
537
align 4
538
end_steep:
539
        mov     adr_load_lib,eax        ;save adr lib in memory
540
 
1127 Lrz 541
        import_boxlib my_import, err_message_import__, head_f_i__  ;import
1108 Lrz 542
 
543
        test    eax,eax
544
        jz      next
545
 
546
        or      status_lib,0x2          ; status of code - enable error - import error
547
 
548
next:
549
        pop     ecx
550
        add     ebp,ll_struc_size
551
        dec     ecx
552
        jnz     lp
1127 Lrz 553
 
554
;-----------------------------------------------
555
        mov     ebp,_start
556
        mov     ecx,((_end-_start)/ll_struc_size)
557
 
558
align 4
559
lp2:
560
        mov     eax,status_lib
561
        test    eax,eax
562
        jz      @f
563
 
564
        mcall   51,1,start__,end_tr            ; создаем новый поток по шаблону
565
        or      eax,-1
566
        jmp     exit_lp2
567
 
568
@@:
569
        add     ebp,ll_struc_size
570
        dec     ecx
571
        jnz     lp2
572
exit_lp2:
573
 
1108 Lrz 574
}
575
 
576
 
1204 Lrz 577
macro copy_path lib_name,dir_path,lib_path,point_dir_name
1108 Lrz 578
{
579
        pushad  ;save all registers
580
        push    dword lib_name
581
        push    dword dir_path
582
        push    dword lib_path
1204 Lrz 583
        push	dword point_dir_name
1108 Lrz 584
        call    @copy_path
585
 
1204 Lrz 586
        add     esp,16
1108 Lrz 587
        popad   ;restore all registers
588
}
589
 
590
macro show_error_window  err_message, head
591
{       pushad  ;save all registers
592
        push    dword err_message
593
        push    dword head
594
 
595
        call    show_err_
596
 
597
        add     esp,8
598
        popad   ;restore all registers
1127 Lrz 599
        or      eax,-1  ;увы
1108 Lrz 600
}
601
 
602
 
1488 IgorA 603
;входные параметры:
604
;eax - адрес библиотеки в памяти
605
;myimport - импортируемые функции
1127 Lrz 606
macro import_boxlib myimport, err_message_import__, head_f_i__
1108 Lrz 607
{
608
local import_loop
609
local import_find
610
local lp
611
local import_find_next
612
local import_found
613
local import_done
614
local exit
615
local e.exit
616
local import_not_found
617
; initialize import
618
 
619
        mov     edx, eax
620
        mov     esi,myimport
621
import_loop:
1488 IgorA 622
        lodsd	;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции
1108 Lrz 623
        test    eax, eax
1488 IgorA 624
        jz      import_done ;если указатель на имя функции = 0 (в пользовательской программе)
625
        push    edx ;сохраняем начало библиотечных указателей на функции
1108 Lrz 626
import_find:
627
        mov     ebx, [ds:edx]
628
        test    ebx, ebx
1488 IgorA 629
        jz      import_not_found ;если указатель на имя функции = 0 (в библиотеке)
630
        push    eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе)
1108 Lrz 631
lp:
632
        mov     cl, [ds:eax]
1488 IgorA 633
        cmp     cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе
634
        jnz     import_find_next ;если названия не совпали
1108 Lrz 635
        test    cl, cl
1488 IgorA 636
        jz      import_found ;если названия совпали, и уже конец строки (cl=0)
1108 Lrz 637
        inc     eax
638
        inc     ebx
639
        jmp     lp
640
import_find_next:
641
        pop     eax
1488 IgorA 642
        add     edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию
1108 Lrz 643
        jmp     import_find
644
import_found:
1488 IgorA 645
        pop     ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек
646
        mov     eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке)
647
        mov     [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd
648
        pop     edx ;устанавливаем edx на начало библиотечных функций
649
;--- проверяем совпадает ли имя экспортированной функции с 'lib_init'
650
if library_fun_memory_alloc eq 0
651
else
652
		cmp dword[ebx],'lib_'
653
		jne		import_loop
654
		cmp dword[ebx+4],'init'
655
		jne		import_loop
656
;--- если имя функции совпало с 'lib_init' попадаем сюда
657
		;подключение функций для работы с памятью
658
		;push eax
659
		;call dll.Init
660
		pushad
661
		mov esi,eax
662
		mov	eax,library_fun_memory_alloc
663
		mov	ebx,library_fun_memory_free
664
		mov	ecx,library_fun_memory_realloc
665
		mov	edx,library_fun_dll_load
666
		call dword esi
667
		popad
668
end if
1108 Lrz 669
        jmp     import_loop
670
import_not_found:
671
        add     esp,4
1127 Lrz 672
        show_error_window  err_message_import__, head_f_i__    ;show error message /create window
1108 Lrz 673
        jmp     e.exit
674
import_done:
1488 IgorA 675
        xor     eax,eax ;=0 все загрузилось удачно
1108 Lrz 676
e.exit:
677
;---------------------------------------------------------------------
678
}
1204 Lrz 679
ll_struc_size = 48;($-library_name__)    ; constant   size of struct
680
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
1108 Lrz 681
{
1127 Lrz 682
.library_name__           dd library_name__        ; имя загружаемой библиотеки
683
.cur_dir_path__           dd cur_dir_path__        ; указатель на буфер в котором содержиться путь от куда была запущена программа
684
 
685
.library_path__           dd library_path__        ; указатель на буфер в котором будет софоримирован путь к библиотеки, если нужно вычислить путь до либы с места запуска программы, обычно нужно, в случаях, если либа расположена в той же папке
1204 Lrz 686
.complete_path            dd system_path__         ; путь который четко содержит путь
1127 Lrz 687
 
688
.err_message_found_lib__  dd err_message_found_lib__
689
.head_f_l__               dd head_f_l__
1204 Lrz 690
.my_import                dd my_import
1127 Lrz 691
.err_message_import__     dd err_message_import__
692
.head_f_i__               dd head_f_i__
1204 Lrz 693
if point_dir_name eq
694
.point_dir_name__	dd 0x0
695
else
696
.point_dir_name__	dd point_dir_name	   ; имя вложенной дирректории в кторой храняться подгружаемые модули.
697
end if
1127 Lrz 698
.adr_load_lib           dd 0x0
699
.status_lib             dd 0x0          ;status of load library
1108 Lrz 700
;
701
}