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 |