Rev 3799 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3799 | Rev 3805 | ||
---|---|---|---|
Line 5... | Line 5... | ||
5 | #include |
5 | #include |
6 | #include |
6 | #include |
7 | #include |
7 | #include |
8 | 8 | ||
Line 9... | Line 9... | ||
9 | #include |
9 | #include |
Line 10... | Line 10... | ||
10 | 10 | ||
11 | #include "list.h" |
11 | #include "list.h" |
Line 12... | Line 12... | ||
12 | #include "pe.h" |
12 | #include "pe.h" |
Line 17... | Line 17... | ||
17 | 17 | ||
Line 18... | Line 18... | ||
18 | #define DBG(format,...) |
18 | #define DBG(format,...) |
Line 19... | Line 19... | ||
19 | 19 | ||
20 | 20 | ||
21 | void __fastcall init_loader(void *libc_image); |
21 | void init_loader(void *libc_image); |
22 | void* __fastcall create_image(void *raw); |
22 | void* __fastcall create_image(void *raw); |
Line 38... | Line 38... | ||
38 | int memsize; |
38 | int memsize; |
39 | int stacktop; |
39 | int stacktop; |
40 | char *cmdline; |
40 | char *cmdline; |
41 | char *path; |
41 | char *path; |
42 | }; |
42 | int reserved; |
- | 43 | void *__idata_start; |
|
- | 44 | void *__idata_end; |
|
- | 45 | void (*main)(int argc, char **argv, char **envp); |
|
- | 46 | }; |
|
43 | 47 | ||
Line 44... | Line 48... | ||
44 | struct tag_module |
48 | struct tag_module |
45 | { |
49 | { |
46 | struct list_head list; |
50 | struct list_head list; |
Line 68... | Line 72... | ||
68 | }dll_path_t; |
72 | }dll_path_t; |
69 | 73 | ||
Line 70... | Line 74... | ||
70 | module_t* load_module(const char *name); |
74 | module_t* load_module(const char *name); |
Line 71... | Line -... | ||
71 | - | ||
72 | LIST_HEAD(dll_list); |
75 | |
Line 73... | Line 76... | ||
73 | LIST_HEAD(path_list); |
76 | LIST_HEAD(path_list); |
74 | 77 | ||
75 | static module_t libc_dll; |
78 | static module_t libc_dll; |
Line 76... | Line 79... | ||
76 | static char libc_name[] = "libc.dll"; |
79 | static char libc_name[] = "libc.dll"; |
77 | static char libc_path[] = "/sys/lib/libc.dll"; |
80 | static char libc_path[] = "/KolibriOS/lib/libc.dll"; |
78 | 81 | ||
79 | static inline int IsPowerOf2(uint32_t val) |
82 | static inline int IsPowerOf2(uint32_t val) |
Line 135... | Line 138... | ||
135 | return 1; |
138 | return 1; |
136 | } |
139 | } |
Line 137... | Line 140... | ||
137 | 140 | ||
138 | 141 | ||
Line 139... | Line 142... | ||
139 | void __fastcall init_loader(void *libc_image) |
142 | void init_loader(void *libc_image) |
140 | { |
143 | { |
141 | 144 | ||
Line 142... | Line 145... | ||
142 | PIMAGE_DOS_HEADER dos; |
145 | PIMAGE_DOS_HEADER dos; |
143 | PIMAGE_NT_HEADERS32 nt; |
146 | PIMAGE_NT_HEADERS32 nt; |
144 | PIMAGE_EXPORT_DIRECTORY exp; |
147 | PIMAGE_EXPORT_DIRECTORY exp; |
145 | 148 | ||
146 | struct app_hdr *header; |
149 | struct app_hdr *header; |
Line 147... | Line 150... | ||
147 | 150 | #if 0 |
|
Line 216... | Line 219... | ||
216 | path->path_len = 9; /* FIXME */ |
219 | path->path_len = 9; /* FIXME */ |
217 | DBG("add libraries path %s\n", path->path); |
220 | DBG("add libraries path %s\n", path->path); |
218 | list_add_tail(&path->list, &path_list); |
221 | list_add_tail(&path->list, &path_list); |
219 | #endif |
222 | #endif |
220 | 223 | #endif |
|
- | 224 | ||
Line 221... | Line 225... | ||
221 | INIT_LIST_HEAD(&libc_dll.list); |
225 | INIT_LIST_HEAD(&libc_dll.list); |
Line 222... | Line 226... | ||
222 | 226 | ||
223 | libc_dll.img_name = libc_name; |
227 | libc_dll.img_name = libc_name; |
Line 237... | Line 241... | ||
237 | libc_dll.img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32)); |
241 | libc_dll.img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32)); |
238 | libc_dll.img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,libc_image, |
242 | libc_dll.img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,libc_image, |
239 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
243 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
240 | 244 | ||
Line 241... | Line -... | ||
241 | list_add_tail(&libc_dll.list, &dll_list); |
- | |
242 | }; |
245 | }; |
Line 243... | Line 246... | ||
243 | 246 | ||
244 | const module_t* find_module(const char *name) |
247 | const module_t* find_module(const char *name) |
245 | { |
248 | { |
Line 246... | Line 249... | ||
246 | module_t* mod; |
249 | module_t* mod = &libc_dll; |
247 | 250 | ||
248 | list_for_each_entry(mod, &dll_list, list) |
251 | do |
249 | { |
252 | { |
- | 253 | if( !strncmp(name, mod->img_name, 16)) |
|
250 | if( !strncmp(name, mod->img_name, 16)) |
254 | return mod; |
Line 251... | Line 255... | ||
251 | return mod; |
255 | mod = (module_t*)mod->list.next; |
252 | }; |
256 | }while(mod != &libc_dll); |
Line 253... | Line 257... | ||
253 | 257 | ||
Line 266... | Line 270... | ||
266 | "" |
270 | "" |
267 | :::"ecx","esi","edi"); |
271 | :::"ecx","esi","edi"); |
268 | }; |
272 | }; |
269 | 273 | ||
Line 270... | Line -... | ||
270 | static inline void *user_alloc(size_t size) |
- | |
271 | { |
- | |
272 | void *val; |
- | |
273 | __asm__ __volatile__( |
- | |
274 | "int $0x40" |
- | |
275 | :"=eax"(val) |
- | |
276 | :"a"(68),"b"(12),"c"(size)); |
- | |
277 | return val; |
- | |
278 | } |
- | |
Line 279... | Line 274... | ||
279 | 274 | ||
280 | void* __fastcall create_image(void *raw) |
275 | void* __fastcall create_image(void *raw) |
281 | { |
276 | { |
282 | PIMAGE_DOS_HEADER dos; |
277 | PIMAGE_DOS_HEADER dos; |
Line 364... | Line 359... | ||
364 | }; |
359 | }; |
365 | return img_base; |
360 | return img_base; |
366 | }; |
361 | }; |
367 | 362 | ||
Line -... | Line 363... | ||
- | 363 | static jmp_buf loader_env; |
|
- | 364 | static loader_recursion; |
|
- | 365 | ||
368 | int __fastcall link_image(void *img_base) |
366 | int __fastcall link_image(void *img_base) |
369 | { |
367 | { |
370 | static jmp_buf loader_env; |
368 | static jmp_buf loader_env; |
371 | static recursion = -1; |
369 | static recursion = -1; |
Line 550... | Line 548... | ||
550 | else |
548 | else |
551 | return 0; |
549 | return 0; |
552 | } |
550 | } |
553 | 551 | ||
Line -... | Line 552... | ||
- | 552 | int link_app() |
|
- | 553 | { |
|
- | 554 | PIMAGE_IMPORT_DESCRIPTOR imp; |
|
- | 555 | ||
- | 556 | struct app_hdr *header = NULL; |
|
- | 557 | ||
- | 558 | int warn = 0; |
|
- | 559 | ||
- | 560 | if( unlikely(setjmp(loader_env) != 0)) |
|
- | 561 | { |
|
- | 562 | loader_recursion = 0; |
|
- | 563 | return 0; |
|
- | 564 | }; |
|
- | 565 | ||
- | 566 | imp = (PIMAGE_IMPORT_DESCRIPTOR)header->__idata_start; |
|
- | 567 | ||
- | 568 | while ( imp->Name ) |
|
- | 569 | { |
|
- | 570 | PIMAGE_DOS_HEADER expdos; |
|
- | 571 | PIMAGE_NT_HEADERS32 expnt; |
|
- | 572 | PIMAGE_EXPORT_DIRECTORY exp; |
|
- | 573 | PIMAGE_THUNK_DATA32 thunk; |
|
- | 574 | ||
- | 575 | void **iat; |
|
- | 576 | char *libname; |
|
- | 577 | uint32_t *exp_functions; |
|
- | 578 | uint16_t *exp_ordinals; |
|
- | 579 | char **exp_names; |
|
- | 580 | ||
- | 581 | const module_t *api; |
|
- | 582 | ||
- | 583 | libname=MakePtr(char*,imp->Name, NULL); |
|
- | 584 | ||
- | 585 | DBG("import from %s\n",libname); |
|
- | 586 | ||
- | 587 | api = find_module(libname); |
|
- | 588 | if(unlikely(api == NULL)) |
|
- | 589 | { |
|
- | 590 | printf("library %s not found\n", libname); |
|
- | 591 | longjmp(loader_env, 1); |
|
- | 592 | } |
|
- | 593 | ||
- | 594 | iat = MakePtr(void**,imp->FirstThunk, NULL); |
|
- | 595 | ||
- | 596 | if(imp->OriginalFirstThunk !=0 ) |
|
- | 597 | { |
|
- | 598 | thunk = MakePtr(PIMAGE_THUNK_DATA32,imp->OriginalFirstThunk, NULL); |
|
- | 599 | } |
|
- | 600 | else |
|
- | 601 | { |
|
- | 602 | thunk = MakePtr(PIMAGE_THUNK_DATA32,imp->FirstThunk, NULL); |
|
- | 603 | }; |
|
- | 604 | ||
- | 605 | exp = api->img_exp; |
|
- | 606 | ||
- | 607 | exp_functions = MakePtr(uint32_t*,exp->AddressOfFunctions,api->start); |
|
- | 608 | exp_ordinals = MakePtr(uint16_t*, exp->AddressOfNameOrdinals,api->start); |
|
- | 609 | exp_names = MakePtr(char**, exp->AddressOfNames,api->start); |
|
- | 610 | ||
- | 611 | while ( thunk->u1.AddressOfData != 0 ) |
|
- | 612 | { |
|
- | 613 | PIMAGE_IMPORT_BY_NAME imp_name; |
|
- | 614 | ||
- | 615 | if (thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) |
|
- | 616 | { |
|
- | 617 | // ordinal = (*func_list) & 0x7fffffff; |
|
- | 618 | // *ImportAddressList = LdrGetExportByOrdinal(ImportedModule->DllBase, Ordinal); |
|
- | 619 | // if ((*ImportAddressList) == NULL) |
|
- | 620 | // { |
|
- | 621 | // DPRINT1("Failed to import #%ld from %wZ\n", Ordinal, &ImportedModule->FullDllName); |
|
- | 622 | // RtlpRaiseImportNotFound(NULL, Ordinal, &ImportedModule->FullDllName); |
|
- | 623 | // return STATUS_ENTRYPOINT_NOT_FOUND; |
|
- | 624 | // } |
|
- | 625 | } |
|
- | 626 | else |
|
- | 627 | { |
|
- | 628 | char *export_name; |
|
- | 629 | uint16_t ordinal; |
|
- | 630 | void *function; |
|
- | 631 | uint32_t minn; |
|
- | 632 | uint32_t maxn; |
|
- | 633 | ||
- | 634 | imp_name = MakePtr(PIMAGE_IMPORT_BY_NAME, |
|
- | 635 | thunk->u1.AddressOfData, NULL); |
|
- | 636 | *iat = NULL; |
|
- | 637 | ||
- | 638 | DBG("import %s", imp_name->Name); |
|
- | 639 | ||
- | 640 | if(imp_name->Hint < exp->NumberOfNames) |
|
- | 641 | { |
|
- | 642 | export_name = MakePtr(char*,exp_names[imp_name->Hint], |
|
- | 643 | api->start); |
|
- | 644 | if(strcmp(imp_name->Name, export_name) == 0) |
|
- | 645 | { |
|
- | 646 | ordinal = exp_ordinals[imp_name->Hint]; |
|
- | 647 | function = MakePtr(void*,exp_functions[ordinal], api->start); |
|
- | 648 | if((uint32_t)function >= (uint32_t)exp) |
|
- | 649 | { |
|
- | 650 | printf("forward %s\n", function); |
|
- | 651 | warn=1; |
|
- | 652 | } |
|
- | 653 | else |
|
- | 654 | { |
|
- | 655 | DBG(" \t\tat %x\n", function); |
|
- | 656 | *iat = function; |
|
- | 657 | }; |
|
- | 658 | thunk++; // Advance to next thunk |
|
- | 659 | iat++; |
|
- | 660 | continue; |
|
- | 661 | }; |
|
- | 662 | }; |
|
- | 663 | ||
- | 664 | ||
- | 665 | minn = 0; |
|
- | 666 | maxn = exp->NumberOfNames - 1; |
|
- | 667 | while (minn <= maxn) |
|
- | 668 | { |
|
- | 669 | int mid; |
|
- | 670 | int res; |
|
- | 671 | ||
- | 672 | mid = (minn + maxn) / 2; |
|
- | 673 | ||
- | 674 | export_name = MakePtr(char*,exp_names[mid],api->start); |
|
- | 675 | ||
- | 676 | res = strcmp(export_name, imp_name->Name); |
|
- | 677 | if (res == 0) |
|
- | 678 | { |
|
- | 679 | ordinal = exp_ordinals[mid]; |
|
- | 680 | function = MakePtr(void*,exp_functions[ordinal], api->start); |
|
- | 681 | ||
- | 682 | if((uint32_t)function >= (uint32_t)exp) |
|
- | 683 | { |
|
- | 684 | DBG("forward %s\n", function); |
|
- | 685 | warn=1; |
|
- | 686 | } |
|
- | 687 | else |
|
- | 688 | { |
|
- | 689 | DBG(" \t\tat %x\n", function); |
|
- | 690 | *iat = function; |
|
- | 691 | }; |
|
- | 692 | break; |
|
- | 693 | } |
|
- | 694 | else if (minn == maxn) |
|
- | 695 | { |
|
- | 696 | printf(" unresolved %s\n",imp_name->Name); |
|
- | 697 | warn=1; |
|
- | 698 | break; |
|
- | 699 | } |
|
- | 700 | else if (res > 0) |
|
- | 701 | { |
|
- | 702 | maxn = mid - 1; |
|
- | 703 | } |
|
- | 704 | else |
|
- | 705 | { |
|
- | 706 | minn = mid + 1; |
|
- | 707 | } |
|
- | 708 | }; |
|
- | 709 | }; |
|
- | 710 | thunk++; // Advance to next thunk |
|
- | 711 | iat++; |
|
- | 712 | } |
|
- | 713 | imp++; // advance to next IMAGE_IMPORT_DESCRIPTOR |
|
- | 714 | }; |
|
- | 715 | ||
- | 716 | if ( !warn ) |
|
- | 717 | return 1; |
|
- | 718 | else |
|
- | 719 | return 0; |
|
- | 720 | } |
|
- | 721 | ||
- | 722 | ||
- | 723 | ||
554 | void* get_entry_point(void *raw) |
724 | void* get_entry_point(void *raw) |
555 | { |
725 | { |
556 | PIMAGE_DOS_HEADER dos; |
726 | PIMAGE_DOS_HEADER dos; |
557 | PIMAGE_NT_HEADERS32 nt; |
727 | PIMAGE_NT_HEADERS32 nt; |
Line 705... | Line 875... | ||
705 | module->img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32)); |
875 | module->img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32)); |
706 | module->img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY, img_base, |
876 | module->img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY, img_base, |
707 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
877 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
708 | 878 | ||
Line 709... | Line 879... | ||
709 | list_add_tail(&module->list, &dll_list); |
879 | list_add_tail(&module->list, &libc_dll.list); |
Line 710... | Line 880... | ||
710 | 880 | ||
711 | if( link_image(img_base)) |
881 | if( link_image(img_base)) |
712 | { |
882 | { |