Subversion Repositories Kolibri OS

Rev

Rev 892 | Rev 908 | 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
 
892 serge 10
890 serge 11
 
897 serge 12
              char *cmdline, u32_t flags) asm ("mnt_exec");
13
14
 
892 serge 15
890 serge 16
 
892 serge 17
{
890 serge 18
    char *p;
892 serge 19
    unsigned char c;
20
890 serge 21
 
892 serge 22
    while( (c = *p) )
23
    {
890 serge 24
        if( c >= 'a' && c <= 'z' )
892 serge 25
            *p = c - 'a' + 'A';
26
        ++p;
27
    }
28
890 serge 29
 
892 serge 30
}
31
890 serge 32
 
897 serge 33
{
34
int d0, d1, d2;
35
 __asm__ __volatile__(
36
	"rep ; movsl\n\t"
37
	"testb $2,%b4\n\t"
38
	"je 1f\n\t"
39
	"movsw\n"
40
	"1:\ttestb $1,%b4\n\t"
41
	"je 2f\n\t"
42
	"movsb\n"
43
	"2:"
44
	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
45
	:"0" (_n/4), "q" (_n),"1" ((long)_dest),"2" ((long)_src)
46
	: "memory");
47
 return (_dest);
48
}
49
50
 
51
{
52
int d0;
53
register int __res;
54
__asm__ __volatile__(
55
	"repne\n\t"
56
	"scasb\n\t"
57
	"notl %0\n\t"
58
	"decl %0"
59
	:"=c" (__res), "=&D" (d0) :"1" (str),"a" (0), "0" (0xffffffff));
60
return __res;
61
}
62
63
 
892 serge 64
{
890 serge 65
    PIMAGE_DOS_HEADER        dos;
892 serge 66
    PIMAGE_NT_HEADERS32      nt;
67
    PIMAGE_EXPORT_DIRECTORY  exp;
68
890 serge 69
 
892 serge 70
    nt  =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
71
    exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
72
                   nt->OptionalHeader.DataDirectory[0].VirtualAddress);
73
890 serge 74
 
892 serge 75
890 serge 76
 
892 serge 77
    core_dll.img_size = nt->OptionalHeader.SizeOfImage;
78
    core_dll.img_md   = NULL;
79
890 serge 80
 
892 serge 81
    core_dll.img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
82
    core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
83
                        nt->OptionalHeader.DataDirectory[0].VirtualAddress);
84
    core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
85
890 serge 86
 
892 serge 87
        core_dll.img_name, core_dll.img_base,
88
        core_dll.img_size, nt->FileHeader.NumberOfSections,
89
        core_dll.img_exp );
90
};
91
890 serge 92
 
93
 
892 serge 94
{
890 serge 95
    dll_t* dll = &core_dll;
892 serge 96
890 serge 97
 
892 serge 98
    {
99
        if( !strncmp(name,dll->img_name,16))
100
            return dll;
101
890 serge 102
 
892 serge 103
890 serge 104
 
892 serge 105
890 serge 106
 
892 serge 107
};
890 serge 108
109
 
110
 
111
{
112
  char         srv_name[16];  //        ASCIIZ string
113
  u32_t        magic;         // +0x10  'SRV '
114
  size_t       size;          // +0x14  size of structure SRV
115
  void        *fd;            // +0x18  next SRV descriptor
116
  void        *bk;            // +0x1C  prev SRV descriptor
117
  addr_t       base;          // +0x20  service base address
118
  addr_t       entry;         // +0x24  service START function
119
  void        *srv_proc;      // +0x28  main service handler
120
}srv_t;
121
122
 
123
124
 
125
{
126
    PIMAGE_DOS_HEADER     dos;
127
    PIMAGE_NT_HEADERS32   nt;
128
129
 
130
    md_t          *md;
131
    srv_t         *srv;
132
133
 
134
135
 
136
        return 0;
137
138
 
892 serge 139
    {
890 serge 140
        dos = (PIMAGE_DOS_HEADER)md->base;
892 serge 141
        nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
142
890 serge 143
 
892 serge 144
                            nt->OptionalHeader.AddressOfEntryPoint);
145
890 serge 146
 
892 serge 147
890 serge 148
 
892 serge 149
            srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base;
150
890 serge 151
 
892 serge 152
    }
890 serge 153
    else
892 serge 154
    {
890 serge 155
        md_free( md );
892 serge 156
        return NULL;
890 serge 157
    }
158
}
892 serge 159
890 serge 160
 
897 serge 161
{
162
    int a_type;
163
    union
164
    {
165
        long  a_val;
166
        void *a_ptr;
167
        void  (*a_fcn)( ) ;
168
    }a_un;
169
}auxv_t;
170
171
 
172
173
 
174
{
175
    int     argc;       /*  always 2                                */
176
    char   *path;       /*  argv[0]   program path                  */
177
    char   *cmdline;    /*  argv[1]   command  line. May be null    */
178
    u32_t   sep1;       /*  separator.  must be zero                */
179
    char   *env;        /*  single environment string               */
180
    u32_t   sep2;       /*  separator.  must be zero                */
181
    auxv_t  aux[1];     /*  aux. AT_NULL for now                    */
182
}exec_stack_t;
183
184
 
185
 
186
187
 
188
                          addr_t ex_stack_page) asm ("pe_app_param");
189
190
 
191
{
192
    addr_t        ex_pg_dir;
193
    addr_t        ex_stack_tab;
194
    addr_t        ex_stack_page;
195
    addr_t        ex_pl0_stack;
196
197
 
198
    int           stack_size;
199
    char         *ex_path;
200
    char         *ex_cmdline = NULL;
201
202
 
203
    u32_t        *raw;
204
205
 
206
    int cmdsize  = 0;
207
    int envsize  = 0;
208
209
 
210
211
 
212
213
 
214
    {
215
        DBG("invalid path\n");
216
        return;
217
    };
218
219
 
220
221
 
222
        return -5;                                      /* FIXME */
223
224
 
225
        ( ( raw[1] == 0x31305445) ||
226
          ( raw[1] == 0x30305445) ) )
227
228
 
229
        DBG("leagacy Kolibri application\n");
230
        int tmp =  mnt_exec(raw, raw_size, path, cmdline, flags);
231
        return tmp;
232
    }
233
234
 
235
    {
236
        DBG("invalid executable file %s\n", path);
237
        mem_free(raw);
238
        return -31;
239
    }
240
241
 
242
243
 
244
        cmdsize = strlen(cmdline)+1;
245
246
 
247
                 cmdsize + envsize + AUX_COUNT*sizeof(auxv_t);
248
249
 
250
251
 
252
253
 
254
    {
255
        DBG("command line too long\n");
256
        return -30;
257
    }
258
259
 
260
261
 
262
    {
263
        mem_free(raw);
264
        return -30;                                    /* FIXME          */
265
    };
266
267
 
268
    ex_pl0_stack   = ex_pg_dir + 4096 * 2;
269
270
 
271
272
 
273
    {
274
        core_free(ex_stack_tab);
275
        mem_free(raw);
276
        return -30;                                    /* FIXME          */
277
    };
278
279
 
280
    "xorl %%eax, %%eax      \n\t"
281
    "rep stosl"
282
    :"=c"(tmp),"=D"(tmp)
283
    :"c"(1024),"D"(ex_stack_page + OS_BASE)
284
    :"eax","cc");
285
286
 
287
288
 
289
                               + PAGE_SIZE - stack_size);
290
    ex_stack->argc = 2;
291
292
 
293
294
 
295
    ex_stack->path = (char*)(((addr_t)ex_path & 0xFFF) + 0x7FCFF000);  /* top of stack */
296
297
 
298
    {
299
        ex_cmdline = ex_path + pathsize;
300
        memcpy(ex_cmdline, cmdline, cmdsize);
301
        ex_stack->cmdline = ex_stack->path + pathsize;
302
    };
303
304
 
305
    ex_stack.env = null
306
    ex_stack.aux[0] = AT_NULL
307
 */
308
309
 
310
         ex_stack, ex_stack->path, ex_stack->cmdline);
311
312
 
313
    return 0;
314
};
315
316
 
317
318
 
319
{
320
    PIMAGE_DOS_HEADER     dos;
321
    PIMAGE_NT_HEADERS32   nt;
322
323
 
324
    count_t  img_pages;
325
    count_t  img_tabs;
326
    count_t  i;
327
    u32_t    tmp;
328
329
 
330
331
 
332
333
 
334
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
335
336
 
337
338
 
339
    img_tabs  = ((img_size + 0x3FFFFF) & ~0x3FFFFF) >> 22;
340
341
 
342
343
 
344
    {
345
        addr_t tab = core_alloc(0);
346
        ((u32_t*)master_tab)[i] = tab|7;                            /*   FIXME     */
347
    }
348
349
 
350
351
 
352
    "xorl %%eax, %%eax      \n\t"
353
    "rep stosl"
354
    :"=c"(tmp),"=D"(tmp)
355
    :"c"(img_tabs<<10),"D"(page_tabs)
356
    :"eax","cc");
357
358
 
359
    {
360
        addr_t page = core_alloc(0);
361
        ((u32_t*)page_tabs)[i] = page | 7;                          /*   FIXME     */
362
    }
363
364
 
365
366
 
367
    "xchgw %bx, %bx");
368
369
 
370
                   nt->OptionalHeader.ImageBase;
371
372
 
373
  //  "call %0":: "r" (entry));
374
375
 
376
377
 
378
>