Subversion Repositories Kolibri OS

Rev

Rev 908 | Rev 928 | Go to most recent revision | 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
    md_t          *md;
176
    srv_t         *srv;
177
178
 
179
180
 
181
        return 0;
182
183
 
892 serge 184
    {
890 serge 185
        dos = (PIMAGE_DOS_HEADER)md->base;
892 serge 186
        nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
187
890 serge 188
 
892 serge 189
                            nt->OptionalHeader.AddressOfEntryPoint);
190
890 serge 191
 
892 serge 192
890 serge 193
 
892 serge 194
            srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base;
195
890 serge 196
 
892 serge 197
    }
890 serge 198
    else
892 serge 199
    {
890 serge 200
        md_free( md );
892 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
    PIMAGE_DOS_HEADER     dos;
908 serge 238
    PIMAGE_NT_HEADERS32   nt;
239
240
 
241
    count_t  img_pages;
242
    count_t  img_tabs;
243
    addr_t        ex_pg_dir;
897 serge 244
    addr_t        ex_stack_page;
245
    addr_t        ex_pl0_stack;
246
247
 
248
    int           stack_size;
249
    char         *ex_path;
250
    char         *ex_cmdline = NULL;
251
252
 
253
    u32_t        *raw;
254
255
 
256
    int cmdsize  = 0;
257
    int envsize  = 0;
258
259
 
260
261
 
262
263
 
264
    {
265
        DBG("invalid path\n");
266
        return;
267
    };
268
269
 
270
271
 
272
        return -5;                                      /* FIXME */
273
274
 
275
        ( ( raw[1] == 0x31305445) ||
276
          ( raw[1] == 0x30305445) ) )
277
278
 
279
        DBG("leagacy Kolibri application");
914 serge 280
        int tmp =  mnt_exec(raw, raw_size, path, cmdline, flags);
897 serge 281
        DBG("  pid %x\n",tmp);
914 serge 282
        return tmp;
897 serge 283
    }
284
285
 
914 serge 286
    {
897 serge 287
        DBG("invalid executable file %s\n", path);
288
        mem_free(raw);
289
        return -31;
290
    }
291
292
 
914 serge 293
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
294
295
 
897 serge 296
297
 
298
        cmdsize = strlen(cmdline)+1;
299
300
 
301
                 cmdsize + envsize + AUX_COUNT*sizeof(auxv_t);
302
303
 
304
305
 
306
307
 
308
    {
309
        DBG("command line too long\n");
310
        return -30;
311
    }
312
313
 
908 serge 314
    if( ! ex_stack_page )
315
    {
897 serge 316
        mem_free(raw);
317
        return -30;                                    /* FIXME          */
318
    };
319
320
 
908 serge 321
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
322
897 serge 323
 
908 serge 324
897 serge 325
 
908 serge 326
327
 
328
    {
897 serge 329
        core_free(ex_stack_page);
908 serge 330
        mem_free(raw);
897 serge 331
        return -30;                                    /* FIXME          */
332
    };
333
334
 
335
    "xorl %%eax, %%eax      \n\t"
336
    "rep stosl"
337
    :"=c"(tmp),"=D"(tmp)
338
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
339
    :"eax","cc");
340
341
 
342
                               + PAGE_SIZE - stack_size);
343
    ex_stack->argc = 2;
344
345
 
346
347
 
348
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FFFF000);  /* top of stack */
908 serge 349
897 serge 350
 
351
    {
352
        ex_cmdline = ex_path + pathsize;
353
        memcpy(ex_cmdline, cmdline, cmdsize);
354
        ex_stack->cmdline = ex_stack->path + pathsize;
355
    };
356
357
 
358
    ex_stack.env = null
359
    ex_stack.aux[0] = AT_NULL
360
 */
361
362
 
363
         ex_stack, ex_stack->path, ex_stack->cmdline);
364
365
 
914 serge 366
};
897 serge 367
368
 
369
370
 
908 serge 371
{
897 serge 372
    u32_t edi;
908 serge 373
    u32_t esi;
374
    u32_t ebp;
375
    u32_t esp;
376
    u32_t ebx;
377
    u32_t edx;
378
    u32_t ecx;
379
    u32_t eax;
380
    u32_t eip;
381
    u32_t cs;
382
    u32_t eflags;
383
    u32_t pe_sp;
384
    u32_t pe_ss;
385
}thr_stack_t;
386
387
 
388
#define EFL_IOPL1   0x1000
389
#define EFL_IOPL2   0x2000
390
#define EFL_IOPL3   0x3000
391
392
 
393
{
394
    PIMAGE_DOS_HEADER     dos;
897 serge 395
    PIMAGE_NT_HEADERS32   nt;
396
397
 
398
    count_t  img_pages;
399
    size_t   stack_size;
914 serge 400
    addr_t   img_stack;
401
    addr_t  *pte;
402
403
 
897 serge 404
    u32_t    tmp;
405
406
 
407
408
 
409
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
410
411
 
412
413
 
908 serge 414
897 serge 415
 
908 serge 416
897 serge 417
 
914 serge 418
    img_pages = img_size >> 12;
908 serge 419
897 serge 420
 
914 serge 421
    img_stack = 0x7FFFF000 - stack_size;
422
    stack_size>>= 12;
423
897 serge 424
 
914 serge 425
        *pte++ = 2;
426
427
 
428
429
 
430
        *pte++ = 0x02;
431
432
 
908 serge 433
434
 
914 serge 435
897 serge 436
 
914 serge 437
438
 
908 serge 439
897 serge 440
 
908 serge 441
    {
442
        DBG("\nunresolved imports\nexit\n");
443
        __asm__ __volatile__ (
444
        "int $0x40"::"a"(-1));
445
    };
446
447
 
448
 
914 serge 449
 //   "xchgw %bx, %bx");
450
451
 
897 serge 452
                   nt->OptionalHeader.ImageBase;
453
454
 
908 serge 455
    thr_stack->esi = 0;
456
    thr_stack->ebp = 0;
457
    thr_stack->ebx = 0;
458
    thr_stack->edx = 0;
459
    thr_stack->ecx = 0;
460
    thr_stack->eax = 0;
461
    thr_stack->eip = entry;
462
    thr_stack->cs  = 0x1b;
463
    thr_stack->eflags = EFL_IOPL3 | EFL_IF;
464
    thr_stack->pe_sp = 0x7FFFF000 + ((u32_t)ex_stack & 0xFFF);
465
    thr_stack->pe_ss = 0x23;
466
897 serge 467
 
908 serge 468
897 serge 469
 
908 serge 470
void  __stdcall user_free(void *mem) asm("user_free");
471
472
 
473
{
474
    PIMAGE_DOS_HEADER        dos;
475
    PIMAGE_NT_HEADERS32      nt;
476
    PIMAGE_EXPORT_DIRECTORY  exp;
477
478
 
479
480
 
481
    addr_t   img_base;
482
    count_t  img_pages;
483
484
 
485
    void    *raw;
486
487
 
488
489
 
490
491
 
492
493
 
494
    {
495
        DBG("file not found: %s\n", path);
496
        return NULL;
497
    };
498
499
 
914 serge 500
    {
908 serge 501
        DBG("invalid pe file %s\n", path);
502
        mem_free(raw);
503
        return NULL;
504
    }
505
506
 
507
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
508
509
 
510
511
 
512
    if( !img_base)
513
    {
514
        mem_free(raw);
515
        return NULL;
516
    };
517
518
 
519
    if( !dll)
520
    {
521
        mem_free(raw);
522
        user_free((void*)img_base);
523
        return NULL;
524
    };
525
526
 
914 serge 527
908 serge 528
 
529
530
 
531
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
532
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
533
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
534
535
 
536
    dll->img_size = nt->OptionalHeader.SizeOfImage;
537
    dll->img_md   = NULL;
538
539
 
540
    dll->img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
541
    dll->img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
542
                            nt->OptionalHeader.DataDirectory[0].VirtualAddress);
543
    dll->img_name = strupr(MakePtr(char*, img_base, exp->Name));
544
545
 
546
547
 
548
};
897 serge 549
908 serge 550
 
551
{
552
    PIMAGE_DOS_HEADER     dos;
553
    PIMAGE_NT_HEADERS32   nt;
554
    char path[128];
555
556
 
557
558
 
559
560
 
561
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
562
563
 
564
    {
565
        PIMAGE_IMPORT_DESCRIPTOR imp;
566
567
 
568
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
569
570
 
571
        {
572
            PIMAGE_THUNK_DATA32     thunk;
573
574
 
575
            PIMAGE_NT_HEADERS32     expnt;
576
            PIMAGE_EXPORT_DIRECTORY exp;
577
578
 
579
            char    *libname;
580
            addr_t  *functions;
581
            u16_t   *ordinals;
582
            char   **funcname;
583
584
 
585
586
 
587
                break;
588
589
 
590
591
 
592
593
 
594
            if(exp_dll != NULL)
595
            {
596
                DBG("find %s\n", exp_dll->img_name);
597
            }
598
            else
599
            {
600
                int len = strlen(libname)+1;
601
602
 
603
                memcpy(&path[9],libname,len);
604
605
 
606
                if( !exp_dll)
607
                {
608
                    DBG("can't load %s\n", path);
609
                    return false;
610
                };
611
            }
612
613
 
614
615
 
616
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
617
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
618
619
 
620
                            imp->Characteristics, img_base);
621
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
622
623
 
624
            {
625
                PIMAGE_IMPORT_BY_NAME ord;
626
                addr_t addr;
627
                *iat=0;
914 serge 628
908 serge 629
 
630
                    break;
631
632
 
633
                {
634
                   u16_t ordinal;
914 serge 635
                   ordinal = thunk->u1.Ordinal & 0xFFFF;
636
                   *iat = functions[ordinal-exp->Base] + exp_dll->img_base;
637
                    break;
908 serge 638
                }
639
                else
640
                {
641
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
642
                                  thunk->u1.AddressOfData, img_base);
643
644
 
914 serge 645
908 serge 646
 
647
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
648
                    {
649
                        int ind;
650
                        char **names=funcname;
651
652
 
653
                            ind < exp->NumberOfNames; names++,ind++)
654
                        {
655
                            if(!strncmp(ord->Name,MakePtr(char*,*names,exp_dll->img_base),32))
656
                            {
657
                                u16_t ordinal;
658
                                ordinal = ordinals[ind];
659
                                DBG("ordinal %d\t\tat %x\n", ordinal, functions[ordinal] + exp_dll->img_base);
914 serge 660
                                *iat = functions[ordinal] + exp_dll->img_base;
908 serge 661
                                break;
662
                            };
663
                        };
664
                        if(ind == exp->NumberOfNames)
665
                        {
666
                            DBG(" unresolved import %s\n",ord->Name);
667
                            warn=1;
668
                        };
669
                    }
670
                    else
671
                    {
672
                        DBG(" \tat %x\n", functions[ord->Hint] + exp_dll->img_base);
673
                        *iat = functions[ord->Hint] + exp_dll->img_base;
674
                    };
675
                };
676
                thunk++;            // Advance to next thunk
677
                iat++;
678
            }
679
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
680
        };
681
    };
682
683
 
684
        return true;
685
    else
686
        return false;
687
}
688