Subversion Repositories Kolibri OS

Rev

Rev 897 | Rev 914 | 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\n");
280
        int tmp =  mnt_exec(raw, raw_size, path, cmdline, flags);
281
        return tmp;
282
    }
283
284
 
285
    {
286
        DBG("invalid executable file %s\n", path);
287
        mem_free(raw);
288
        return -31;
289
    }
290
291
 
292
293
 
294
        cmdsize = strlen(cmdline)+1;
295
296
 
297
                 cmdsize + envsize + AUX_COUNT*sizeof(auxv_t);
298
299
 
300
301
 
302
303
 
304
    {
305
        DBG("command line too long\n");
306
        return -30;
307
    }
308
309
 
908 serge 310
    if( ! ex_stack_page )
311
    {
897 serge 312
        mem_free(raw);
313
        return -30;                                    /* FIXME          */
314
    };
315
316
 
908 serge 317
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
318
897 serge 319
 
908 serge 320
897 serge 321
 
908 serge 322
323
 
324
    {
897 serge 325
        core_free(ex_stack_page);
908 serge 326
        mem_free(raw);
897 serge 327
        return -30;                                    /* FIXME          */
328
    };
329
330
 
331
    "xorl %%eax, %%eax      \n\t"
332
    "rep stosl"
333
    :"=c"(tmp),"=D"(tmp)
334
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
335
    :"eax","cc");
336
337
 
338
                               + PAGE_SIZE - stack_size);
339
    ex_stack->argc = 2;
340
341
 
342
343
 
344
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FFFF000);  /* top of stack */
908 serge 345
897 serge 346
 
347
    {
348
        ex_cmdline = ex_path + pathsize;
349
        memcpy(ex_cmdline, cmdline, cmdsize);
350
        ex_stack->cmdline = ex_stack->path + pathsize;
351
    };
352
353
 
354
    ex_stack.env = null
355
    ex_stack.aux[0] = AT_NULL
356
 */
357
358
 
359
         ex_stack, ex_stack->path, ex_stack->cmdline);
360
361
 
908 serge 362
    return 0;
897 serge 363
};
364
365
 
366
367
 
908 serge 368
{
897 serge 369
    u32_t edi;
908 serge 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
 
385
#define EFL_IOPL1   0x1000
386
#define EFL_IOPL2   0x2000
387
#define EFL_IOPL3   0x3000
388
389
 
390
{
391
    PIMAGE_DOS_HEADER     dos;
897 serge 392
    PIMAGE_NT_HEADERS32   nt;
393
394
 
395
    count_t  img_pages;
396
    count_t  i;
397
    u32_t    tmp;
398
399
 
400
401
 
402
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
403
404
 
405
406
 
908 serge 407
897 serge 408
 
908 serge 409
897 serge 410
 
908 serge 411
897 serge 412
 
413
    {
414
        addr_t page = core_alloc(0);
415
        ((u32_t*)page_tabs)[i] = page | 7;                          /*   FIXME     */
416
    }
417
418
 
908 serge 419
    ((u32_t*)page_tabs)[0x7FFFF000>>12] = stack_page | 7;
420
421
 
897 serge 422
423
 
908 serge 424
897 serge 425
 
908 serge 426
    {
427
        DBG("\nunresolved imports\nexit\n");
428
        __asm__ __volatile__ (
429
        "int $0x40"::"a"(-1));
430
    };
431
432
 
433
//    "xchgw %bx, %bx");
434
435
 
897 serge 436
                   nt->OptionalHeader.ImageBase;
437
438
 
908 serge 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
897 serge 451
 
908 serge 452
897 serge 453
 
908 serge 454
void  __stdcall user_free(void *mem) asm("user_free");
455
456
 
457
{
458
    PIMAGE_DOS_HEADER        dos;
459
    PIMAGE_NT_HEADERS32      nt;
460
    PIMAGE_EXPORT_DIRECTORY  exp;
461
462
 
463
464
 
465
    addr_t   img_base;
466
    count_t  img_pages;
467
468
 
469
    void    *raw;
470
471
 
472
473
 
474
475
 
476
477
 
478
    {
479
        DBG("file not found: %s\n", path);
480
        return NULL;
481
    };
482
483
 
484
    {
485
        DBG("invalid pe file %s\n", path);
486
        mem_free(raw);
487
        return NULL;
488
    }
489
490
 
491
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
492
493
 
494
495
 
496
    if( !img_base)
497
    {
498
        mem_free(raw);
499
        return NULL;
500
    };
501
502
 
503
    if( !dll)
504
    {
505
        mem_free(raw);
506
        user_free((void*)img_base);
507
        return NULL;
508
    };
509
510
 
511
512
 
513
514
 
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
 
520
    dll->img_size = nt->OptionalHeader.SizeOfImage;
521
    dll->img_md   = NULL;
522
523
 
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
 
530
531
 
532
};
897 serge 533
908 serge 534
 
535
{
536
    PIMAGE_DOS_HEADER     dos;
537
    PIMAGE_NT_HEADERS32   nt;
538
    char path[128];
539
540
 
541
542
 
543
544
 
545
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
546
547
 
548
    {
549
        PIMAGE_IMPORT_DESCRIPTOR imp;
550
551
 
552
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
553
554
 
555
        {
556
            PIMAGE_THUNK_DATA32     thunk;
557
558
 
559
            PIMAGE_NT_HEADERS32     expnt;
560
            PIMAGE_EXPORT_DIRECTORY exp;
561
562
 
563
            char    *libname;
564
            addr_t  *functions;
565
            u16_t   *ordinals;
566
            char   **funcname;
567
568
 
569
570
 
571
                break;
572
573
 
574
575
 
576
577
 
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
 
587
                memcpy(&path[9],libname,len);
588
589
 
590
                if( !exp_dll)
591
                {
592
                    DBG("can't load %s\n", path);
593
                    return false;
594
                };
595
            }
596
597
 
598
599
 
600
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
601
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
602
603
 
604
                            imp->Characteristics, img_base);
605
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
606
607
 
608
            {
609
                PIMAGE_IMPORT_BY_NAME ord;
610
                addr_t addr;
611
612
 
613
                    break;
614
615
 
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
 
627
628
 
629
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
630
                    {
631
                        int ind;
632
                        char **names=funcname;
633
634
 
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
                    {
654
                        DBG(" \tat %x\n", functions[ord->Hint] + exp_dll->img_base);
655
                        *iat = functions[ord->Hint] + exp_dll->img_base;
656
                    };
657
                };
658
                thunk++;            // Advance to next thunk
659
                iat++;
660
            }
661
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
662
        };
663
    };
664
665
 
666
        return true;
667
    else
668
        return false;
669
}
670