Subversion Repositories Kolibri OS

Rev

Rev 890 | Rev 897 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 890 Rev 892
Line 3... Line 3...
3
#include 
3
#include 
4
#include 
4
#include 
5
#include 
5
#include 
6
#include 
6
#include 
7
 
7
#include 
-
 
8
 
Line 8... Line -...
8
typedef unsigned short WORD;
-
 
9
typedef unsigned int DWORD;
-
 
10
typedef unsigned int LONG;
-
 
11
typedef unsigned char BYTE;
-
 
12
 
-
 
13
#define IMAGE_DOS_SIGNATURE  0x5A4D
-
 
14
#define IMAGE_NT_SIGNATURE   0x00004550
-
 
15
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
-
 
16
 
-
 
17
#pragma pack(push,2)
-
 
18
typedef struct _IMAGE_DOS_HEADER
-
 
19
{
-
 
20
    WORD    e_magic;
-
 
21
    WORD    e_cblp;
-
 
22
    WORD    e_cp;
-
 
23
    WORD    e_crlc;
-
 
24
    WORD    e_cparhdr;
-
 
25
    WORD    e_minalloc;
-
 
26
    WORD    e_maxalloc;
-
 
27
    WORD    e_ss;
-
 
28
    WORD    e_sp;
-
 
29
    WORD    e_csum;
-
 
30
    WORD    e_ip;
-
 
31
    WORD    e_cs;
-
 
32
    WORD    e_lfarlc;
-
 
33
    WORD    e_ovno;
-
 
34
    WORD    e_res[4];
-
 
35
    WORD    e_oemid;
-
 
36
    WORD    e_oeminfo;
-
 
37
    WORD    e_res2[10];
-
 
38
    LONG    e_lfanew;
-
 
39
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
-
 
40
#pragma pack(pop)
-
 
41
 
-
 
42
 
-
 
43
#pragma pack(push,4)
-
 
44
typedef struct _IMAGE_FILE_HEADER
-
 
45
{
-
 
46
    WORD    Machine;
-
 
47
    WORD    NumberOfSections;
-
 
48
    DWORD   TimeDateStamp;
-
 
49
    DWORD   PointerToSymbolTable;
-
 
50
    DWORD   NumberOfSymbols;
-
 
51
    WORD    SizeOfOptionalHeader;
-
 
52
    WORD    Characteristics;
-
 
53
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
-
 
54
 
-
 
55
typedef struct _IMAGE_DATA_DIRECTORY {
-
 
56
    DWORD   VirtualAddress;
-
 
57
    DWORD   Size;
-
 
58
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
-
 
59
 
-
 
60
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
-
 
61
 
-
 
62
typedef struct _IMAGE_OPTIONAL_HEADER {
-
 
63
    WORD    Magic;
-
 
64
    BYTE    MajorLinkerVersion;
-
 
65
    BYTE    MinorLinkerVersion;
-
 
66
    DWORD   SizeOfCode;
-
 
67
    DWORD   SizeOfInitializedData;
-
 
68
    DWORD   SizeOfUninitializedData;
-
 
69
    DWORD   AddressOfEntryPoint;
-
 
70
    DWORD   BaseOfCode;
-
 
71
    DWORD   BaseOfData;
-
 
72
    DWORD   ImageBase;
-
 
73
    DWORD   SectionAlignment;
-
 
74
    DWORD   FileAlignment;
-
 
75
    WORD    MajorOperatingSystemVersion;
-
 
76
    WORD    MinorOperatingSystemVersion;
-
 
77
    WORD    MajorImageVersion;
-
 
78
    WORD    MinorImageVersion;
-
 
79
    WORD    MajorSubsystemVersion;
-
 
80
    WORD    MinorSubsystemVersion;
-
 
81
    DWORD   Win32VersionValue;
-
 
82
    DWORD   SizeOfImage;
-
 
83
    DWORD   SizeOfHeaders;
-
 
84
    DWORD   CheckSum;
-
 
85
    WORD    Subsystem;
-
 
86
    WORD    DllCharacteristics;
-
 
87
    DWORD   SizeOfStackReserve;
-
 
88
    DWORD   SizeOfStackCommit;
-
 
89
    DWORD   SizeOfHeapReserve;
-
 
90
    DWORD   SizeOfHeapCommit;
-
 
91
    DWORD   LoaderFlags;
-
 
92
    DWORD   NumberOfRvaAndSizes;
-
 
93
	IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
9
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
94
} IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER;
-
 
95
 
-
 
96
#pragma pack(pop)
-
 
97
 
-
 
98
 
-
 
99
#pragma pack(push,4)
-
 
100
typedef struct _IMAGE_NT_HEADERS
-
 
101
{
-
 
102
    DWORD Signature;
-
 
103
	IMAGE_FILE_HEADER FileHeader;
-
 
104
	IMAGE_OPTIONAL_HEADER OptionalHeader;
-
 
105
} IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;
-
 
106
 
-
 
107
#define IMAGE_SIZEOF_SHORT_NAME    8
-
 
108
 
-
 
109
typedef struct _IMAGE_SECTION_HEADER
-
 
110
{
-
 
111
	BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
-
 
112
    union
-
 
113
    {
-
 
114
        DWORD PhysicalAddress;
-
 
115
		DWORD VirtualSize;
-
 
116
	} Misc;
-
 
117
    DWORD   VirtualAddress;
-
 
118
    DWORD   SizeOfRawData;
-
 
119
    DWORD   PointerToRawData;
-
 
120
    DWORD   PointerToRelocations;
-
 
121
    DWORD   PointerToLinenumbers;
-
 
122
    WORD    NumberOfRelocations;
-
 
123
    WORD    NumberOfLinenumbers;
-
 
124
    DWORD   Characteristics;
-
 
125
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
-
 
126
#pragma pack(pop)
-
 
127
 
-
 
128
#pragma pack(push,4)
-
 
129
typedef struct _IMAGE_BASE_RELOCATION {
-
 
130
	DWORD VirtualAddress;
-
 
131
	DWORD SizeOfBlock;
-
 
132
} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
-
 
133
#pragma pack(pop)
-
 
Line 134... Line -...
134
 
-
 
135
typedef struct _IMAGE_IMPORT_DESCRIPTOR
-
 
136
{
-
 
137
    union
-
 
138
    {
10
 
139
		DWORD Characteristics;
-
 
140
		DWORD OriginalFirstThunk;
-
 
141
    };
-
 
142
    DWORD   TimeDateStamp;
-
 
143
    DWORD   ForwarderChain;
-
 
144
    DWORD   Name;
-
 
145
    DWORD   FirstThunk;
-
 
Line 146... Line 11...
146
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
11
static dll_t core_dll;
147
 
-
 
148
typedef struct _IMAGE_THUNK_DATA32
-
 
149
{
12
 
150
    union
-
 
151
    {
-
 
152
		DWORD ForwarderString;
13
static char* strupr(char *str )
153
		DWORD Function;
14
{
154
		DWORD Ordinal;
-
 
155
		DWORD AddressOfData;
-
 
Line -... Line 15...
-
 
15
    char *p;
156
	} u1;
16
    unsigned char c;
157
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
17
 
158
 
-
 
159
typedef struct _IMAGE_IMPORT_BY_NAME
-
 
160
{
-
 
161
	WORD Hint;
-
 
162
	BYTE Name[1];
-
 
163
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
-
 
164
 
18
    p = str;
165
#define IMAGE_ORDINAL_FLAG 0x80000000
19
    while( (c = *p) )
166
 
-
 
167
typedef struct _IMAGE_EXPORT_DIRECTORY {
-
 
168
	DWORD Characteristics;
-
 
169
	DWORD TimeDateStamp;
20
    {
170
	WORD MajorVersion;
21
        if( c >= 'a' && c <= 'z' )
171
	WORD MinorVersion;
-
 
172
	DWORD Name;
-
 
173
	DWORD Base;
-
 
174
	DWORD NumberOfFunctions;
-
 
175
	DWORD NumberOfNames;
-
 
176
	DWORD AddressOfFunctions;
-
 
177
	DWORD AddressOfNames;
-
 
178
	DWORD AddressOfNameOrdinals;
-
 
Line 179... Line 22...
179
} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
22
            *p = c - 'a' + 'A';
-
 
23
        ++p;
Line 180... Line 24...
180
 
24
    }
181
//extern  IMAGE_EXPORT_DIRECTORY kernel_exports;
25
 
182
 
-
 
183
#define MakePtr( cast, ptr, addValue ) (cast)( (addr_t)(ptr) + (addValue) )
26
    return( str );
184
 
27
}
185
typedef struct
-
 
186
{
28
 
Line 187... Line 29...
187
    addr_t  base;
29
void init_core_dll()
-
 
30
{
-
 
31
    PIMAGE_DOS_HEADER        dos;
-
 
32
    PIMAGE_NT_HEADERS32      nt;
Line 188... Line -...
188
    addr_t  frame;
-
 
189
    md_t    *md;
-
 
190
 
-
 
191
    IMAGE_OPTIONAL_HEADER  *opthdr;
-
 
192
 
33
    PIMAGE_EXPORT_DIRECTORY  exp;
193
}dll_t;
-
 
Line -... Line 34...
-
 
34
 
-
 
35
    dos =  (PIMAGE_DOS_HEADER)LOAD_BASE;
-
 
36
    nt  =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
Line 194... Line -...
194
 
-
 
195
static inline bool IsPowerOf2(u32_t val)
-
 
196
{
37
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
197
    if(val == 0)
38
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
198
        return false;
39
 
199
    return (val & (val - 1)) == 0;
-
 
200
}
40
    list_initialize(&core_dll.link);
201
 
41
 
202
 
-
 
203
static inline void sec_copy(void *dst, const void *src, size_t len)
-
 
Line 204... Line 42...
204
{
42
    core_dll.img_base = LOAD_BASE;
205
    u32_t tmp;
-
 
206
    __asm__ __volatile__ (
-
 
207
    "shrl $2, %%ecx         \n\t"
43
    core_dll.img_size = nt->OptionalHeader.SizeOfImage;
208
    "rep movsl"
44
    core_dll.img_md   = NULL;
209
    :"=c"(tmp),"=S"(tmp),"=D"(tmp)
-
 
210
    :"c"(len),"S"(src),"D"(dst)
45
 
211
    :"cc");
-
 
212
};
-
 
213
 
46
    core_dll.img_hdr  = nt;
Line 214... Line -...
214
static inline void sec_clear(void *dst, size_t len)
-
 
215
{
-
 
216
    u32_t tmp;
-
 
217
    __asm__ __volatile__ (
-
 
218
    "xorl %%eax, %%eax      \n\t"
-
 
219
    "rep stosb"
-
 
Line -... Line 47...
-
 
47
    core_dll.img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
-
 
48
    core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
-
 
49
                        nt->OptionalHeader.DataDirectory[0].VirtualAddress);
Line 220... Line 50...
220
    :"=c"(tmp),"=D"(tmp)
50
    core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
221
    :"c"(len),"D"(dst)
51
 
-
 
52
    DBG("%s base %x size %x sections %d exports %x\n",
222
    :"eax","cc");
53
        core_dll.img_name, core_dll.img_base,
Line 223... Line 54...
223
};
54
        core_dll.img_size, nt->FileHeader.NumberOfSections,
Line 224... Line -...
224
 
-
 
225
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
55
        core_dll.img_exp );
Line 226... Line 56...
226
 
56
};
227
 
57
 
Line -... Line 58...
-
 
58
 
228
void __export create_image(void *img_base, void *image) asm ("CreateImage");
59
dll_t * find_dll(const char *name)
229
 
60
{
230
md_t* __fastcall load_image(const char *path);
61
    dll_t* dll = &core_dll;
231
 
62
 
232
 
63
    do
Line 269... Line 100...
269
 
100
 
Line 270... Line 101...
270
    if( ! md )
101
    if( ! md )
271
        return 0;
102
        return 0;
Line -... Line 103...
-
 
103
 
-
 
104
    if( link_image( md->base ) )
272
 
105
    {
273
    dos = (PIMAGE_DOS_HEADER)md->base;
106
        dos = (PIMAGE_DOS_HEADER)md->base;
Line 274... Line 107...
274
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
107
        nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
275
 
108
 
Line 282... Line 115...
282
       srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base;
115
            srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base;
283
 
116
 
Line 284... Line 117...
284
    return srv;
117
        return srv;
285
}
118
    }
286
 
-
 
287
md_t* __fastcall load_image(const char *path)
-
 
288
{
-
 
289
    PIMAGE_DOS_HEADER     dos;
-
 
290
    PIMAGE_NT_HEADERS32   nt;
-
 
291
 
-
 
292
    md_t    *img_md;
-
 
293
 
-
 
294
    size_t   img_size;
-
 
295
    void    *img_base;
-
 
296
    count_t  img_pages;
-
 
297
 
-
 
298
    size_t   raw_size = 0;
-
 
299
    void    *raw;
-
 
300
 
-
 
301
//    void    *image;
-
 
302
 
-
 
303
    DBG("load file %s\n", path);
-
 
304
 
-
 
305
    raw = load_file(path, &raw_size);
-
 
306
 
-
 
307
    DBG("raw = %x\n\n", raw);
-
 
308
 
-
 
309
    dos = (PIMAGE_DOS_HEADER)raw;
-
 
310
 
-
 
311
    if( !raw || raw_size < sizeof(IMAGE_DOS_HEADER) )
-
 
312
        return NULL;
-
 
313
 
-
 
314
    if( dos->e_magic != IMAGE_DOS_SIGNATURE || dos->e_lfanew <= 0)
-
 
315
        return NULL;
-
 
316
 
-
 
317
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
318
 
-
 
319
    if( (addr_t)nt < (addr_t)raw)
-
 
320
        return NULL;
-
 
321
 
-
 
322
    if(nt->Signature != IMAGE_NT_SIGNATURE)
-
 
323
        return NULL;
-
 
324
 
-
 
325
    if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
-
 
326
        return NULL;
-
 
327
 
-
 
328
    if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE)
-
 
329
	{
-
 
330
        if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
-
 
331
            return NULL;
-
 
332
	}
-
 
333
    else if(nt->OptionalHeader.SectionAlignment < nt->OptionalHeader.FileAlignment)
-
 
334
        return NULL;
-
 
335
 
-
 
336
    if(!IsPowerOf2(nt->OptionalHeader.SectionAlignment) ||
-
 
337
       !IsPowerOf2(nt->OptionalHeader.FileAlignment))
-
 
338
        return NULL;
-
 
339
 
-
 
340
    if(nt->FileHeader.NumberOfSections > 96)
-
 
341
        return NULL;
-
 
342
 
-
 
343
    img_size  =  nt->OptionalHeader.SizeOfImage;
-
 
344
//    img_pages = img_size / PAGE_SIZE;
-
 
345
 
-
 
346
    img_md  = md_alloc(img_size, PG_SW);
-
 
347
 
-
 
348
 
-
 
349
    if( !img_md)
-
 
350
    {
-
 
351
        mem_free(raw);
-
 
352
        return NULL;
-
 
353
    };
-
 
354
 
-
 
355
    img_base = (void*)img_md->base;
-
 
356
 
-
 
357
    create_image(img_base, raw);
-
 
358
 
-
 
359
    mem_free(raw);
-
 
360
 
-
 
361
//    dos = (PIMAGE_DOS_HEADER)img_base;
-
 
362
//    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
363
 
-
 
364
    return img_md;
-
 
365
};
-
 
366
 
-
 
367
 
-
 
368
/*
-
 
369
addr_t get_proc_addr(addr_t module, char *name)
-
 
370
{
-
 
371
    PIMAGE_DOS_HEADER  expdos;
-
 
372
    PIMAGE_NT_HEADERS32  expnt;
-
 
373
    PIMAGE_EXPORT_DIRECTORY exp;
-
 
374
    u32_t *functions;
-
 
375
    char **funcname;
-
 
376
    int ind;
-
 
377
 
-
 
378
    expdos = (PIMAGE_DOS_HEADER)module;
-
 
379
    expnt =  MakePtr( PIMAGE_NT_HEADERS32, expdos, expdos->e_lfanew);
-
 
380
 
-
 
381
    exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,module,
-
 
382
                  expnt->OptionalHeader.DataDirectory[0].VirtualAddress);
-
 
383
 
-
 
384
    functions = MakePtr(DWORD*,exp->AddressOfFunctions,module);
-
 
385
    funcname = MakePtr(char**,exp->AddressOfNames,module);
-
 
386
 
-
 
387
    for(ind=0; *funcname;funcname++,ind++)
-
 
388
    {
-
 
389
        if(!strcmp(name,MakePtr(char*,*funcname,module)))
-
 
390
            return functions[ind] + module;
-
 
391
    };
-
 
392
    return -1;
-
 
393
};
-
 
394
*/
-
 
395
 
-
 
396
 
-
 
397
void create_image(void *img_base, void *image)
-
 
398
{
-
 
399
    PIMAGE_DOS_HEADER     dos;
-
 
400
    PIMAGE_NT_HEADERS32   nt;
-
 
401
    PIMAGE_SECTION_HEADER img_sec;
-
 
402
 
-
 
403
    u32_t  sec_align;
-
 
404
    int    i;
-
 
405
 
-
 
406
 
-
 
407
/* assumed that image is valid */
-
 
408
 
-
 
409
    dos = (PIMAGE_DOS_HEADER)image;
-
 
410
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
411
 
-
 
412
    sec_copy(img_base,image,nt->OptionalHeader.SizeOfHeaders);
-
 
413
 
-
 
414
    img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt,sizeof(IMAGE_NT_HEADERS32));
-
 
415
 
-
 
416
    sec_align = nt->OptionalHeader.SectionAlignment;
-
 
417
 
-
 
418
    for(i=0; i< nt->FileHeader.NumberOfSections; i++)
-
 
419
    {
-
 
420
        char *src_ptr;
-
 
421
        char *dest_ptr;
-
 
422
        size_t sec_size;
-
 
423
 
-
 
424
        src_ptr = MakePtr(char*, image, img_sec->PointerToRawData);
-
 
425
        dest_ptr = MakePtr(char*,img_base, img_sec->VirtualAddress);
-
 
426
 
-
 
427
        if(img_sec->SizeOfRawData)
-
 
428
            sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
-
 
429
 
-
 
430
        sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align;
-
 
431
 
-
 
432
        if(sec_size > img_sec->SizeOfRawData)
-
 
433
            sec_clear(dest_ptr + img_sec->SizeOfRawData,
-
 
434
                      sec_size - img_sec->SizeOfRawData);
-
 
435
        img_sec++;
-
 
436
    }
-
 
437
 
-
 
438
    if(nt->OptionalHeader.DataDirectory[5].Size)
-
 
439
    {
-
 
440
        PIMAGE_BASE_RELOCATION reloc;
-
 
441
 
-
 
442
/* FIXME addr_t */
-
 
443
 
-
 
444
        u32_t delta = (u32_t)img_base - nt->OptionalHeader.ImageBase;
-
 
445
 
-
 
446
        reloc = MakePtr(PIMAGE_BASE_RELOCATION, img_base,
-
 
447
                        nt->OptionalHeader.DataDirectory[5].VirtualAddress);
-
 
448
 
-
 
449
        while ( reloc->SizeOfBlock != 0 )
-
 
450
        {
-
 
451
            u32_t  cnt;
-
 
452
            u16_t *entry;
-
 
453
            u16_t  reltype;
-
 
454
            u32_t  offs;
-
 
455
 
-
 
456
            cnt = (reloc->SizeOfBlock - sizeof(*reloc))/sizeof(u16_t);
-
 
457
            entry = MakePtr( u16_t*, reloc, sizeof(*reloc) );
-
 
458
 
-
 
459
            for ( i=0; i < cnt; i++ )
-
 
460
            {
-
 
461
                u16_t *p16;
-
 
462
                u32_t *p32;
-
 
463
 
-
 
464
                reltype = (*entry & 0xF000) >> 12;
-
 
465
                offs = (*entry & 0x0FFF) + reloc->VirtualAddress;
-
 
466
                switch(reltype)
-
 
467
                {
-
 
468
                    case 1:
-
 
469
                        p16 = MakePtr(u16_t*, img_base, offs);
-
 
470
                        *p16+= (u16_t)(delta>>16);
-
 
471
                        break;
-
 
472
                    case 2:
-
 
473
                        p16 = MakePtr(u16_t*, img_base, offs);
-
 
474
                        *p16+= (u16_t)delta;
-
 
475
                        break;
-
 
476
                    case 3:
-
 
477
                        p32 = MakePtr(u32_t*, img_base, offs);
-
 
478
                        *p32+= delta;
-
 
479
                }
-
 
480
                entry++;
-
 
481
            }
-
 
482
            reloc = MakePtr(PIMAGE_BASE_RELOCATION, reloc,reloc->SizeOfBlock);
-
 
483
        }
-
 
484
    };
-
 
485
 
-
 
486
    if(nt->OptionalHeader.DataDirectory[1].Size)
-
 
487
    {
-
 
488
        PIMAGE_IMPORT_DESCRIPTOR imp;
-
 
489
 
-
 
490
        int warn = 0;
-
 
491
 
-
 
492
        imp = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, img_base,
-
 
493
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
-
 
494
 
-
 
495
 
-
 
496
 
-
 
497
        while ( 1 )
-
 
498
        {
-
 
499
            PIMAGE_THUNK_DATA32     thunk;
-
 
500
 
-
 
501
            PIMAGE_DOS_HEADER       expdos;
-
 
502
            PIMAGE_NT_HEADERS32     expnt;
-
 
503
            PIMAGE_EXPORT_DIRECTORY exp;
-
 
504
 
-
 
505
            u32_t   *iat;
-
 
506
            char    *libname;
-
 
507
            addr_t  *functions;
-
 
508
            u16_t   *ordinals;
-
 
509
            char   **funcname;
-
 
510
 
-
 
511
 
-
 
512
            if ( (imp->TimeDateStamp==0 ) && (imp->Name==0) )
-
 
513
                break;
-
 
514
 
-
 
515
            libname=MakePtr(char*,imp->Name, img_base);
-
 
516
 
-
 
517
            DBG("import from %s\n",libname);
-
 
518
 
-
 
519
            expdos = (PIMAGE_DOS_HEADER)IMAGE_BASE;
-
 
520
            expnt =  MakePtr( PIMAGE_NT_HEADERS32, expdos, expdos->e_lfanew);
-
 
521
 
-
 
522
            exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
-
 
523
                    expnt->OptionalHeader.DataDirectory[0].VirtualAddress);
-
 
524
 
-
 
525
            functions = MakePtr(DWORD*,exp->AddressOfFunctions,LOAD_BASE);
-
 
526
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,LOAD_BASE);
-
 
527
            funcname = MakePtr(char**, exp->AddressOfNames,LOAD_BASE);
-
 
528
 
-
 
529
            thunk = MakePtr(PIMAGE_THUNK_DATA32,
-
 
530
                            imp->Characteristics, img_base);
-
 
531
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
-
 
532
 
-
 
533
            while ( 1 ) // Loop forever (or until we break out)
-
 
534
            {
-
 
535
                PIMAGE_IMPORT_BY_NAME ord;
-
 
536
                addr_t addr;
-
 
537
 
-
 
538
                if ( thunk->u1.AddressOfData == 0 )
-
 
539
                    break;
-
 
540
 
-
 
541
                if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
-
 
542
                {
-
 
543
        //  printf("  %4u\n", thunk->u1.Ordinal & 0xFFFF);
-
 
544
                    break;
-
 
545
                }
-
 
546
                else
-
 
547
                {
-
 
548
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
-
 
549
                                  thunk->u1.AddressOfData, img_base);
-
 
550
                    *iat=0;
-
 
551
 
-
 
552
                    DBG("import %s", ord->Name);
-
 
553
 
-
 
554
                    if(strncmp(ord->Name,
-
 
555
                       MakePtr(char*,funcname[ord->Hint],LOAD_BASE),32))
-
 
556
                    {
-
 
557
                        int ind;
-
 
558
                        char **names=funcname;
-
 
559
 
-
 
560
                        for(names = funcname,ind = 0;
-
 
561
                            ind < exp->NumberOfNames; names++,ind++)
-
 
562
                        {
-
 
563
                            if(!strncmp(ord->Name,MakePtr(char*,*names,LOAD_BASE),32))
-
 
564
                            {
-
 
565
                                DBG(" \tat %x\n", functions[ind] + LOAD_BASE);
-
 
566
                                *iat = functions[ind] + LOAD_BASE;
-
 
567
                                break;
-
 
568
                            };
-
 
569
                        };
-
 
570
                        if(ind == exp->NumberOfNames)
-
 
571
                        {
-
 
572
                            DBG(" unresolved import %s\n",ord->Name);
-
 
573
                            warn=1;
-
 
574
                        };
-
 
575
                    }
-
 
576
                    else
119
    else
577
                    {
120
    {
578
                        DBG(" \tat %x\n", functions[ord->Hint] + LOAD_BASE);
-
 
579
                        *iat = functions[ord->Hint] + LOAD_BASE;
-
 
580
                    };
121
        md_free( md );
581
                };
-
 
582
                thunk++;            // Advance to next thunk
-
 
583
                iat++;
-
 
584
            }
-
 
585
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
-
 
586
        };
-
 
587
    };
-
 
588
 
-
 
589
    DBG("\ncreate pe base %x, size %x, %d sections\n\n",img_base,
-
 
590
         nt->OptionalHeader.SizeOfImage, nt->FileHeader.NumberOfSections);
-
 
591
};
-
 
592
 
-
 
593
 
-
 
594
 
-
 
595
 
-
 
596
 
-
 
597
/*
-
 
598
 
-
 
599
u32 map_PE(u32 base, void *image)
-
 
600
{
-
 
601
  PIMAGE_DOS_HEADER dos;
-
 
602
  PIMAGE_NT_HEADERS32 nt;
-
 
603
  PIMAGE_SECTION_HEADER sec;
-
 
604
 
-
 
605
  int i;
-
 
606
  int pages;
-
 
607
 
-
 
608
  dos = (PIMAGE_DOS_HEADER)image;
-
 
609
  nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
610
 
-
 
611
 
-
 
612
    img_size  =  nt->OptionalHeader.SizeOfImage;
-
 
613
    img_pages = img_size / PAGE_SIZE;
-
 
614
 
-
 
615
    img_md  = md_alloc(img_size, PG_SW);
-
 
616
 
-
 
617
    if( !img_md)
-
 
618
        return NULL;
122
        return NULL;
619
 
-
 
620
 
-
 
621
 
-
 
622
  scopy(base,(u32)image,nt->OptionalHeader.SizeOfHeaders);
-
 
623
 
-
 
624
  sec = MakePtr(PIMAGE_SECTION_HEADER,nt,sizeof(IMAGE_NT_HEADERS32));
-
 
625
 
-
 
626
 
-
 
627
  if(nt->OptionalHeader.DataDirectory[1].Size)
-
 
628
  {
-
 
629
    PIMAGE_IMPORT_DESCRIPTOR imp;
-
 
630
 
-
 
631
    imp = MakePtr(PIMAGE_IMPORT_DESCRIPTOR,base,
-
 
632
                  nt->OptionalHeader.DataDirectory[1].VirtualAddress);
-
 
633
    while ( 1 )
-
 
634
    {
-
 
635
      PIMAGE_THUNK_DATA32 thunk;
-
 
636
      u32 *iat;
-
 
637
      char *libname;
-
 
638
 
-
 
639
      if ( (imp->TimeDateStamp==0 ) && (imp->Name==0) )
-
 
640
        break;
-
 
641
 
-
 
642
 
-
 
643
      thunk = MakePtr(PIMAGE_THUNK_DATA32,
-
 
644
                      imp->Characteristics, base);
-
 
645
      iat= MakePtr(DWORD*,imp->FirstThunk, base);
-
 
646
 
-
 
647
      while ( 1 ) // Loop forever (or until we break out)
-
 
648
      {
-
 
649
        PIMAGE_IMPORT_BY_NAME ord;
-
 
650
 
-
 
651
        u32 addr;
-
 
652
 
-
 
653
        if ( thunk->u1.AddressOfData == 0 )
-
 
654
          break;
-
 
655
 
-
 
656
        if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
-
 
657
        {
-
 
658
        //  printf("  %4u\n", thunk->u1.Ordinal & 0xFFFF);
-
 
659
            break;
-
 
660
        }
-
 
661
        else
-
 
662
        {
-
 
663
          PKERNEL_EXPORT exp;
-
 
664
          exp = kernel_export;
-
 
665
 
-
 
666
          ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
-
 
667
                        thunk->u1.AddressOfData,base);
-
 
668
          *iat=-1;
-
 
669
 
-
 
670
          do
-
 
671
          {
-
 
672
            if(!strncmp(ord->Name,exp->name,16))
-
 
673
            {
-
 
674
              *iat = exp->address;
-
 
675
              break;
-
 
676
            }
123
    }
677
            exp++;
-
 
678
          } while(exp->name != 0);
-
 
679
        };
-
 
680
        thunk++;            // Advance to next thunk
-
 
681
        iat++;
-
 
682
      }
-
 
683
      imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
-
 
684
    }
124
}
685
  };
-
 
Line 686... Line -...
686
 
-