Subversion Repositories Kolibri OS

Rev

Rev 170 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
164 serge 1
 
2
;HEAP_SIZE equ 0x01000000
3
4
 
5
{  .next_block  dd ?
6
   .prev_block  dd ? ;+4
7
   .list_next   dd ? ;+8
8
   .list_prev   dd ? ;+12
9
   .base        dd ? ;+16
10
   .size        dd ? ;+20
11
   .flags       dd ? ;+24
12
   .handle      dd ? ;+28
13
}
14
15
 
16
USED_BLOCK      equ  8
17
18
 
19
  MEM_BLOCK MEM_BLOCK
20
end virtual
21
22
 
23
24
 
25
block_prev   equ MEM_BLOCK.prev_block
26
list_next    equ MEM_BLOCK.list_next
27
list_prev    equ MEM_BLOCK.list_prev
28
block_base   equ MEM_BLOCK.base
29
block_size   equ MEM_BLOCK.size
30
block_flags  equ MEM_BLOCK.flags
31
32
 
33
{          shr op, 12
34
           dec op
35
           cmp op, 63
36
           jna @f
37
           mov op, 63
38
@@:
39
}
40
41
 
42
{          mov edx, [op+list_next]
43
           mov ecx, [op+list_prev]
44
           test edx, edx
45
           jz @f
46
           mov [edx+list_prev], ecx
47
@@:
48
           test ecx, ecx
49
           jz @f
50
           mov [ecx+list_next], edx
51
@@:
52
           mov [op+list_next],0
53
           mov [op+list_prev],0
54
}
55
56
 
57
{
58
           remove_from_list op
59
60
 
61
           calc_index eax
62
           cmp [mem_block_list+eax*4], op
63
           jne @f
64
           mov [mem_block_list+eax*4], edx
65
@@:
66
           cmp [mem_block_list+eax*4], 0
67
           jne @f
68
           btr [mem_block_mask], eax
69
@@:
70
}
71
72
 
73
{
74
           remove_from_list op
75
           cmp [mem_used_list], op
76
           jne @f
77
           mov [mem_used_list], edx
78
@@:
79
}
80
81
 
82
proc init_kernel_heap
83
84
 
85
           mov edi, mem_block_list
86
           xor eax, eax
87
           cld
88
           rep stosd
89
90
 
91
           mov edi, mem_block_map
92
           not eax
93
           rep stosd
94
95
 
96
           mov [mem_block_end], mem_block_map+512
97
           mov [mem_block_arr], HEAP_BASE
98
99
 
100
           mov ecx, 32
101
           mov edx, eax
102
           mov edi, HEAP_BASE
103
104
 
105
           stdcall map_page,edi,edx,PG_SW
106
           add edi, 0x1000
107
           add edx, 0x1000
108
           dec ecx
109
           jnz .l1
110
111
 
112
           mov ebx, edi
113
           add ebx, MEM_BLOCK_SIZE
114
           xor eax, eax
115
           mov [edi+block_next], ebx
116
           mov [edi+block_prev], eax
117
           mov [edi+list_next], eax
118
           mov [edi+list_prev], eax
119
           mov [edi+block_base], HEAP_BASE
120
           mov [edi+block_size], 4096*MEM_BLOCK_SIZE
121
           mov [edi+block_flags], USED_BLOCK
122
123
 
124
           mov [ebx+block_prev], eax
125
           mov [ebx+list_next], eax
126
           mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
127
128
 
129
           sub ecx, 0x00C00000 + 4096*MEM_BLOCK_SIZE
130
           mov [ebx+block_size], ecx
131
           mov [ebx+block_flags], FREE_BLOCK
132
133
 
134
           mov [mem_block_mask+4],0x80000000
135
136
 
137
           mov [mem_block_list+63*4], ebx
138
           mov byte [mem_block_map], 0xFC
139
           ret
140
endp
141
142
 
143
proc get_block stdcall, index:dword
144
145
 
146
           mov ecx, [index]
147
           cmp ecx, eax
148
           jna @f
149
           ;cmova ecx, eax
150
           mov ecx, eax
151
@@:
152
           xor esi, esi
153
           xor ebx, ebx
154
           xor edx, edx
155
           not edx
156
157
 
158
           jb .bit_test
159
160
 
161
           add ebx, 32
162
           add esi, 4
163
164
 
165
           shl edx, cl
166
           and edx, [mem_block_mask+esi]
167
           jz .high_mask
168
           bsf eax, edx
169
           add ebx, eax
170
           mov eax, [mem_block_list+ebx*4]
171
           ret
172
173
 
174
175
 
176
           add ebx, 32
177
           test esi, 0xFFFFFFF8
178
           jnz .big_error
179
           mov edx, [mem_block_mask+esi]
180
           and edx, edx
181
           jz .high_mask
182
           bsf eax, edx
183
           add ebx, eax
184
           mov eax, [mem_block_list+ebx*4]
185
           ret
186
187
 
188
           xor eax, eax
189
           ret
190
endp
191
192
 
193
 
194
proc alloc_mem_block
195
196
 
197
           cli
198
           mov ebx, [mem_block_start]
199
           mov ecx, [mem_block_end]
200
.l1:
201
           bsf eax,[ebx];
202
           jnz found
203
           add ebx,4
204
           cmp ebx, ecx
205
           jb .l1
206
           popfd
207
           xor eax,eax
208
           ret
209
210
 
211
           btr [ebx], eax
212
           mov [mem_block_start],ebx
213
           sub ebx, mem_block_map
214
           shl ebx, 3
215
           add eax,ebx
216
           shl eax, 5
217
           add eax, [mem_block_arr]
218
           popfd
219
           ret
220
endp
221
222
 
223
           pushfd
224
           cli
225
           sub eax, [mem_block_arr]
226
           shr eax, 5
227
228
 
229
           bts [ebx], eax
230
           shr eax, 3
231
           and eax, not 3
232
           add eax, ebx
233
           cmp [mem_block_start], eax
234
           ja @f
235
           popfd
236
           ret
237
@@:
238
           mov [mem_block_start], eax
239
           popfd
240
	   ret
241
.err:
242
           xor eax, eax
243
           popfd
244
	   ret
245
endp
246
247
 
248
proc alloc_kernel_space stdcall, size:dword
249
           local block_ind:DWORD
250
251
 
252
           cli
253
254
 
255
           add eax, 0xFFF
256
           and eax, 0xFFFFF000;
257
           mov [size], eax
258
259
 
260
           sub eax, 1
261
262
 
263
264
 
265
           and eax, eax
266
           jz .error
267
268
 
269
270
 
271
           jne .error
272
273
 
274
275
 
276
           cmp eax, [size]
277
           je .m_eq_size
278
279
 
280
           and eax, eax
281
           jz .error
282
283
 
284
285
 
286
           mov eax, [edi+block_prev]
287
           mov [esi+block_prev], eax
288
           mov [edi+block_prev], esi
289
           mov [esi+list_next], 0
290
           mov [esi+list_prev], 0
291
           and eax, eax
292
           jz @f
293
           mov [eax+block_next], esi
294
@@:
295
           mov ebx, [edi+block_base]
296
           mov [esi+block_base], ebx
297
           mov edx, [size]
298
           mov [esi+block_size], edx
299
           add [edi+block_base], edx
300
           sub [edi+block_size], edx
301
302
 
303
           shr eax, 12
304
           sub eax, 1
305
           cmp eax, 63
306
           jna @f
307
           mov eax, 63
308
@@:
309
           cmp eax, [block_ind]
310
           je .m_eq_ind
311
312
 
313
           test ebx, ebx
314
           jz @f
315
316
 
317
@@:
318
           mov ecx, [block_ind]
319
           mov [mem_block_list+ecx*4], ebx
320
321
 
322
           jnz @f
323
           btr [mem_block_mask], ecx
324
@@:
325
           mov edx, [mem_block_list+eax*4]
326
           mov [edi+list_next], edx
327
           test edx, edx
328
           jz @f
329
           mov [edx+list_prev], edi
330
@@:
331
           mov [mem_block_list+eax*4], edi
332
           bts [mem_block_mask], eax
333
.m_eq_ind:
334
           mov ebx, [mem_used_list]
335
           mov [esi+list_next], ebx
336
           test ebx, ebx
337
           jz @f
338
           mov [ebx+list_prev], esi
339
@@:
340
           mov [esi+block_flags], USED_BLOCK
341
           mov [mem_used_list], esi
342
           mov eax, [esi+block_base]
343
           popfd
344
           ret
345
346
 
347
           remove_from_list edi
348
           mov [mem_block_list+ecx*4], edx
349
           and edx, edx
350
           jnz @f
351
           mov ecx, [block_ind]
352
           btr [mem_block_mask], ecx
353
@@:
354
           mov ebx, [mem_used_list]
355
           mov [edi+list_next], ebx
356
           test ebx, ebx
357
           jnz @f
358
           mov [ebx+list_prev], edi
359
@@:
360
           mov [mem_used_list], edi
361
           mov [edi+block_flags], USED_BLOCK
362
           mov eax, [edi+block_base]
363
           popfd
364
           ret
365
.error:
366
           xor eax, eax
367
           popfd
368
           ret
369
endp
370
371
 
372
proc free_kernel_space stdcall, base:dword
373
374
 
375
           mov esi, [mem_used_list]
376
@@:
377
           test esi, esi
378
           jz .fail
379
380
 
381
           je .found
382
           mov esi, [esi+list_next]
383
           jmp @b
384
.found:
385
           cmp [esi+block_flags], USED_BLOCK
386
           jne .fail
387
388
 
389
           test edi, edi
390
           jz .prev
391
392
 
393
           jne .prev
394
395
 
396
397
 
398
           mov [esi+block_next], edx
399
           test edx, edx
400
           jz @f
401
402
 
403
@@:
404
           mov ecx, [edi+block_size]
405
           add [esi+block_size], ecx
406
407
 
408
           call free_mem_block
409
.prev:
410
           mov edi, [esi+block_prev]
411
           test edi, edi
412
           jz .insert
413
414
 
415
           jne .insert
416
417
 
418
419
 
420
           mov [edi+block_next], edx
421
           test edx, edx
422
           jz @f
423
           mov [edx+block_prev], edi
424
@@:
425
           mov eax, esi
426
           call free_mem_block
427
428
 
429
           mov eax, [esi+block_size]
430
           add eax, ecx
431
           mov [edi+block_size], eax
432
433
 
434
           calc_index ecx
435
           cmp eax, ecx
436
           je .m_eq
437
438
 
439
           remove_from_list edi
440
           pop ecx
441
442
 
443
           jne @f
444
           mov [mem_block_list+ecx*4], edx
445
@@:
446
           cmp [mem_block_list+ecx*4], 0
447
           jne @f
448
           btr [mem_block_mask], ecx
449
@@:
450
           mov esi, [mem_block_list+eax*4]
451
           mov [mem_block_list+eax*4], edi
452
           mov [edi+list_next], esi
453
           test esi, esi
454
           jz @f
455
           mov [esi+list_prev], edi
456
@@:
457
           bts [mem_block_mask], eax
458
.m_eq:
459
           xor eax, eax
460
           not eax
461
           ret
462
.insert:
463
           remove_from_used esi
464
465
 
466
           calc_index eax
467
468
 
469
           mov [mem_block_list+eax*4], esi
470
           mov [esi+list_next], edi
471
           test edi, edi
472
           jz @f
473
           mov [edi+list_prev], esi
474
@@:
475
           bts [mem_block_mask], eax
476
           mov [esi+block_flags],FREE_BLOCK
477
           xor eax, eax
478
           not eax
479
           ret
480
.fail:
481
           xor eax, eax
482
           ret
483
endp
484
485
 
486
proc kernel_alloc stdcall, size:dword
487
           locals
488
             lin_addr    dd ?
489
             pages_count dd ?
490
           endl
491
492
 
493
           add eax, 0xFFF
494
           and eax, 0xFFFFF000;
495
           mov [size], eax
496
           and eax, eax
497
           jz .error
498
           mov ebx, eax
499
           shr ebx, 12
500
           mov [pages_count], ebx
501
502
 
503
           and eax, eax
504
           jz .error
505
           mov [lin_addr], eax
506
507
 
508
           mov edx, eax
509
           mov ebx, ecx
510
511
 
512
           jz .next
513
514
 
515
           push ebx
516
           stdcall alloc_pages, ebx
517
           pop ecx                   ; yes ecx!!!
518
           and eax, eax
519
           jz .error
520
521
 
522
           mov edx, [lin_addr]
523
@@:
524
           stdcall map_page,edx,edi,dword PG_SW
525
           add edx, 0x1000
526
           add edi, 0x1000
527
           dec ecx
528
           jnz @B
529
.next:
530
           mov ecx, [pages_count]
531
           and ecx, 7
532
           jz .end
533
534
 
535
           call alloc_page
536
           pop ecx
537
           test eax, eax
538
           jz .error
539
540
 
541
           add edx, 0x1000
542
           dec ecx
543
           jnz @B
544
.end:
545
           mov eax, [lin_addr]
546
           ret
547
548
 
549
           xor eax, eax
550
           ret
551
endp
552
553
 
554
proc kernel_free stdcall, base:dword
555
           locals
556
             size  dd ?
557
           endl
558
559
 
560
           mov esi, [mem_used_list]
561
@@:
562
           test esi, esi
563
           jz .fail
564
565
 
566
           je .found
567
           mov esi, [esi+list_next]
568
           jmp @b
569
.found:
570
           cmp [esi+block_flags], USED_BLOCK
571
           jne .fail
572
573
 
574
           mov [size], ecx
575
576
 
577
           test eax, eax
578
           jz .fail
579
580
 
581
           mov edi, [base]
582
583
 
584
           mov esi, edi
585
           shr edi, 10
586
           add edi, pages_tab
587
           xor edx, edx
588
.release:
589
           mov eax, [edi]
590
           test eax, 1
591
           jz .next
592
593
 
594
           mov [edi],edx
595
.next:
596
           invlpg [esi]
597
           add esi, 0x1000
598
           add edi, 4
599
           dec ecx
600
           jnz .release
601
.fail:
602
           ret
603
endp
604
605
 
606
restore block_prev
607
restore block_list
608
restore block_base
609
restore block_size
610
restore block_flags
611
612
 
613
614
 
615
proc init_heap stdcall, heap_size:dword
616
           locals
617
             tab_count dd ?
618
           endl
619
620
 
621
           and edx, edx
622
           jz .exit
623
           add edx, 4095
624
           and edx, not 4095
625
           mov [heap_size], edx
626
           add edx, 0x003FFFFF
627
           and edx, not 0x003FFFFF
628
           shr edx, 22
629
           mov [tab_count], edx
630
631
 
632
           shl ebx,8
633
           mov esi, [PROC_BASE+0x8c+ebx]
634
           add esi, 0x003FFFFF
635
           and esi, not 0x003FFFFF
636
           mov edi, esi
637
           mov [PROC_BASE+0x18+ebx], esi
638
           add esi, [heap_size]
639
           mov [PROC_BASE+0x1C+ebx], esi
640
641
 
642
           and eax, not 0xFFF
643
           stdcall map_page,[current_pdir],eax,dword PG_SW
644
645
 
646
@@:
647
           call alloc_page
648
           test eax, eax
649
           jz .exit
650
651
 
652
           add edi, 0x00400000
653
           dec edx
654
           jnz @B
655
656
 
657
           shl ecx, 12-2
658
           mov ebx,[CURRENT_TASK]
659
           shl ebx,8
660
           mov edi, [PROC_BASE+0x18+ebx]
661
           add edi, new_app_base
662
           shr edi, 10
663
           mov esi, edi
664
           add edi, pages_tab
665
           xor eax, eax
666
           cld
667
           rep stosd
668
669
 
670
671
 
672
           mov eax, ebx
673
           sub eax, 4096
674
           or ebx, FREE_BLOCK
675
           mov [pages_tab+esi], ebx
676
677
 
678
.exit:
679
           xor eax, eax
680
           ret
681
endp
682
683
 
684
proc user_alloc stdcall, alloc_size:dword
685
686
 
687
           add ecx, (4095+4096)
688
           and ecx, not 4095
689
690
 
691
           shl ebx, 8
692
           mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
693
           mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
694
           add esi, new_app_base
695
           add edi, new_app_base
696
697
 
698
           cmp esi, edi
699
           jae m_exit
700
701
 
702
           shr ebx, 12
703
           mov eax, [pages_tab+ebx*4]
704
           test eax, FREE_BLOCK
705
           jz test_used
706
           and eax, 0xFFFFF000
707
           cmp eax, ecx    ;alloc_size
708
           jb  m_next
709
710
 
711
           add edx, ecx
712
           sub eax, ecx;
713
           or eax, FREE_BLOCK
714
           shr edx, 12
715
           mov [pages_tab+edx*4], eax
716
717
 
718
           mov [pages_tab+ebx*4], ecx
719
           shr ecx, 12
720
           dec ecx
721
           inc ebx
722
@@:
723
           mov dword [pages_tab+ebx*4], 2
724
           inc ebx
725
           dec ecx
726
           jnz @B
727
728
 
729
           add eax, 4096
730
           sub eax, new_app_base
731
           ret
732
m_next:
733
           add esi, eax
734
           jmp l_0
735
test_used:
736
           test eax, USED_BLOCK
737
           jz m_exit
738
739
 
740
           add esi, eax
741
           jmp l_0
742
m_exit:
743
           xor eax, eax
744
           ret
745
endp
746
747
 
748
proc user_free stdcall, base:dword
749
750
 
751
           test esi, esi
752
           jz .exit
753
754
 
755
           shr esi, 12
756
           mov eax, [pages_tab+esi*4]
757
           test eax, USED_BLOCK
758
           jz @f
759
760
 
761
           mov ecx, eax
762
           or eax, FREE_BLOCK
763
           mov [pages_tab+esi*4], eax
764
           inc esi
765
           sub ecx, 4096
766
           shr ecx, 12
767
.release:
768
           mov eax, [pages_tab+esi*4]
769
           call free_page
770
           inc esi
771
           dec ecx
772
           jnz .release
773
@@:
774
           mov ebx, [CURRENT_TASK]
775
           shl ebx, 8
776
           mov esi, dword [ebx+PROC_BASE+0x18]; heap_base
777
           mov edi, dword [ebx+PROC_BASE+0x1C]; heap_top
778
           shr esi, 12
779
           shr edi, 12
780
@@:
781
           mov eax, [pages_tab+esi*4]
782
           test eax, USED_BLOCK
783
           jz .test_free
784
           shr eax, 12
785
           add esi, eax
786
           jmp @B
787
.test_free:
788
           test eax, FREE_BLOCK
789
           jz .err
790
           mov edx, eax
791
           shr edx, 12
792
           add edx, esi
793
           cmp edx, edi
794
           jae .exit
795
796
 
797
           test ebx, USED_BLOCK
798
           jz .next_free
799
800
 
801
           add edx, ebx
802
           mov esi, edx
803
           jmp @B
804
.next_free:
805
           test ebx, FREE_BLOCK
806
           jz .err
807
           and dword [pages_tab+edx*4], 0
808
           add eax, ebx
809
           and eax, not 4095
810
           or eax, FREE_BLOCK
811
           mov [pages_tab+esi*4], eax
812
           jmp @B
813
.exit:
814
           xor eax, eax
815
           inc eax
816
           ret
817
.err:
818
           xor eax, eax
819
           ret
820
endp
821
822
 
823
 
824
;
825
;           stdcall wait_mutex, pg_data.pg_mutex
826
;
827
;           mov edi, [new_size]
828
;           add edi,4095
829
;           and edi,not 4095
830
;           mov [new_size], edi
831
832
 
833
;           shl    edx,8
834
;           mov    esi, [PROC_BASE+0x8c+edx]
835
;           add esi, 4095
836
;           and esi, not 4095
837
838
 
839
;           jae .expand
840
841
 
842
;           shr esi, 12
843
;
844
;@@:        mov eax, [pages_tab+0x4000+edi*4]
845
;           test eax, 1
846
;           jz .next
847
;           mov dword [pages_tab+0x4000+edi*4], 2
848
;           mov ebx, edi
849
;           shl ebx, 12
850
;           invlpg [ebx+std_application_base_address]
851
;           call free_page
852
;
853
;.next:     add edi, 1
854
;           cmp edi, esi
855
;           jb @B
856
;
857
;.update_size:
858
859
 
860
;           mov    [PROC_BASE+0x8c+edx],ebx
861
;
862
;;search threads and update
863
;;application memory size infomation
864
;           mov    ecx,[PROC_BASE+0xb8+edx]
865
;           mov    eax,2
866
867
 
868
;;eax = current slot
869
;;ebx = new memory size
870
;;ecx = page directory
871
;           cmp    eax,[TASK_COUNT]
872
;           jg     .search_threads_end
873
;           mov    edx,eax
874
;           shl    edx,5
875
;           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
876
;           jz     .search_threads_next
877
;           shl    edx,3
878
;           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
879
;           jnz    .search_threads_next
880
;           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
881
;.search_threads_next:
882
;           inc    eax
883
;           jmp    .search_threads
884
;.search_threads_end:
885
;           xor eax, eax
886
;           dec [pg_data.pg_mutex]
887
;           ret
888
;
889
;
890
;.expand:
891
;           add edi, new_app_base
892
;           add esi, new_app_base
893
;
894
;.grow:     call alloc_page
895
;           test eax, eax
896
;           jz .exit
897
;           stdcall map_page,esi,eax,dword PG_UW
898
899
 
900
;           mov edi, esi
901
;           xor eax, eax
902
;           mov ecx, 1024
903
;           cld
904
;           rep stosd
905
;           pop edi
906
907
 
908
;           cmp esi, edi
909
;           jna .grow
910
;           jmp .update_size
911
;.exit:
912
;           xor eax, eax
913
;           inc eax
914
;           dec [pg_data.pg_mutex]
915
;           ret
916
;endp
917
918
 
919
 
920
proc alloc_dll
921
           pushf
922
           cli
923
           bsf eax, [dll_map]
924
           jnz .find
925
           popf
926
           xor eax, eax
927
           ret
928
.find:
929
           btr [dll_map], eax
930
           popf
931
           shl eax, 5
932
           add eax, dll_tab
933
           ret
934
endp
935
936
 
937
proc alloc_service
938
           pushf
939
           cli
940
           bsf eax, [srv_map]
941
           jnz .find
942
           popf
943
           xor eax, eax
944
           ret
945
946
 
947
           popf
948
           shl eax,5
949
           add eax, srv_tab
950
           ret
951
endp
952
953
 
954
955
 
956
new_services:
957
         cmp eax, 10
958
         jb .fail
959
         ja @f
960
961
 
962
         call get_mem_info
963
         mov [esp+36], eax
964
         ret
965
@@:
966
         cmp eax, 11
967
         ja @f
968
969
 
970
         call init_heap
971
         mov [esp+36], eax
972
         ret
973
@@:
974
         cmp eax, 12
975
         ja @f
976
977
 
978
         call user_alloc
979
         mov [esp+36], eax
980
         ret
981
@@:
982
         cmp eax, 13
983
         ja @f
984
985
 
986
         call user_free
987
         mov [esp+36], eax
988
         ret
989
990
 
991
         cmp eax, 14
992
         ja @f
993
         mov eax, [ebp+8+new_app_base]
994
         add eax,new_app_base
995
         stdcall get_notify, eax
996
         ret
997
;@@:
998
;         cmp eax, 15
999
;         ja @f
1000
;         call set_notify
1001
;         ret
1002
@@:
1003
         cmp eax, 16
1004
         ja @f
1005
1006
 
1007
         add eax, new_app_base
1008
         stdcall get_service, eax
1009
         mov [esp+36], eax
1010
         ret
1011
@@:
1012
         cmp eax, 17
1013
         ja @f
1014
         stdcall srv_handler,[ebp+8+new_app_base],\
1015
                          [ebp+12+new_app_base],\
1016
                          [ebp+16+new_app_base]
1017
         mov [esp+36], eax
1018
         ret
1019
;@@:
1020
;         cmp eax, 20
1021
;         ja @f
1022
;         call CreateSound
1023
;         mov [esp+36], eax
1024
;         ret
1025
1026
 
1027
.fail:
1028
         xor eax, eax
1029
         mov [esp+36], eax
1030
         ret
1031
1032
 
1033
1034
 
1035
        jecxz .end
1036
1037
 
1038
1039
 
1040
        mov esi,edi
1041
        xor eax,eax
1042
        repne scasb
1043
        neg ecx             ; cx = count - strlen
1044
        add ecx,ebx         ; strlen + count - strlen
1045
1046
 
1047
        mov edi,esi
1048
        mov esi,[str2]
1049
        repe cmpsb
1050
        mov al,[esi-1]
1051
        xor ecx,ecx
1052
1053
 
1054
        ja .str2_big
1055
        je .end
1056
1057
 
1058
        sub ecx,2
1059
1060
 
1061
        not ecx
1062
.end:
1063
        mov eax,ecx
1064
        ret
1065
endp
1066
1067
 
1068
 
1069
1070
 
1071
.next:
1072
           mov eax, [edx]
1073
           test eax, eax
1074
           jz .end
1075
1076
 
1077
           stdcall strncmp, eax, [sz_name], 16
1078
           pop edx
1079
           test eax, eax
1080
           jz .ok
1081
1082
 
1083
           jmp .next
1084
.ok:
1085
           mov eax, [edx+4]
1086
.end:
1087
           ret
1088
endp
1089
1090
 
1091
         mov esi, [imp]
1092
1093
 
1094
         mov eax, [esi]
1095
         test eax, eax
1096
         jz .end
1097
1098
 
1099
         stdcall get_proc, [exp], eax
1100
         pop esi
1101
1102
 
1103
         jz @F
1104
1105
 
1106
@@:
1107
         add esi, 4
1108
         jmp .next
1109
.end:
1110
         ret
1111
endp
1112
1113
 
1114