Subversion Repositories Kolibri OS

Rev

Rev 908 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
892 serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include 
8
9
 
10
 
11
{
12
    if(val == 0)
13
        return false;
14
    return (val & (val - 1)) == 0;
15
}
16
17
 
18
 
19
{
20
    u32_t tmp;
21
    __asm__ __volatile__ (
22
    "shrl $2, %%ecx         \n\t"
23
    "rep movsl"
24
    :"=c"(tmp),"=S"(tmp),"=D"(tmp)
25
    :"c"(len),"S"(src),"D"(dst)
26
    :"cc");
27
};
28
29
 
30
{
31
    u32_t tmp;
32
    __asm__ __volatile__ (
33
    "xorl %%eax, %%eax      \n\t"
34
    "rep stosb"
35
    :"=c"(tmp),"=D"(tmp)
36
    :"c"(len),"D"(dst)
37
    :"eax","cc");
38
};
39
40
 
41
42
 
43
bool link_image(addr_t img_base);
44
45
 
46
47
 
48
void* __fastcall load_pe(const char *path)
49
{
50
    md_t  *md;
51
52
 
53
54
 
55
        return (void*)md->base;
56
57
 
58
};
59
*/
60
61
 
62
{
63
    PIMAGE_DOS_HEADER     dos;
64
    PIMAGE_NT_HEADERS32   nt;
65
66
 
67
68
 
69
        return false;
70
71
 
72
        return false;
73
74
 
75
76
 
77
        return false;
78
79
 
80
        return false;
81
82
 
83
        return false;
84
85
 
86
	{
87
        if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment)
88
            return false;
89
	}
90
    else if(nt->OptionalHeader.SectionAlignment < nt->OptionalHeader.FileAlignment)
91
        return false;
92
93
 
94
       !IsPowerOf2(nt->OptionalHeader.FileAlignment))
95
        return false;
96
97
 
98
        return false;
99
100
 
101
}
102
103
 
104
{
105
    PIMAGE_DOS_HEADER     dos;
106
    PIMAGE_NT_HEADERS32   nt;
107
108
 
109
110
 
111
    addr_t   img_base;
112
    count_t  img_pages;
113
114
 
115
    void    *raw;
116
117
 
118
119
 
120
121
 
122
123
 
124
    {
125
        DBG("file not found: %s\n", path);
126
        return NULL;
127
    };
128
129
 
130
	{
131
        DBG("invalid pe file %s\n", path);
132
        mem_free(raw);
133
            return NULL;
134
	}
135
136
 
137
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
138
139
 
140
141
 
142
143
 
144
 
145
    {
146
        mem_free(raw);
147
        return NULL;
148
    };
149
150
 
151
152
 
153
154
 
155
156
 
157
//    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
158
159
 
160
};
161
162
 
163
 
164
addr_t get_proc_addr(addr_t module, char *name)
165
{
166
    PIMAGE_DOS_HEADER  expdos;
167
    PIMAGE_NT_HEADERS32  expnt;
168
    PIMAGE_EXPORT_DIRECTORY exp;
169
    u32_t *functions;
170
    char **funcname;
171
    int ind;
172
173
 
174
    expnt =  MakePtr( PIMAGE_NT_HEADERS32, expdos, expdos->e_lfanew);
175
176
 
177
                  expnt->OptionalHeader.DataDirectory[0].VirtualAddress);
178
179
 
180
    funcname = MakePtr(char**,exp->AddressOfNames,module);
181
182
 
183
    {
184
        if(!strcmp(name,MakePtr(char*,*funcname,module)))
185
            return functions[ind] + module;
186
    };
187
    return -1;
188
};
189
*/
190
191
 
192
 
193
{
194
    PIMAGE_DOS_HEADER     dos;
195
    PIMAGE_NT_HEADERS32   nt;
196
    PIMAGE_SECTION_HEADER img_sec;
197
198
 
199
    int    i;
200
201
 
202
 
203
204
 
205
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
206
207
 
208
209
 
210
211
 
212
213
 
214
    {
215
        addr_t src_ptr;
216
        addr_t dest_ptr;
217
        size_t sec_size;
218
219
 
220
        dest_ptr = MakePtr(addr_t,img_base, img_sec->VirtualAddress);
221
222
 
223
            sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData);
224
225
 
226
227
 
228
            sec_clear(dest_ptr + img_sec->SizeOfRawData,
229
                      sec_size - img_sec->SizeOfRawData);
230
        img_sec++;
231
    }
232
233
 
234
    {
235
        PIMAGE_BASE_RELOCATION reloc;
236
237
 
238
239
 
240
241
 
242
                        nt->OptionalHeader.DataDirectory[5].VirtualAddress);
243
244
 
245
        {
246
            u32_t  cnt;
247
            u16_t *entry;
248
            u16_t  reltype;
249
            u32_t  offs;
250
251
 
252
            entry = MakePtr( u16_t*, reloc, sizeof(*reloc) );
253
254
 
255
            {
256
                u16_t *p16;
257
                u32_t *p32;
258
259
 
260
                offs = (*entry & 0x0FFF) + reloc->VirtualAddress;
261
                switch(reltype)
262
                {
263
                    case 1:
264
                        p16 = MakePtr(u16_t*, img_base, offs);
265
                        *p16+= (u16_t)(delta>>16);
266
                        break;
267
                    case 2:
268
                        p16 = MakePtr(u16_t*, img_base, offs);
269
                        *p16+= (u16_t)delta;
270
                        break;
271
                    case 3:
272
                        p32 = MakePtr(u32_t*, img_base, offs);
273
                        *p32+= delta;
274
                }
275
                entry++;
276
            }
277
            reloc = MakePtr(PIMAGE_BASE_RELOCATION, reloc,reloc->SizeOfBlock);
278
        }
279
    };
280
281
 
282
         nt->OptionalHeader.SizeOfImage, nt->FileHeader.NumberOfSections);
283
};
284
285
 
286
 
287
{
288
    PIMAGE_DOS_HEADER     dos;
289
    PIMAGE_NT_HEADERS32   nt;
290
291
 
292
293
 
294
295
 
296
    nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
297
298
 
299
    {
300
        PIMAGE_IMPORT_DESCRIPTOR imp;
301
302
 
303
                      nt->OptionalHeader.DataDirectory[1].VirtualAddress);
304
305
 
306
 
307
 
308
        {
309
            PIMAGE_THUNK_DATA32     thunk;
310
311
 
312
            PIMAGE_NT_HEADERS32     expnt;
313
            PIMAGE_EXPORT_DIRECTORY exp;
314
315
 
316
            char    *libname;
317
            addr_t  *functions;
318
            u16_t   *ordinals;
319
            char   **funcname;
320
321
 
322
323
 
324
                break;
325
326
 
327
328
 
329
330
 
331
            if(exp_dll != NULL)
332
            {
333
                DBG("find %s\n", exp_dll->img_name);
334
            }
335
            else
336
            {
337
                DBG("can't find %s\n", libname);
338
                return false;
339
            }
340
341
 
342
343
 
344
            ordinals = MakePtr(WORD*,  exp->AddressOfNameOrdinals,exp_dll->img_base);
345
            funcname = MakePtr(char**, exp->AddressOfNames,exp_dll->img_base);
346
347
 
348
                            imp->Characteristics, img_base);
349
            iat= MakePtr(DWORD*,imp->FirstThunk, img_base);
350
351
 
352
            {
353
                PIMAGE_IMPORT_BY_NAME ord;
354
                addr_t addr;
355
356
 
357
                    break;
358
359
 
360
                {
361
        //  printf("  %4u\n", thunk->u1.Ordinal & 0xFFFF);
362
                    break;
363
                }
364
                else
365
                {
366
                    ord = MakePtr(PIMAGE_IMPORT_BY_NAME,
367
                                  thunk->u1.AddressOfData, img_base);
368
                    *iat=0;
369
370
 
371
372
 
373
                       MakePtr(char*,funcname[ord->Hint],exp_dll->img_base),32))
374
                    {
375
                        int ind;
376
                        char **names=funcname;
377
378
 
379
                            ind < exp->NumberOfNames; names++,ind++)
380
                        {
381
                            if(!strncmp(ord->Name,MakePtr(char*,*names,exp_dll->img_base),32))
382
                            {
383
                                DBG(" \tat %x\n", functions[ind] + exp_dll->img_base);
384
                                *iat = functions[ind] + exp_dll->img_base;
385
                                break;
386
                            };
387
                        };
388
                        if(ind == exp->NumberOfNames)
389
                        {
390
                            DBG(" unresolved import %s\n",ord->Name);
391
                            warn=1;
392
                        };
393
                    }
394
                    else
395
                    {
396
                        DBG(" \tat %x\n", functions[ord->Hint] + exp_dll->img_base);
397
                        *iat = functions[ord->Hint] + exp_dll->img_base;
398
                    };
399
                };
400
                thunk++;            // Advance to next thunk
401
                iat++;
402
            }
403
            imp++;  // advance to next IMAGE_IMPORT_DESCRIPTOR
404
        };
405
    };
406
407
 
408
        return true;
409
        else
410
        return false;
411
}
412