Subversion Repositories Kolibri OS

Rev

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

Rev 897 Rev 908
Line 5... Line 5...
5
#include 
5
#include 
6
#include 
6
#include 
7
#include 
7
#include 
8
 
8
 
Line -... Line 9...
-
 
9
#pragma pack(push,4)
-
 
10
typedef struct
-
 
11
{
-
 
12
  char     app_name[16];
-
 
13
  addr_t   fpu_state;                       /*      +16       */
-
 
14
  count_t  ev_count;                        /*      +20       */
-
 
15
  addr_t   fpu_handler;                     /*      +24       */
-
 
16
  addr_t   sse_handler;                     /*      +28       */
-
 
17
  addr_t   pl0_stack;                       /*      +32       */
-
 
18
 
-
 
19
  addr_t   heap_base;                       /*      +36       */
-
 
20
  addr_t   heap_top;                        /*      +40       */
-
 
21
  addr_t   cursor;                          /*      +44       */
-
 
22
  addr_t   fd_ev;                           /*      +48       */
-
 
23
  addr_t   bk_ev;                           /*      +52       */
-
 
24
  addr_t   fd_obj;                          /*      +56       */
-
 
25
  addr_t   bk_obj;                          /*      +60       */
-
 
26
  addr_t   saved_esp;                       /*      +64       */
-
 
27
  addr_t   io_map[2];                       /*      +68       */
-
 
28
 
-
 
29
  u32_t    dbg_state;                       /*      +76       */
-
 
30
  char    *cur_dir;                         /*      +80       */
-
 
31
  count_t  wait_timeout;                    /*      +84       */
-
 
32
  addr_t   saved_esp0;                      /*      +88       */
-
 
33
 
-
 
34
  link_t   dll_list;                        /*      +92       */
-
 
35
 
-
 
36
  u32_t    reserved0[7];                    /*      +100   db 28 dup(?)  */
-
 
37
 
-
 
38
  addr_t   wnd_shape;                       /*      +128      */
-
 
39
  u32_t    wnd_shape_scale;                 /*      +132      */
-
 
40
  u32_t    reserved1;                       /*      +136      */
-
 
41
  size_t   mem_size;                        /*      +140      */
-
 
42
}appdata_t;
-
 
43
#pragma pack(pop)
-
 
44
 
-
 
45
 
-
 
46
extern appdata_t *current_slot;
-
 
47
 
-
 
48
bool link_pe(addr_t img_base);
-
 
49
 
9
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
50
int __stdcall strncmp(const char *s1, const char *s2, size_t n);
Line 10... Line 51...
10
 
51
 
11
extern int __stdcall mnt_exec(void *raw, size_t raw_size, char *path,
52
extern int __stdcall mnt_exec(void *raw, size_t raw_size, char *path,
Line 12... Line 53...
12
              char *cmdline, u32_t flags) asm ("mnt_exec");
53
              char *cmdline, u32_t flags) asm ("mnt_exec");
-
 
54
 
-
 
55
dll_t core_dll;
Line 13... Line 56...
13
 
56
 
14
static dll_t core_dll;
57
slab_cache_t *dll_slab;
15
 
58
 
16
static char* strupr(char *str )
59
static char* strupr(char *str )
Line 82... Line 125...
82
    core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
125
    core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
83
                        nt->OptionalHeader.DataDirectory[0].VirtualAddress);
126
                        nt->OptionalHeader.DataDirectory[0].VirtualAddress);
84
    core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
127
    core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
85
 
128
 
Line -... Line 129...
-
 
129
    dll_slab = slab_cache_create(sizeof(dll_t), 16,NULL,NULL,SLAB_CACHE_MAGDEFERRED);
-
 
130
 
86
    DBG("%s base %x size %x sections %d exports %x\n",
131
    DBG("%s base %x size %x sections %d exports %x\n",
87
        core_dll.img_name, core_dll.img_base,
132
        core_dll.img_name, core_dll.img_base,
88
        core_dll.img_size, nt->FileHeader.NumberOfSections,
133
        core_dll.img_size, nt->FileHeader.NumberOfSections,
89
        core_dll.img_exp );
134
        core_dll.img_exp );
90
};
135
};
Line 91... Line 136...
91
 
136
 
92
 
137
 
93
dll_t * find_dll(const char *name)
138
dll_t * find_dll(link_t *list, const char *name)
Line 94... Line 139...
94
{
139
{
95
    dll_t* dll = &core_dll;
140
    dll_t* dll = (dll_t*)list;
96
 
141
 
97
    do
142
    do
Line 98... Line 143...
98
    {
143
    {
Line 99... Line 144...
99
        if( !strncmp(name,dll->img_name,16))
144
        if( !strncmp(name,dll->img_name,16))
Line 100... Line 145...
100
            return dll;
145
            return dll;
101
 
146
 
Line 181... Line 226...
181
    auxv_t  aux[1];     /*  aux. AT_NULL for now                    */
226
    auxv_t  aux[1];     /*  aux. AT_NULL for now                    */
182
}exec_stack_t;
227
}exec_stack_t;
183
 
228
 
Line 184... Line 229...
184
 
229
 
Line 185... Line 230...
185
addr_t new_app_space(void);
230
addr_t __fastcall pe_app_space(size_t size);
186
 
231
 
Line 187... Line 232...
187
int __stdcall pe_app_param(char *path, void *raw, addr_t ex_pg_dir,
232
int __stdcall pe_app_param(char *path, void *raw, addr_t ex_pg_dir,
188
                          addr_t ex_stack_page) asm ("pe_app_param");
233
                          exec_stack_t *ex_stack) asm ("pe_app_param");
-
 
234
 
-
 
235
int sys_exec(char *path, char *cmdline, u32_t flags)
-
 
236
{
-
 
237
    PIMAGE_DOS_HEADER     dos;
-
 
238
    PIMAGE_NT_HEADERS32   nt;
-
 
239
 
189
 
240
    size_t   img_size;
190
int sys_exec(char *path, char *cmdline, u32_t flags)
-
 
191
{
241
    count_t  img_pages;
192
    addr_t        ex_pg_dir;
242
    count_t  img_tabs;
Line 193... Line 243...
193
    addr_t        ex_stack_tab;
243
    addr_t        ex_pg_dir;
194
    addr_t        ex_stack_page;
244
    addr_t        ex_stack_page;
Line 255... Line 305...
255
        DBG("command line too long\n");
305
        DBG("command line too long\n");
256
        return -30;
306
        return -30;
257
    }
307
    }
258
 
308
 
Line 259... Line 309...
259
    ex_pg_dir      = new_app_space();
309
    ex_stack_page  = core_alloc(0);                    /* 2^0 = 1 page   */
260
 
-
 
261
    if( !ex_pg_dir )
310
    if( ! ex_stack_page )
262
    {
311
    {
263
        mem_free(raw);
312
        mem_free(raw);
264
        return -30;                                    /* FIXME          */
313
        return -30;                                    /* FIXME          */
265
    };
314
    };
Line 266... Line 315...
266
 
315
 
267
    ex_stack_tab   = ex_pg_dir + 4096;
316
    dos = (PIMAGE_DOS_HEADER)raw;
Line 268... Line 317...
268
    ex_pl0_stack   = ex_pg_dir + 4096 * 2;
317
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
Line -... Line 318...
-
 
318
 
-
 
319
    img_size  =  nt->OptionalHeader.SizeOfImage;
269
 
320
 
270
    ex_stack_page  = core_alloc(0);                    /* 2^0 = 1 page   */
321
    ex_pg_dir      = pe_app_space(img_size);
271
 
322
 
272
    if( ! ex_stack_page )
323
    if( !ex_pg_dir )
273
    {
324
    {
274
        core_free(ex_stack_tab);
325
        core_free(ex_stack_page);
Line 275... Line 326...
275
        mem_free(raw);
326
        mem_free(raw);
Line 282... Line 333...
282
    :"=c"(tmp),"=D"(tmp)
333
    :"=c"(tmp),"=D"(tmp)
283
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
334
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
284
    :"eax","cc");
335
    :"eax","cc");
285
 
336
 
Line 286... Line -...
286
    ((u32_t*)(ex_stack_tab+OS_BASE))[1023] = ex_stack_page | 7;
-
 
287
 
-
 
288
    ex_stack = (exec_stack_t*)(ex_stack_page + OS_BASE
337
    ex_stack = (exec_stack_t*)(ex_stack_page + OS_BASE
289
                               + PAGE_SIZE - stack_size);
338
                               + PAGE_SIZE - stack_size);
290
    ex_stack->argc = 2;
339
    ex_stack->argc = 2;
Line 291... Line 340...
291
 
340
 
Line 292... Line 341...
292
    ex_path = MakePtr(char*, ex_stack, sizeof(exec_stack_t)+AUX_COUNT*sizeof(auxv_t));
341
    ex_path = MakePtr(char*, ex_stack, sizeof(exec_stack_t)+AUX_COUNT*sizeof(auxv_t));
293
 
342
 
Line 294... Line 343...
294
    memcpy(ex_path, path, pathsize);
343
    memcpy(ex_path, path, pathsize);
295
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FCFF000);  /* top of stack */
344
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FFFF000);  /* top of stack */
296
 
345
 
297
    if( cmdline )
346
    if( cmdline )
Line 308... Line 357...
308
 
357
 
Line 309... Line 358...
309
    DBG("create stack at %x\n\tpath %x\n\tcmdline %x\n",
358
    DBG("create stack at %x\n\tpath %x\n\tcmdline %x\n",
310
         ex_stack, ex_stack->path, ex_stack->cmdline);
359
         ex_stack, ex_stack->path, ex_stack->cmdline);
Line 311... Line 360...
311
 
360
 
312
    pe_app_param(path, raw, ex_pg_dir, ex_stack_page);
361
    pe_app_param(path, raw, ex_pg_dir, ex_stack);
313
    return 0;
362
    return 0;
Line 314... Line 363...
314
};
363
};
Line -... Line 364...
-
 
364
 
-
 
365
#define  master_tab    (page_tabs+ (page_tabs>>10))
-
 
366
 
-
 
367
typedef struct
-
 
368
{
-
 
369
    u32_t edi;
-
 
370
    u32_t esi;
-
 
371
    u32_t ebp;
-
 
372
    u32_t esp;
-
 
373
    u32_t ebx;
-
 
374
    u32_t edx;
-
 
375
    u32_t ecx;
-
 
376
    u32_t eax;
-
 
377
    u32_t eip;
-
 
378
    u32_t cs;
-
 
379
    u32_t eflags;
-
 
380
    u32_t pe_sp;
-
 
381
    u32_t pe_ss;
-
 
382
}thr_stack_t;
-
 
383
 
-
 
384
#define EFL_IF      0x0200
-
 
385
#define EFL_IOPL1   0x1000
315
 
386
#define EFL_IOPL2   0x2000
316
#define  master_tab    (page_tabs+ (page_tabs>>10))
387
#define EFL_IOPL3   0x3000
317
 
388
 
318
void sys_app_entry(addr_t raw, addr_t ex_stack)
389
void sys_app_entry(addr_t raw, thr_stack_t *thr_stack, exec_stack_t *ex_stack)
Line 319... Line 390...
319
{
390
{
320
    PIMAGE_DOS_HEADER     dos;
391
    PIMAGE_DOS_HEADER     dos;
321
    PIMAGE_NT_HEADERS32   nt;
-
 
322
 
392
    PIMAGE_NT_HEADERS32   nt;
323
    size_t   img_size;
393
 
Line 324... Line 394...
324
    count_t  img_pages;
394
    size_t   img_size;
Line 325... Line -...
325
    count_t  img_tabs;
-
 
326
    count_t  i;
-
 
327
    u32_t    tmp;
395
    count_t  img_pages;
328
 
396
    count_t  i;
Line 329... Line 397...
329
    __asm__ __volatile__ ("sti");
397
    u32_t    tmp;
Line 330... Line 398...
330
 
398
 
331
    DBG("pe_app_entry: raw %x esp %x\n", raw, ex_stack);
-
 
332
 
-
 
333
    dos = (PIMAGE_DOS_HEADER)raw;
-
 
334
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
335
 
-
 
336
    img_size  =  nt->OptionalHeader.SizeOfImage;
-
 
337
 
-
 
338
    img_pages = img_size >> 12;
-
 
339
    img_tabs  = ((img_size + 0x3FFFFF) & ~0x3FFFFF) >> 22;
-
 
Line 340... Line 399...
340
 
399
    __asm__ __volatile__ ("sti");
Line 341... Line 400...
341
    DBG("app pages %d app tabs %d\n", img_pages, img_tabs);
400
 
342
 
-
 
343
    for(i = 0; i < img_tabs; i++)
-
 
344
    {
-
 
345
        addr_t tab = core_alloc(0);
-
 
346
        ((u32_t*)master_tab)[i] = tab|7;                            /*   FIXME     */
-
 
Line 347... Line 401...
347
    }
401
    dos = (PIMAGE_DOS_HEADER)raw;
348
 
402
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
349
    ((u32_t*)master_tab)[0x7FC/4] = (ex_stack & 0xFFFFF000)|7;                                /*   FIXME     */
403
 
350
 
404
    img_size  =  nt->OptionalHeader.SizeOfImage;
351
    __asm__ __volatile__ (
405
 
Line -... Line 406...
-
 
406
    current_slot->mem_size  = img_size;
-
 
407
 
-
 
408
    list_initialize(¤t_slot->dll_list);
352
    "xorl %%eax, %%eax      \n\t"
409
 
Line -... Line 410...
-
 
410
    img_pages = img_size >> 12;
-
 
411
 
-
 
412
    for(i = 0; i < img_pages; i++)
-
 
413
    {
-
 
414
        addr_t page = core_alloc(0);
353
    "rep stosl"
415
        ((u32_t*)page_tabs)[i] = page | 7;                          /*   FIXME     */
-
 
416
    }
-
 
417
 
-
 
418
    addr_t stack_page = ((addr_t)ex_stack-OS_BASE) & ~4095;
-
 
419
    ((u32_t*)page_tabs)[0x7FFFF000>>12] = stack_page | 7;
354
    :"=c"(tmp),"=D"(tmp)
420
 
Line 355... Line 421...
355
    :"c"(img_tabs<<10),"D"(page_tabs)
421
    create_image(0, raw);
356
    :"eax","cc");
422
 
Line -... Line 423...
-
 
423
    init_user_heap();
-
 
424
 
-
 
425
    if (! link_pe(0))
-
 
426
    {
-
 
427
        DBG("\nunresolved imports\nexit\n");
-
 
428
        __asm__ __volatile__ (
-
 
429
        "int $0x40"::"a"(-1));
-
 
430
    };
-
 
431
 
-
 
432
//    __asm__ __volatile__ (
-
 
433
//    "xchgw %bx, %bx");
-
 
434
 
-
 
435
    addr_t entry = nt->OptionalHeader.AddressOfEntryPoint +
-
 
436
                   nt->OptionalHeader.ImageBase;
-
 
437
 
-
 
438
    thr_stack->edi = 0;
-
 
439
    thr_stack->esi = 0;
-
 
440
    thr_stack->ebp = 0;
-
 
441
    thr_stack->ebx = 0;
-
 
442
    thr_stack->edx = 0;
-
 
443
    thr_stack->ecx = 0;
-
 
444
    thr_stack->eax = 0;
-
 
445
    thr_stack->eip = entry;
-
 
446
    thr_stack->cs  = 0x1b;
-
 
447
    thr_stack->eflags = EFL_IOPL3 | EFL_IF;
-
 
448
    thr_stack->pe_sp = 0x7FFFF000 + ((u32_t)ex_stack & 0xFFF);
-
 
449
    thr_stack->pe_ss = 0x23;
-
 
450
 
-
 
451
};
-
 
452
 
357
 
453
void* __stdcall user_alloc(size_t size) asm("user_alloc");
-
 
454
void  __stdcall user_free(void *mem) asm("user_free");
-
 
455
 
-
 
456
dll_t* __fastcall load_dll(const char *path)
-
 
457
{
-
 
458
    PIMAGE_DOS_HEADER        dos;
-
 
459
    PIMAGE_NT_HEADERS32      nt;
358
    for(i = 0; i < img_pages; i++)
460
    PIMAGE_EXPORT_DIRECTORY  exp;
-
 
461
 
-
 
462
    md_t    *img_md;
-
 
463
 
-
 
464
    size_t   img_size;
-
 
465
    addr_t   img_base;
-
 
466
    count_t  img_pages;
-
 
467
 
-
 
468
    size_t   raw_size = 0;
-
 
469
    void    *raw;
-
 
470
 
-
 
471
    DBG("\nload dll %s", path);
-
 
472
 
-
 
473
    raw = load_file(path, &raw_size);
-
 
474
 
-
 
475
    DBG("  raw = %x\n", raw);
-
 
476
 
-
 
477
    if( ! raw)
-
 
478
    {
Line -... Line 479...
-
 
479
        DBG("file not found: %s\n", path);
-
 
480
        return NULL;
-
 
481
    };
-
 
482
 
-
 
483
    if( ! validate_pe(raw, raw_size) )
-
 
484
    {
-
 
485
        DBG("invalid pe file %s\n", path);
-
 
486
        mem_free(raw);
-
 
487
        return NULL;
-
 
488
    }
-
 
489
 
-
 
490
    dos = (PIMAGE_DOS_HEADER)raw;
-
 
491
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
492
 
-
 
493
    img_size  =  nt->OptionalHeader.SizeOfImage;
-
 
494
 
-
 
495
    img_base = (addr_t)user_alloc(img_size);
-
 
496
    if( !img_base)
-
 
497
    {
-
 
498
        mem_free(raw);
-
 
499
        return NULL;
-
 
500
    };
-
 
501
 
-
 
502
    dll_t *dll = (dll_t*)slab_alloc(dll_slab,0);         /* FIXME check */
-
 
503
    if( !dll)
-
 
504
    {
-
 
505
        mem_free(raw);
-
 
506
        user_free((void*)img_base);
-
 
507
        return NULL;
-
 
508
    };
-
 
509
 
-
 
510
    create_image(img_base, (addr_t)raw);
-
 
511
 
-
 
512
    mem_free(raw);
-
 
513
 
-
 
514
    dos = (PIMAGE_DOS_HEADER)img_base;
-
 
515
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
516
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
-
 
517
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
-
 
518
 
-
 
519
    dll->img_base = img_base;
-
 
520
    dll->img_size = nt->OptionalHeader.SizeOfImage;
-
 
521
    dll->img_md   = NULL;
-
 
522
 
-
 
523
    dll->img_hdr  = nt;
-
 
524
    dll->img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
-
 
525
    dll->img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
-
 
526
                            nt->OptionalHeader.DataDirectory[0].VirtualAddress);
-
 
527
    dll->img_name = strupr(MakePtr(char*, img_base, exp->Name));
-
 
528
 
-
 
529
    list_insert(¤t_slot->dll_list, &dll->link);
-
 
530
 
-
 
531
    return dll;
-
 
532
};
-
 
533
 
-
 
534
bool link_pe(addr_t img_base)
-
 
535
{
-
 
536
    PIMAGE_DOS_HEADER     dos;
-
 
537
    PIMAGE_NT_HEADERS32   nt;
359
    {
538
    char path[128];
-
 
539
 
-
 
540
    int warn = 0;
-
 
541
 
-
 
542
/* assumed that image is valid */
-
 
543
 
-
 
544
    dos = (PIMAGE_DOS_HEADER)img_base;
-
 
545
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
-
 
546
 
-
 
547
    if(nt->OptionalHeader.DataDirectory[1].Size)
-
 
548
    {
-
 
549
        PIMAGE_IMPORT_DESCRIPTOR imp;
-
 
550
 
-
 
551
        imp = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, img_base,
-
 
552
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
-
 
553
 
-
 
554
        while ( 1 )
-
 
555
        {
-
 
556
            PIMAGE_THUNK_DATA32     thunk;
-
 
557
 
-
 
558
            PIMAGE_DOS_HEADER       expdos;
-
 
559
            PIMAGE_NT_HEADERS32     expnt;
Line -... Line 560...
-
 
560
            PIMAGE_EXPORT_DIRECTORY exp;
-
 
561
 
-
 
562
            u32_t   *iat;
-
 
563
            char    *libname;
-
 
564
            addr_t  *functions;
-
 
565
            u16_t   *ordinals;
-
 
566
            char   **funcname;
-
 
567
 
-
 
568
            dll_t   *exp_dll;
-
 
569
 
-
 
570
            if ( (imp->TimeDateStamp==0 ) && (imp->Name==0) )
-
 
571
                break;
-
 
572
 
-
 
573
            libname=MakePtr(char*,imp->Name, img_base);
-
 
574
 
-
 
575
            DBG("import from %s\n",libname);
-
 
576
 
360
        addr_t page = core_alloc(0);
577
            exp_dll = find_dll(¤t_slot->dll_list, libname);
-
 
578
            if(exp_dll != NULL)
-
 
579
            {
-
 
580
                DBG("find %s\n", exp_dll->img_name);
-
 
581
            }
-
 
582
            else
-
 
583
            {
-
 
584
                int len = strlen(libname)+1;
-
 
585
 
-
 
586
                memcpy(path, "/sys/lib/",9);
-
 
587
                memcpy(&path[9],libname,len);
-
 
588
 
-
 
589
                exp_dll = load_dll(path);
-
 
590
                if( !exp_dll)
-
 
591
                {
-
 
592
                    DBG("can't load %s\n", path);
-
 
593
                    return false;
-
 
594
                };
-
 
595
            }
-
 
596
 
-
 
597
            exp = exp_dll->img_exp;
-
 
598
 
-
 
599
            functions = MakePtr(DWORD*,exp->AddressOfFunctions,exp_dll->img_base);
-
 
600
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
-
 
601
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
-
 
602
 
-
 
603
            thunk = MakePtr(PIMAGE_THUNK_DATA32,
-
 
604
                            imp->Characteristics, img_base);
-
 
605
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
-
 
606
 
-
 
607
            while ( 1 ) // Loop forever (or until we break out)
-
 
608
            {
-
 
609
                PIMAGE_IMPORT_BY_NAME ord;
-
 
610
                addr_t addr;
-
 
611
 
-
 
612
                if ( thunk->u1.AddressOfData == 0 )
-
 
613
                    break;
-
 
614
 
-
 
615
                if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
-
 
616
                {
-
 
617
        //  printf("  %4u\n", thunk->u1.Ordinal & 0xFFFF);
-
 
618
                    break;
-
 
619
                }
-
 
620
                else
-
 
621
                {
-
 
622
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
-
 
623
                                  thunk->u1.AddressOfData, img_base);
-
 
624
                    *iat=0;
-
 
625
 
-
 
626
                    DBG("import %s", ord->Name);
-
 
627
 
-
 
628
                    if(strncmp(ord->Name,
-
 
629
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
-
 
630
                    {
-
 
631
                        int ind;
-
 
632
                        char **names=funcname;
-
 
633
 
-
 
634
                        for(names = funcname,ind = 0;
-
 
635
                            ind < exp->NumberOfNames; names++,ind++)
-
 
636
                        {
-
 
637
                            if(!strncmp(ord->Name,MakePtr(char*,*names,exp_dll->img_base),32))
-
 
638
                            {
-
 
639
                                u16_t ordinal;
-
 
640
                                ordinal = ordinals[ind];
-
 
641
                                DBG(" \t\tat %x\n", functions[ordinal] + exp_dll->img_base);
-
 
642
                                *iat = functions[ordinal] + exp_dll->img_base;
-
 
643
                                break;
-
 
644
                            };
-
 
645
                        };
-
 
646
                        if(ind == exp->NumberOfNames)
-
 
647
                        {
-
 
648
                            DBG(" unresolved import %s\n",ord->Name);
-
 
649
                            warn=1;
-
 
650
                        };
-
 
651
                    }
-
 
652
                    else
-
 
653
                    {