Subversion Repositories Kolibri OS

Rev

Rev 1066 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
890 serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include 
892 serge 8
890 serge 9
 
908 serge 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
 
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
 
30
  char    *cur_dir;                         /*      +80       */
31
  count_t  wait_timeout;                    /*      +84       */
32
  addr_t   saved_esp0;                      /*      +88       */
33
34
 
35
36
 
37
38
 
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
 
47
48
 
49
50
 
892 serge 51
890 serge 52
 
897 serge 53
              char *cmdline, u32_t flags) asm ("mnt_exec");
54
55
 
908 serge 56
890 serge 57
 
908 serge 58
59
 
892 serge 60
{
890 serge 61
    char *p;
892 serge 62
    unsigned char c;
63
890 serge 64
 
892 serge 65
    while( (c = *p) )
66
    {
890 serge 67
        if( c >= 'a' && c <= 'z' )
892 serge 68
            *p = c - 'a' + 'A';
69
        ++p;
70
    }
71
890 serge 72
 
892 serge 73
}
74
890 serge 75
 
897 serge 76
{
77
int d0, d1, d2;
78
 __asm__ __volatile__(
79
	"rep ; movsl\n\t"
80
	"testb $2,%b4\n\t"
81
	"je 1f\n\t"
82
	"movsw\n"
83
	"1:\ttestb $1,%b4\n\t"
84
	"je 2f\n\t"
85
	"movsb\n"
86
	"2:"
87
	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
88
	:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src)
89
	: "memory");
90
 return (_dest);
91
}
92
93
 
94
{
95
int d0;
96
register int __res;
97
__asm__ __volatile__(
98
	"repne\n\t"
99
	"scasb\n\t"
100
	"notl %0\n\t"
101
	"decl %0"
102
	:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff));
103
return __res;
104
}
105
106
 
892 serge 107
{
890 serge 108
    PIMAGE_DOS_HEADER        dos;
892 serge 109
    PIMAGE_NT_HEADERS32      nt;
110
    PIMAGE_EXPORT_DIRECTORY  exp;
111
890 serge 112
 
892 serge 113
    nt  =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
114
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
115
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
116
890 serge 117
 
892 serge 118
890 serge 119
 
892 serge 120
    core_dll.img_size = nt->OptionalHeader.SizeOfImage;
121
    core_dll.img_md   = NULL;
122
890 serge 123
 
892 serge 124
    core_dll.img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
125
    core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
126
                        nt->OptionalHeader.DataDirectory[0].VirtualAddress);
127
    core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
128
890 serge 129
 
908 serge 130
131
 
892 serge 132
        core_dll.img_name, core_dll.img_base,
133
        core_dll.img_size, nt->FileHeader.NumberOfSections,
134
        core_dll.img_exp );
135
};
136
890 serge 137
 
138
 
908 serge 139
{
890 serge 140
    dll_t* dll = (dll_t*)list;
908 serge 141
890 serge 142
 
892 serge 143
    {
144
        if( !strncmp(name,dll->img_name,16))
145
            return dll;
146
890 serge 147
 
892 serge 148
890 serge 149
 
908 serge 150
890 serge 151
 
892 serge 152
};
890 serge 153
154
 
155
 
156
{
157
  char         srv_name[16];  //        ASCIIZ string
158
  u32_t        magic;         // +0x10  'SRV '
159
  size_t       size;          // +0x14  size of structure SRV
160
  void        *fd;            // +0x18  next SRV descriptor
161
  void        *bk;            // +0x1C  prev SRV descriptor
162
  addr_t       base;          // +0x20  service base address
163
  addr_t       entry;         // +0x24  service START function
164
  void        *srv_proc;      // +0x28  main service handler
165
}srv_t;
166
167
 
168
169
 
170
{
171
    PIMAGE_DOS_HEADER     dos;
172
    PIMAGE_NT_HEADERS32   nt;
173
174
 
175
    addr_t        *img_base ;
1066 serge 176
    srv_t         *srv;
890 serge 177
178
 
1066 serge 179
890 serge 180
 
1066 serge 181
        return 0;
890 serge 182
183
 
1066 serge 184
    {
890 serge 185
        dos = (PIMAGE_DOS_HEADER)img_base;
1066 serge 186
        nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
892 serge 187
890 serge 188
 
1066 serge 189
                            nt->OptionalHeader.AddressOfEntryPoint);
892 serge 190
890 serge 191
 
892 serge 192
890 serge 193
 
892 serge 194
            srv->entry = nt->OptionalHeader.AddressOfEntryPoint + img_base;
1066 serge 195
890 serge 196
 
892 serge 197
    }
890 serge 198
    else
892 serge 199
    {
890 serge 200
        mem_free( img_base );
1066 serge 201
        return NULL;
890 serge 202
    }
203
}
892 serge 204
890 serge 205
 
897 serge 206
{
207
    int a_type;
208
    union
209
    {
210
        long  a_val;
211
        void *a_ptr;
212
        void  (*a_fcn)( ) ;
213
    }a_un;
214
}auxv_t;
215
216
 
217
218
 
219
{
220
    int     argc;       /*  always 2                                */
221
    char   *path;       /*  argv[0]   program path                  */
222
    char   *cmdline;    /*  argv[1]   command  line. May be null    */
223
    u32_t   sep1;       /*  separator.  must be zero                */
224
    char   *env;        /*  single environment string               */
225
    u32_t   sep2;       /*  separator.  must be zero                */
226
    auxv_t  aux[1];     /*  aux. AT_NULL for now                    */
227
}exec_stack_t;
228
229
 
230
 
908 serge 231
897 serge 232
 
233
                          exec_stack_t *ex_stack) asm ("pe_app_param");
908 serge 234
897 serge 235
 
236
{
237
2971 Serge 238
 
908 serge 239
    PIMAGE_NT_HEADERS32   nt;
240
241
 
242
    count_t  img_pages;
243
    count_t  img_tabs;
244
2971 Serge 245
 
897 serge 246
    addr_t        ex_stack_page;
247
    addr_t        ex_pl0_stack;
248
249
 
250
    int           stack_size;
251
    char         *ex_path;
252
    char         *ex_cmdline = NULL;
253
254
 
255
    u32_t        *raw;
256
257
 
258
    int cmdsize  = 0;
259
    int envsize  = 0;
260
261
 
262
263
 
264
265
 
266
    {
267
        DBG("invalid path\n");
268
        return;
269
    };
270
271
 
272
273
 
274
        return -5;                                      /* FIXME */
275
276
 
277
        ( ( raw[1] == 0x31305445) ||
278
          ( raw[1] == 0x30305445) ) )
279
280
 
281
        DBG("leagacy Kolibri application\n");
1066 serge 282
        int tmp =  mnt_exec(raw, raw_size, path, cmdline, flags);
897 serge 283
        DBG("pid %x\n",tmp);
1066 serge 284
        return tmp;
897 serge 285
    }
286
287
 
914 serge 288
    {
897 serge 289
        DBG("invalid executable file %s\n", path);
290
        mem_free(raw);
291
        return -31;
292
    }
293
294
 
914 serge 295
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
296
297
 
897 serge 298
299
 
300
        cmdsize = strlen(cmdline)+1;
301
302
 
303
                 cmdsize + envsize + AUX_COUNT*sizeof(auxv_t);
304
305
 
306
307
 
308
309
 
310
    {
311
        DBG("command line too long\n");
312
        return -30;
313
    }
314
315
 
1066 serge 316
    if( ! ex_stack_page )
908 serge 317
    {
897 serge 318
        mem_free(raw);
319
        return -30;                                    /* FIXME          */
320
    };
321
322
 
908 serge 323
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
324
897 serge 325
 
908 serge 326
897 serge 327
 
908 serge 328
329
 
330
    {
897 serge 331
        frame_free(ex_stack_page);
1066 serge 332
        mem_free(raw);
897 serge 333
        return -30;                                    /* FIXME          */
334
    };
335
336
 
337
    "xorl %%eax, %%eax      \n\t"
338
    "rep stosl"
339
    :"=c"(tmp),"=D"(tmp)
340
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
341
    :"eax","cc");
342
343
 
344
                               + PAGE_SIZE - stack_size);
345
    ex_stack->argc = 2;
346
347
 
348
349
 
350
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FFFF000);  /* top of stack */
908 serge 351
897 serge 352
 
353
    {
354
        ex_cmdline = ex_path + pathsize;
355
        memcpy(ex_cmdline, cmdline, cmdsize);
356
        ex_stack->cmdline = ex_stack->path + pathsize;
357
    };
358
359
 
360
    ex_stack.env = null
361
    ex_stack.aux[0] = AT_NULL
362
 */
363
364
 
365
         ex_stack, ex_stack->path, ex_stack->cmdline);
366
367
 
914 serge 368
};
897 serge 369
370
 
371
 
908 serge 372
{
897 serge 373
    u32_t edi;
908 serge 374
    u32_t esi;
375
    u32_t ebp;
376
    u32_t esp;
377
    u32_t ebx;
378
    u32_t edx;
379
    u32_t ecx;
380
    u32_t eax;
381
    u32_t eip;
382
    u32_t cs;
383
    u32_t eflags;
384
    u32_t pe_sp;
385
    u32_t pe_ss;
386
}thr_stack_t;
387
388
 
389
{
390
    PIMAGE_DOS_HEADER     dos;
897 serge 391
    PIMAGE_NT_HEADERS32   nt;
392
393
 
394
    count_t  img_pages;
395
    size_t   stack_size;
914 serge 396
    addr_t   img_stack;
397
    addr_t  *pte;
398
399
 
897 serge 400
    u32_t    tmp;
401
402
 
403
404
 
405
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
406
407
 
408
409
 
908 serge 410
897 serge 411
 
908 serge 412
897 serge 413
 
914 serge 414
    img_pages = img_size >> 12;
908 serge 415
897 serge 416
 
914 serge 417
    img_stack = 0x7FFFF000 - stack_size;
418
    stack_size>>= 12;
419
897 serge 420
 
914 serge 421
        *pte++ = 2;
422
423
 
424
425
 
426
        *pte++ = 0x02;
427
428
 
908 serge 429
430
 
914 serge 431
897 serge 432
 
914 serge 433
434
 
908 serge 435
897 serge 436
 
908 serge 437
    {
438
        DBG("\nunresolved imports\nexit\n");
439
        __asm__ __volatile__ (
440
        "int $0x40"::"a"(-1));
441
    };
442
443
 
444
 
914 serge 445
 //   "xchgw %bx, %bx");
446
447
 
897 serge 448
                   nt->OptionalHeader.ImageBase;
449
450
 
908 serge 451
    thr_stack->esi = 0;
452
    thr_stack->ebp = 0;
453
    thr_stack->ebx = 0;
454
    thr_stack->edx = 0;
455
    thr_stack->ecx = 0;
456
    thr_stack->eax = 0;
457
    thr_stack->eip = entry;
458
    thr_stack->cs  = sel_app_code;
996 serge 459
    thr_stack->eflags = EFL_IOPL3 | EFL_IF;
908 serge 460
    thr_stack->pe_sp = 0x7FFFF000 + ((u32_t)ex_stack & 0xFFF);
461
    thr_stack->pe_ss = sel_app_data;
996 serge 462
897 serge 463
 
908 serge 464
897 serge 465
 
908 serge 466
void  __stdcall user_free(void *mem) asm("user_free");
467
468
 
469
{
470
    PIMAGE_DOS_HEADER        dos;
471
    PIMAGE_NT_HEADERS32      nt;
472
    PIMAGE_EXPORT_DIRECTORY  exp;
473
474
 
475
476
 
477
    addr_t   img_base;
478
    count_t  img_pages;
479
480
 
481
    void    *raw;
482
483
 
484
485
 
486
487
 
488
489
 
490
    {
491
        DBG("file not found: %s\n", path);
492
        return NULL;
493
    };
494
495
 
914 serge 496
    {
908 serge 497
        DBG("invalid pe file %s\n", path);
498
        mem_free(raw);
499
        return NULL;
500
    }
501
502
 
503
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
504
505
 
506
507
 
508
    if( !img_base)
509
    {
510
        mem_free(raw);
511
        return NULL;
512
    };
513
514
 
515
    if( !dll)
516
    {
517
        mem_free(raw);
518
        user_free((void*)img_base);
519
        return NULL;
520
    };
521
522
 
914 serge 523
908 serge 524
 
525
526
 
527
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
528
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
529
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
530
531
 
532
    dll->img_size = nt->OptionalHeader.SizeOfImage;
533
    dll->img_md   = NULL;
534
535
 
536
    dll->img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
537
    dll->img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
538
                            nt->OptionalHeader.DataDirectory[0].VirtualAddress);
539
    dll->img_name = strupr(MakePtr(char*, img_base, exp->Name));
540
541
 
542
543
 
544
};
897 serge 545
908 serge 546
 
547
{
548
    PIMAGE_DOS_HEADER     dos;
549
    PIMAGE_NT_HEADERS32   nt;
550
    char path[128];
551
552
 
553
554
 
555
556
 
557
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
558
559
 
560
    {
561
        PIMAGE_IMPORT_DESCRIPTOR imp;
562
563
 
564
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
565
566
 
567
        {
568
            PIMAGE_THUNK_DATA32     thunk;
569
570
 
571
            PIMAGE_NT_HEADERS32     expnt;
572
            PIMAGE_EXPORT_DIRECTORY exp;
573
574
 
575
            char    *libname;
576
            addr_t  *functions;
577
            u16_t   *ordinals;
578
            char   **funcname;
579
580
 
581
582
 
583
                break;
584
585
 
586
587
 
588
589
 
996 serge 590
            if(exp_dll == NULL)
591
            {
592
2971 Serge 593
 
908 serge 594
                if(exp_dll == NULL)
996 serge 595
            {
908 serge 596
                int len = strlen(libname)+1;
597
598
 
599
                memcpy(&path[9],libname,len);
600
601
 
602
                if( !exp_dll)
603
                {
604
                    DBG("can't load %s\n", path);
605
                    return false;
606
                };
607
            }
608
            };
996 serge 609
            DBG("find %s\n", exp_dll->img_name);
610
908 serge 611
 
612
613
 
614
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
615
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
616
617
 
618
                            imp->Characteristics, img_base);
619
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
620
621
 
622
            {
623
                PIMAGE_IMPORT_BY_NAME ord;
624
                addr_t addr;
625
                *iat=0;
914 serge 626
908 serge 627
 
628
                    break;
629
630
 
631
                {
632
                   u16_t ordinal;
914 serge 633
                   ordinal = thunk->u1.Ordinal & 0xFFFF;
634
                   *iat = functions[ordinal-exp->Base] + exp_dll->img_base;
635
                    break;
908 serge 636
                }
637
                else
638
                {
639
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
640
                                  thunk->u1.AddressOfData, img_base);
641
642
 
914 serge 643
908 serge 644
 
645
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
646
                    {
647
                        int ind;
648
                        char **names=funcname;
649
650
 
651
                            ind < exp->NumberOfNames; names++,ind++)
652
                        {
653
                            if(!strncmp(ord->Name,MakePtr(char*,*names,exp_dll->img_base),32))
654
                            {
655
                                u16_t ordinal;
656
                                ordinal = ordinals[ind];
657
                                DBG("ordinal %d\t\tat %x\n", ordinal, functions[ordinal] + exp_dll->img_base);
914 serge 658
                                *iat = functions[ordinal] + exp_dll->img_base;
908 serge 659
                                break;
660
                            };
661
                        };
662
                        if(ind == exp->NumberOfNames)
663
                        {
664
                            DBG(" unresolved import %s\n",ord->Name);
665
                            warn=1;
666
                        };
667
                    }
668
                    else
669
                    {
670
                        DBG(" \tat %x\n", functions[ord->Hint] + exp_dll->img_base);
671
                        *iat = functions[ord->Hint] + exp_dll->img_base;
672
                    };
673
                };
674
                thunk++;            // Advance to next thunk
675
                iat++;
676
            }
677
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
678
        };
679
    };
680
681
 
682
        return true;
683
    else
684
        return false;
685
}
686