Subversion Repositories Kolibri OS

Rev

Rev 914 | Rev 996 | 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
 
908 serge 370
{
897 serge 371
    u32_t edi;
908 serge 372
    u32_t esi;
373
    u32_t ebp;
374
    u32_t esp;
375
    u32_t ebx;
376
    u32_t edx;
377
    u32_t ecx;
378
    u32_t eax;
379
    u32_t eip;
380
    u32_t cs;
381
    u32_t eflags;
382
    u32_t pe_sp;
383
    u32_t pe_ss;
384
}thr_stack_t;
385
386
 
387
{
388
    PIMAGE_DOS_HEADER     dos;
897 serge 389
    PIMAGE_NT_HEADERS32   nt;
390
391
 
392
    count_t  img_pages;
393
    size_t   stack_size;
914 serge 394
    addr_t   img_stack;
395
    addr_t  *pte;
396
397
 
897 serge 398
    u32_t    tmp;
399
400
 
401
402
 
403
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
404
405
 
406
407
 
908 serge 408
897 serge 409
 
908 serge 410
897 serge 411
 
914 serge 412
    img_pages = img_size >> 12;
908 serge 413
897 serge 414
 
914 serge 415
    img_stack = 0x7FFFF000 - stack_size;
416
    stack_size>>= 12;
417
897 serge 418
 
914 serge 419
        *pte++ = 2;
420
421
 
422
423
 
424
        *pte++ = 0x02;
425
426
 
908 serge 427
428
 
914 serge 429
897 serge 430
 
914 serge 431
432
 
908 serge 433
897 serge 434
 
908 serge 435
    {
436
        DBG("\nunresolved imports\nexit\n");
437
        __asm__ __volatile__ (
438
        "int $0x40"::"a"(-1));
439
    };
440
441
 
442
 
914 serge 443
 //   "xchgw %bx, %bx");
444
445
 
897 serge 446
                   nt->OptionalHeader.ImageBase;
447
448
 
908 serge 449
    thr_stack->esi = 0;
450
    thr_stack->ebp = 0;
451
    thr_stack->ebx = 0;
452
    thr_stack->edx = 0;
453
    thr_stack->ecx = 0;
454
    thr_stack->eax = 0;
455
    thr_stack->eip = entry;
456
    thr_stack->cs  = 0x1b;
457
    thr_stack->eflags = EFL_IOPL3 | EFL_IF;
458
    thr_stack->pe_sp = 0x7FFFF000 + ((u32_t)ex_stack & 0xFFF);
459
    thr_stack->pe_ss = 0x23;
460
897 serge 461
 
908 serge 462
897 serge 463
 
908 serge 464
void  __stdcall user_free(void *mem) asm("user_free");
465
466
 
467
{
468
    PIMAGE_DOS_HEADER        dos;
469
    PIMAGE_NT_HEADERS32      nt;
470
    PIMAGE_EXPORT_DIRECTORY  exp;
471
472
 
473
474
 
475
    addr_t   img_base;
476
    count_t  img_pages;
477
478
 
479
    void    *raw;
480
481
 
482
483
 
484
485
 
486
487
 
488
    {
489
        DBG("file not found: %s\n", path);
490
        return NULL;
491
    };
492
493
 
914 serge 494
    {
908 serge 495
        DBG("invalid pe file %s\n", path);
496
        mem_free(raw);
497
        return NULL;
498
    }
499
500
 
501
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
502
503
 
504
505
 
506
    if( !img_base)
507
    {
508
        mem_free(raw);
509
        return NULL;
510
    };
511
512
 
513
    if( !dll)
514
    {
515
        mem_free(raw);
516
        user_free((void*)img_base);
517
        return NULL;
518
    };
519
520
 
914 serge 521
908 serge 522
 
523
524
 
525
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
526
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
527
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
528
529
 
530
    dll->img_size = nt->OptionalHeader.SizeOfImage;
531
    dll->img_md   = NULL;
532
533
 
534
    dll->img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
535
    dll->img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,img_base,
536
                            nt->OptionalHeader.DataDirectory[0].VirtualAddress);
537
    dll->img_name = strupr(MakePtr(char*, img_base, exp->Name));
538
539
 
540
541
 
542
};
897 serge 543
908 serge 544
 
545
{
546
    PIMAGE_DOS_HEADER     dos;
547
    PIMAGE_NT_HEADERS32   nt;
548
    char path[128];
549
550
 
551
552
 
553
554
 
555
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
556
557
 
558
    {
559
        PIMAGE_IMPORT_DESCRIPTOR imp;
560
561
 
562
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
563
564
 
565
        {
566
            PIMAGE_THUNK_DATA32     thunk;
567
568
 
569
            PIMAGE_NT_HEADERS32     expnt;
570
            PIMAGE_EXPORT_DIRECTORY exp;
571
572
 
573
            char    *libname;
574
            addr_t  *functions;
575
            u16_t   *ordinals;
576
            char   **funcname;
577
578
 
579
580
 
581
                break;
582
583
 
584
585
 
586
587
 
588
            if(exp_dll != NULL)
589
            {
590
                DBG("find %s\n", exp_dll->img_name);
591
            }
592
            else
593
            {
594
                int len = strlen(libname)+1;
595
596
 
597
                memcpy(&path[9],libname,len);
598
599
 
600
                if( !exp_dll)
601
                {
602
                    DBG("can't load %s\n", path);
603
                    return false;
604
                };
605
            }
606
607
 
608
609
 
610
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
611
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
612
613
 
614
                            imp->Characteristics, img_base);
615
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
616
617
 
618
            {
619
                PIMAGE_IMPORT_BY_NAME ord;
620
                addr_t addr;
621
                *iat=0;
914 serge 622
908 serge 623
 
624
                    break;
625
626
 
627
                {
628
                   u16_t ordinal;
914 serge 629
                   ordinal = thunk->u1.Ordinal & 0xFFFF;
630
                   *iat = functions[ordinal-exp->Base] + exp_dll->img_base;
631
                    break;
908 serge 632
                }
633
                else
634
                {
635
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
636
                                  thunk->u1.AddressOfData, img_base);
637
638
 
914 serge 639
908 serge 640
 
641
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
642
                    {
643
                        int ind;
644
                        char **names=funcname;
645
646
 
647
                            ind < exp->NumberOfNames; names++,ind++)
648
                        {
649
                            if(!strncmp(ord->Name,MakePtr(char*,*names,exp_dll->img_base),32))
650
                            {
651
                                u16_t ordinal;
652
                                ordinal = ordinals[ind];
653
                                DBG("ordinal %d\t\tat %x\n", ordinal, functions[ordinal] + exp_dll->img_base);
914 serge 654
                                *iat = functions[ordinal] + exp_dll->img_base;
908 serge 655
                                break;
656
                            };
657
                        };
658
                        if(ind == exp->NumberOfNames)
659
                        {
660
                            DBG(" unresolved import %s\n",ord->Name);
661
                            warn=1;
662
                        };
663
                    }
664
                    else
665
                    {
666
                        DBG(" \tat %x\n", functions[ord->Hint] + exp_dll->img_base);
667
                        *iat = functions[ord->Hint] + exp_dll->img_base;
668
                    };
669
                };
670
                thunk++;            // Advance to next thunk
671
                iat++;
672
            }
673
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
674
        };
675
    };
676
677
 
678
        return true;
679
    else
680
        return false;
681
}
682