Subversion Repositories Kolibri OS

Rev

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