Subversion Repositories Kolibri OS

Rev

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
        {