Rev 164 | Rev 198 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 164 | Rev 188 | ||
---|---|---|---|
Line 293... | Line 293... | ||
293 | counter dd ? |
293 | counter dd ? |
294 | endl |
294 | endl |
Line 295... | Line 295... | ||
295 | 295 | ||
296 | mov eax, [sz_name] |
296 | mov eax, [sz_name] |
- | 297 | test eax, eax |
|
297 | test eax, eax |
298 | jnz @F |
298 | jz .fail |
299 | ret |
299 | 300 | @@: |
|
300 | mov [srv_ptr], srv_tab |
301 | mov [srv_ptr], srv_tab |
301 | mov [counter], 16 |
302 | mov [counter], 16 |
302 | @@: |
303 | @@: |
303 | stdcall strncmp, [srv_ptr], [sz_name], 16 |
304 | stdcall strncmp, [srv_ptr], [sz_name], 16 |
Line 306... | Line 307... | ||
306 | 307 | ||
307 | add [srv_ptr], SRV_SIZE |
308 | add [srv_ptr], SRV_SIZE |
308 | dec [counter] |
309 | dec [counter] |
309 | jnz @B |
310 | jnz @B |
310 | .not_load: |
- | |
311 | 311 | .not_load: |
|
312 | stdcall find_service, [sz_name] |
312 | stdcall find_service, [sz_name] |
313 | test eax, eax |
313 | test eax, eax |
314 | jz .fail |
- | |
315 | - | ||
316 | stdcall load_lib, eax |
- | |
317 | test eax, eax |
314 | jnz @F |
318 | jz .fail |
- | |
319 | - | ||
320 | mov [srv_ptr], srv_tab |
- | |
321 | mov [counter], 16 |
315 | ret |
322 | @@: |
- | |
323 | stdcall strncmp, [srv_ptr], [sz_name], 16 |
316 | @@: |
324 | test eax, eax |
- | |
325 | je .ok |
- | |
326 | - | ||
327 | add [srv_ptr], SRV_SIZE |
- | |
328 | dec [counter] |
- | |
329 | jnz @B |
- | |
330 | .fail: |
- | |
331 | xor eax, eax |
317 | stdcall load_driver, eax |
332 | ret |
318 | ret |
333 | .ok: |
319 | .ok: |
334 | mov eax, [srv_ptr] |
320 | mov eax, [srv_ptr] |
335 | ret |
321 | ret |
Line 421... | Line 407... | ||
421 | .end: |
407 | .end: |
422 | ret |
408 | ret |
423 | endp |
409 | endp |
Line 424... | Line 410... | ||
424 | 410 | ||
425 | align 4 |
- | |
426 | proc link_dll stdcall, exp:dword, imp:dword |
- | |
427 | mov esi, [imp] |
- | |
428 | .next: |
- | |
429 | mov eax, [esi] |
- | |
430 | test eax, eax |
- | |
431 | jz .end |
- | |
432 | - | ||
433 | push esi |
- | |
434 | stdcall get_proc, [exp], eax |
- | |
435 | pop esi |
- | |
436 | - | ||
437 | test eax, eax |
- | |
438 | jz @F |
- | |
439 | - | ||
440 | mov [esi], eax |
- | |
441 | @@: |
- | |
442 | add esi, 4 |
- | |
443 | jmp .next |
- | |
444 | .end: |
- | |
445 | ret |
- | |
446 | endp |
- | |
447 | - | ||
448 | align 4 |
411 | align 4 |
Line 449... | Line 412... | ||
449 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
412 | proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword |
450 | 413 | ||
451 | @@: |
414 | @@: |
Line 462... | Line 425... | ||
462 | mov eax, [ebx+8] |
425 | mov eax, [ebx+8] |
463 | ret |
426 | ret |
464 | endp |
427 | endp |
Line 465... | Line 428... | ||
465 | 428 | ||
- | 429 | align 4 |
|
- | 430 | proc get_curr_task |
|
- | 431 | mov eax,[CURRENT_TASK] |
|
- | 432 | shl eax, 8 |
|
- | 433 | ret |
|
- | 434 | endp |
|
- | 435 | ||
466 | align 4 |
436 | align 4 |
467 | proc load_lib stdcall, name:dword |
437 | proc get_fileinfo stdcall, file_name:dword, info:dword |
468 | locals |
438 | locals |
469 | lib dd ? |
439 | cmd dd ? |
- | 440 | offset dd ? |
|
- | 441 | dd ? |
|
- | 442 | count dd ? |
|
- | 443 | buff dd ? |
|
470 | base dd ? |
444 | db ? |
471 | pSym dd ? |
445 | name dd ? |
Line 472... | Line 446... | ||
472 | endl |
446 | endl |
473 | 447 | ||
474 | mov eax, [name] |
448 | xor eax, eax |
475 | mov ebx, 1 ;index of first block |
449 | mov ebx, [file_name] |
476 | mov ecx, 32 ;number of blocks |
450 | sub ebx, new_app_base |
477 | mov edx, TMP_BUFF ;temp area |
451 | mov ecx, [info] |
- | 452 | sub ecx, new_app_base |
|
- | 453 | ||
- | 454 | mov [cmd], 5 |
|
- | 455 | mov [offset], eax |
|
- | 456 | mov [offset+4], eax |
|
478 | mov esi, 12 ;file name length |
457 | mov [count], eax |
- | 458 | mov [buff], ecx |
|
479 | 459 | mov byte [buff+4], al |
|
480 | call fileread ;read file from RD |
460 | mov [name], ebx |
- | 461 | ||
- | 462 | mov eax, 70 |
|
- | 463 | lea ebx, [cmd] |
|
481 | 464 | sub ebx, new_app_base |
|
- | 465 | int 0x40 |
|
Line -... | Line 466... | ||
- | 466 | ret |
|
- | 467 | endp |
|
482 | cmp eax,0 |
468 | |
- | 469 | align 4 |
|
- | 470 | proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\ |
|
- | 471 | bytes:dword |
|
- | 472 | locals |
|
- | 473 | cmd dd ? |
|
483 | jne .err |
474 | offset dd ? |
484 | 475 | dd ? |
|
- | 476 | count dd ? |
|
- | 477 | buff dd ? |
|
Line -... | Line 478... | ||
- | 478 | db ? |
|
- | 479 | name dd ? |
|
- | 480 | endl |
|
- | 481 | ||
- | 482 | xor eax, eax |
|
- | 483 | mov ebx, [file_name] |
|
- | 484 | mov ecx, [off] |
|
- | 485 | mov edx, [bytes] |
|
- | 486 | mov esi, [buffer] |
|
- | 487 | sub ebx, new_app_base |
|
485 | ; mov eax, [TMP_BUFF+CFH.pSymTable] |
488 | sub esi, new_app_base |
- | 489 | ||
- | 490 | mov [cmd], eax |
|
- | 491 | mov [offset], ecx |
|
- | 492 | mov [offset+4], eax |
|
- | 493 | mov [count], edx |
|
- | 494 | mov [buff], esi |
|
- | 495 | mov byte [buff+4], al |
|
- | 496 | mov [name], ebx |
|
- | 497 | ||
- | 498 | mov eax, 70 |
|
- | 499 | lea ebx, [cmd] |
|
Line -... | Line 500... | ||
- | 500 | sub ebx, new_app_base |
|
486 | ; add eax, TMP_BUFF |
501 | int 0x40 |
487 | ; mov [pSym], eax |
502 | ret |
- | 503 | endp |
|
- | 504 | ||
- | 505 | align 4 |
|
- | 506 | proc load_file stdcall, file_name:dword |
|
- | 507 | locals |
|
- | 508 | attr dd ? |
|
- | 509 | flags dd ? |
|
- | 510 | cr_time dd ? |
|
- | 511 | cr_date dd ? |
|
Line 488... | Line -... | ||
488 | - | ||
489 | ; mov [TMP_BUFF+20+CFS.VirtualAddress], eax |
- | |
490 | - | ||
491 | stdcall kernel_alloc, [TMP_BUFF+20+CFS.SizeOfRawData] |
- | |
492 | mov [base], eax |
- | |
493 | - | ||
494 | test eax, eax |
- | |
495 | jnz @f |
- | |
496 | @@: |
- | |
497 | mov [TMP_BUFF+20+CFS.VirtualAddress], eax |
- | |
498 | mov ebx, [TMP_BUFF+CFH.pSymTable] |
- | |
499 | add ebx, TMP_BUFF |
512 | acc_time dd ? |
500 | mov [pSym], ebx |
513 | acc_date dd ? |
501 | - | ||
502 | stdcall LinkSection, TMP_BUFF, TMP_BUFF+20, ebx |
- | |
503 | - | ||
504 | mov edi, [base] |
- | |
505 | test edi, edi |
- | |
Line 506... | Line 514... | ||
506 | jnz @f |
514 | mod_time dd ? |
- | 515 | mod_date dd ? |
|
507 | @@: |
516 | file_size dd ? |
508 | mov esi, [TMP_BUFF+20+CFS.PtrRawData] |
517 | |
509 | add esi, TMP_BUFF |
- | |
510 | mov ecx, [TMP_BUFF+20+CFS.SizeOfRawData] |
- | |
Line 511... | Line -... | ||
511 | rep movsb |
- | |
512 | - | ||
513 | call alloc_dll |
- | |
514 | test eax, eax |
- | |
515 | jnz @f |
- | |
516 | @@: |
- | |
517 | mov [lib], eax |
- | |
518 | - | ||
519 | mov edi, eax |
518 | file dd ? |
520 | mov esi, [name] |
- | |
521 | mov ecx, 16 |
519 | endl |
Line 522... | Line 520... | ||
522 | rep movsb |
520 | |
- | 521 | lea eax, [attr] |
|
- | 522 | stdcall get_fileinfo, [file_name], eax |
|
523 | 523 | test eax, eax |
|
524 | stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols],szSTART |
524 | jnz .fail |
- | 525 | ||
- | 526 | stdcall kernel_alloc, [file_size] |
|
- | 527 | mov [file], eax |
|
525 | mov edi, [lib] |
528 | |
- | 529 | stdcall read_file, [file_name], eax, dword 0, [file_size] |
|
- | 530 | cmp ebx, [file_size] |
|
Line 526... | Line -... | ||
526 | add eax, [base] |
- | |
527 | mov [edi+LIB.lib_start], eax |
- | |
528 | mov ebx, [base] |
531 | jne .cleanup |
529 | mov [edi+LIB.lib_base], ebx |
532 | mov eax, [file] |
Line -... | Line 533... | ||
- | 533 | ret |
|
530 | 534 | .cleanup: |
|
- | 535 | stdcall kernel_free, [file] |
|
- | 536 | .fail: |
|
- | 537 | xor eax, eax |
|
- | 538 | ret |
|
- | 539 | endp |
|
- | 540 | ||
- | 541 | align 4 |
|
Line -... | Line 542... | ||
- | 542 | proc get_proc_ex stdcall, proc_name:dword, imports:dword |
|
- | 543 | ||
531 | stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szEXPORTS |
544 | .look_up: |
532 | mov edi, [lib] |
545 | mov edx, [imports] |
- | 546 | mov edx, [edx] |
|
Line -... | Line 547... | ||
- | 547 | test edx, edx |
|
- | 548 | jz .end |
|
- | 549 | .next: |
|
- | 550 | mov eax, [edx] |
|
- | 551 | test eax, eax |
|
- | 552 | jz .next_table |
|
533 | add eax, [base] |
553 | |
534 | mov [edi+LIB.export], eax |
554 | push edx |
535 | 555 | stdcall strncmp, eax, [proc_name], 16 |
|
536 | stdcall get_coff_sym,[pSym],[TMP_BUFF+CFH.nSymbols], szIMPORTS |
556 | pop edx |
537 | mov edi, [lib] |
557 | test eax, eax |
538 | add eax, [base] |
- | |
539 | mov [edi+LIB.import], eax |
558 | jz .ok |
Line 540... | Line 559... | ||
540 | 559 | ||
541 | stdcall link_dll, kernel_export, eax |
560 | add edx,8 |
- | 561 | jmp .next |
|
542 | 562 | .next_table: |
|
543 | mov edi, [lib] |
563 | add [imports], 4 |
544 | call [edi+LIB.lib_start] |
564 | jmp .look_up |
Line 545... | Line 565... | ||
545 | 565 | .ok: |
|
- | 566 | mov eax, [edx+4] |
|
- | 567 | ret |
|
546 | mov eax, [lib] |
568 | .end: |
547 | ret |
569 | xor eax, eax |
- | 570 | ret |
|
- | 571 | endp |
|
548 | .err: |
572 | |
- | 573 | align 4 |
|
Line 549... | Line 574... | ||
549 | xor eax, eax |
574 | proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\ |
550 | ret |
575 | sym_count:dword, strings:dword, imports:dword |
- | 576 | locals |
|
- | 577 | retval dd ? |
|
- | 578 | endl |
|
- | 579 | ||
- | 580 | mov edi, [symbols] |
|
- | 581 | mov [retval], 1 |
|
- | 582 | .fix: |
|
- | 583 | movzx ebx, [edi+CSYM.SectionNumber] |
|
- | 584 | test ebx, ebx |
|
- | 585 | jnz .internal |
|
- | 586 | mov eax, dword [edi+CSYM.Name] |
|
- | 587 | test eax, eax |
|
- | 588 | jnz @F |
|
- | 589 | ||
- | 590 | mov edi, [edi+4] |
|
- | 591 | add edi, [strings] |
|
- | 592 | @@: |
|
- | 593 | push edi |
|
- | 594 | stdcall get_proc_ex, edi,[imports] |
|
- | 595 | pop edi |
|
- | 596 | ||
- | 597 | xor ebx, ebx |
|
- | 598 | test eax, eax |
|
- | 599 | jnz @F |
|
- | 600 | ||
- | 601 | mov esi, msg_unresolved |
|
- | 602 | call sys_msg_board_str |
|
- | 603 | mov esi, edi |
|
- | 604 | call sys_msg_board_str |
|
- | 605 | mov esi, msg_CR |
|
- | 606 | call sys_msg_board_str |
|
- | 607 | ||
- | 608 | mov [retval],0 |
|
- | 609 | @@: |
|
- | 610 | mov edi, [symbols] |
|
- | 611 | mov [edi+CSYM.Value], eax |
|
- | 612 | jmp .next |
|
Line -... | Line 613... | ||
- | 613 | .internal: |
|
- | 614 | dec ebx |
|
- | 615 | shl ebx, 3 |
|
551 | 616 | lea ebx, [ebx+ebx*4] |
|
552 | endp |
617 | add ebx, [sec] |
- | 618 | ||
553 | 619 | mov eax, [ebx+CFS.VirtualAddress] |
|
554 | align 4 |
620 | add [edi+CSYM.Value], eax |
555 | proc LinkSection stdcall, pCoff:dword, pSec:dword, pSym:dword |
621 | .next: |
556 | locals |
622 | add edi, CSYM_SIZE |
557 | pCode dd ? |
623 | mov [symbols], edi |
558 | endl |
624 | dec [sym_count] |
- | 625 | jnz .fix |
|
Line -... | Line 626... | ||
- | 626 | mov eax, [retval] |
|
- | 627 | ret |
|
- | 628 | endp |
|
- | 629 | ||
559 | 630 | align 4 |
|
560 | mov esi, [pSec] |
631 | proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword |
561 | mov eax, [esi+CFS.PtrRawData] |
632 | locals |
- | 633 | n_sec dd ? |
|
Line 562... | Line 634... | ||
562 | add eax, [pCoff] |
634 | endl |
Line 563... | Line 635... | ||
563 | mov [pCode], eax |
635 | |
564 | 636 | mov eax, [coff] |
|
Line -... | Line 637... | ||
- | 637 | movzx ebx, [eax+CFH.nSections] |
|
- | 638 | mov [n_sec], ebx |
|
- | 639 | .fix_sec: |
|
565 | mov edi, [esi+CFS.PtrReloc] |
640 | mov esi, [sec] |
- | 641 | mov edi, [esi+CFS.PtrReloc] |
|
- | 642 | add edi, [coff] |
|
- | 643 | ||
566 | add edi, [pCoff] |
644 | movzx ecx, [esi+CFS.NumReloc] |
- | 645 | test ecx, ecx |
|
- | 646 | jz .next |
|
- | 647 | .next_reloc: |
|
- | 648 | mov ebx, [edi+CRELOC.SymIndex] |
|
567 | 649 | add ebx,ebx |
|
568 | movzx edx, [esi+CFS.NumReloc] |
650 | lea ebx,[ebx+ebx*8] |
569 | mov eax, edx |
651 | add ebx, [sym] |
- | 652 | ||
570 | lea edx, [edx+edx*8] |
653 | mov edx, [ebx+CSYM.Value] |
- | 654 | ||
- | 655 | cmp [edi+CRELOC.Type], 6 |
|
- | 656 | je .dir_32 |
|
571 | add edx, eax |
657 | |
572 | add edx, edi |
658 | cmp [edi+CRELOC.Type], 20 |
573 | .l_0: |
659 | jne .next_reloc |
Line -... | Line 660... | ||
- | 660 | .rel_32: |
|
- | 661 | mov eax, [edi+CRELOC.VirtualAddress] |
|
574 | cmp edi, edx |
662 | add eax, [esi+CFS.VirtualAddress] |
- | 663 | sub edx, eax |
|
- | 664 | sub edx, 4 |
|
- | 665 | jmp .fix |
|
- | 666 | .dir_32: |
|
- | 667 | mov eax, [edi+CRELOC.VirtualAddress] |
|
- | 668 | add eax, [esi+CFS.VirtualAddress] |
|
- | 669 | .fix: |
|
- | 670 | add [eax], edx |
|
- | 671 | add edi, 10 |
|
- | 672 | dec ecx |
|
- | 673 | jnz .next_reloc |
|
- | 674 | .next: |
|
- | 675 | add [sec], 40 |
|
- | 676 | dec [n_sec] |
|
- | 677 | jnz .fix_sec |
|
- | 678 | .exit: |
|
- | 679 | ret |
|
- | 680 | endp |
|
- | 681 | ||
- | 682 | align 4 |
|
- | 683 | proc load_driver stdcall, file_name:dword |
|
- | 684 | locals |
|
- | 685 | coff dd ? |
|
- | 686 | sym dd ? |
|
- | 687 | strings dd ? |
|
- | 688 | img_size dd ? |
|
- | 689 | img_base dd ? |
|
- | 690 | start dd ? |
|
- | 691 | ||
- | 692 | exports dd ? ;fake exports table |
|
- | 693 | dd ? |
|
- | 694 | endl |
|
- | 695 | ||
- | 696 | stdcall load_file, [file_name] |
|
- | 697 | test eax, eax |
|
- | 698 | jz .fail |
|
- | 699 | ||
575 | jae .exit |
700 | mov [coff], eax |
- | 701 | ||
- | 702 | movzx ecx, [eax+CFH.nSections] |
|
576 | 703 | xor ebx, ebx |
|
- | 704 | ||
- | 705 | lea edx, [eax+20] |
|
- | 706 | @@: |
|
- | 707 | add ebx, [edx+CFS.SizeOfRawData] |
|
- | 708 | add ebx, 15 |
|
- | 709 | and ebx, not 15 |
|
- | 710 | add edx, 18 |
|
- | 711 | dec ecx |
|
- | 712 | jnz @B |
|
- | 713 | mov [img_size], ebx |
|
- | 714 | ||
- | 715 | stdcall kernel_alloc, ebx |
|
- | 716 | test eax, eax |
|
- | 717 | jz .fail |
|
- | 718 | mov [img_base], eax |
|
- | 719 | ||
- | 720 | mov edi, eax |
|
- | 721 | xor eax, eax |
|
- | 722 | mov ecx, [img_size] |
|
- | 723 | add ecx, 4095 |
|
- | 724 | and ecx, not 4095 |
|
- | 725 | shr ecx, 2 |
|
- | 726 | cld |
|
- | 727 | rep stosd |
|
- | 728 | ||
- | 729 | mov edx, [coff] |
|
- | 730 | movzx ebx, [edx+CFH.nSections] |
|
- | 731 | mov edi, [img_base] |
|
- | 732 | lea eax, [edx+20] |
|
- | 733 | @@: |
|
- | 734 | mov [eax+CFS.VirtualAddress], edi |
|
- | 735 | mov esi, [eax+CFS.PtrRawData] |
|
- | 736 | test esi, esi |
|
- | 737 | jnz .copy |
|
- | 738 | add edi, [eax+CFS.SizeOfRawData] |
|
- | 739 | jmp .next |
|
- | 740 | .copy: |
|
- | 741 | add esi, edx |
|
- | 742 | mov ecx, [eax+CFS.SizeOfRawData] |
|
- | 743 | cld |
|
- | 744 | rep movsb |
|
- | 745 | .next: |
|
- | 746 | add edi, 15 |
|
- | 747 | and edi, not 15 |
|
- | 748 | add eax, 40 |
|
- | 749 | dec ebx |
|
- | 750 | jnz @B |
|
- | 751 | ||
- | 752 | mov ebx, [edx+CFH.pSymTable] |
|
- | 753 | add ebx, edx |
|
- | 754 | mov [sym], ebx |
|
- | 755 | mov ecx, [edx+CFH.nSymbols] |
|
- | 756 | add ecx,ecx |
|
- | 757 | lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE |
|
- | 758 | add ecx, [sym] |
|
- | 759 | mov [strings], ecx |
|
- | 760 | ||
- | 761 | lea ebx, [exports] |
|
- | 762 | mov dword [ebx], kernel_export |
|
- | 763 | mov dword [ebx+4], 0 |
|
- | 764 | lea eax, [edx+20] |
|
- | 765 | ||
- | 766 | stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\ |
|
- | 767 | [strings], ebx |
|
- | 768 | test eax, eax |
|
- | 769 | jnz @F |
|
- | 770 | ||
- | 771 | mov esi, msg_module |
|
- | 772 | call sys_msg_board_str |
|
- | 773 | mov esi, [file_name] |
|
- | 774 | call sys_msg_board_str |
|
- | 775 | mov esi, msg_CR |
|
- | 776 | call sys_msg_board_str |
|
- | 777 | ||
- | 778 | stdcall kernel_free,[coff] |
|
- | 779 | xor eax, eax |
|
- | 780 | ret |
|
- | 781 | @@: |
|
- | 782 | mov ebx, [coff] |
|
- | 783 | add ebx, 20 |
|
577 | mov ebx, [edi+CRELOC.SymIndex] |
784 | stdcall fix_coff_relocs, [coff], ebx, [sym] |
578 | add ebx,ebx |
785 | |
Line 579... | Line 786... | ||
579 | lea ebx,[ebx+ebx*8] |
786 | mov ebx, [coff] |
580 | 787 | stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART |
|
Line 581... | Line 788... | ||
581 | add ebx, [pSym] |
788 | mov [start], eax |
582 | 789 | ||
Line 583... | Line 790... | ||
583 | mov ecx, [ebx+CSYM.Value] |
790 | stdcall kernel_free, [coff] |
584 | add ecx, [esi+CFS.VirtualAddress] |
791 | |
585 | 792 | mov ebx, [start] |
|
Line -... | Line 793... | ||
- | 793 | call ebx |
|
- | 794 | test eax, eax |
|
- | 795 | jnz .ok |
|
- | 796 | ||
586 | mov eax, [edi+CRELOC.VirtualAddress] |
797 | stdcall kernel_free, [img_base] |
587 | add eax, [pCode] |
798 | xor eax, eax |
588 | add [eax], ecx |
799 | ret |
589 | add edi, 10 |
800 | .ok: |
590 | jmp .l_0 |
801 | mov ebx, [img_base] |