Rev 890 | Rev 897 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 890 | Rev 892 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | #include |
3 | #include |
4 | #include |
4 | #include |
5 | #include |
5 | #include |
6 | #include |
6 | #include |
7 | 7 | #include |
|
- | 8 | ||
Line 8... | Line -... | ||
8 | typedef unsigned short WORD; |
- | |
9 | typedef unsigned int DWORD; |
- | |
10 | typedef unsigned int LONG; |
- | |
11 | typedef unsigned char BYTE; |
- | |
12 | - | ||
13 | #define IMAGE_DOS_SIGNATURE 0x5A4D |
- | |
14 | #define IMAGE_NT_SIGNATURE 0x00004550 |
- | |
15 | #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b |
- | |
16 | - | ||
17 | #pragma pack(push,2) |
- | |
18 | typedef struct _IMAGE_DOS_HEADER |
- | |
19 | { |
- | |
20 | WORD e_magic; |
- | |
21 | WORD e_cblp; |
- | |
22 | WORD e_cp; |
- | |
23 | WORD e_crlc; |
- | |
24 | WORD e_cparhdr; |
- | |
25 | WORD e_minalloc; |
- | |
26 | WORD e_maxalloc; |
- | |
27 | WORD e_ss; |
- | |
28 | WORD e_sp; |
- | |
29 | WORD e_csum; |
- | |
30 | WORD e_ip; |
- | |
31 | WORD e_cs; |
- | |
32 | WORD e_lfarlc; |
- | |
33 | WORD e_ovno; |
- | |
34 | WORD e_res[4]; |
- | |
35 | WORD e_oemid; |
- | |
36 | WORD e_oeminfo; |
- | |
37 | WORD e_res2[10]; |
- | |
38 | LONG e_lfanew; |
- | |
39 | } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER; |
- | |
40 | #pragma pack(pop) |
- | |
41 | - | ||
42 | - | ||
43 | #pragma pack(push,4) |
- | |
44 | typedef struct _IMAGE_FILE_HEADER |
- | |
45 | { |
- | |
46 | WORD Machine; |
- | |
47 | WORD NumberOfSections; |
- | |
48 | DWORD TimeDateStamp; |
- | |
49 | DWORD PointerToSymbolTable; |
- | |
50 | DWORD NumberOfSymbols; |
- | |
51 | WORD SizeOfOptionalHeader; |
- | |
52 | WORD Characteristics; |
- | |
53 | } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; |
- | |
54 | - | ||
55 | typedef struct _IMAGE_DATA_DIRECTORY { |
- | |
56 | DWORD VirtualAddress; |
- | |
57 | DWORD Size; |
- | |
58 | } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; |
- | |
59 | - | ||
60 | #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
- | |
61 | - | ||
62 | typedef struct _IMAGE_OPTIONAL_HEADER { |
- | |
63 | WORD Magic; |
- | |
64 | BYTE MajorLinkerVersion; |
- | |
65 | BYTE MinorLinkerVersion; |
- | |
66 | DWORD SizeOfCode; |
- | |
67 | DWORD SizeOfInitializedData; |
- | |
68 | DWORD SizeOfUninitializedData; |
- | |
69 | DWORD AddressOfEntryPoint; |
- | |
70 | DWORD BaseOfCode; |
- | |
71 | DWORD BaseOfData; |
- | |
72 | DWORD ImageBase; |
- | |
73 | DWORD SectionAlignment; |
- | |
74 | DWORD FileAlignment; |
- | |
75 | WORD MajorOperatingSystemVersion; |
- | |
76 | WORD MinorOperatingSystemVersion; |
- | |
77 | WORD MajorImageVersion; |
- | |
78 | WORD MinorImageVersion; |
- | |
79 | WORD MajorSubsystemVersion; |
- | |
80 | WORD MinorSubsystemVersion; |
- | |
81 | DWORD Win32VersionValue; |
- | |
82 | DWORD SizeOfImage; |
- | |
83 | DWORD SizeOfHeaders; |
- | |
84 | DWORD CheckSum; |
- | |
85 | WORD Subsystem; |
- | |
86 | WORD DllCharacteristics; |
- | |
87 | DWORD SizeOfStackReserve; |
- | |
88 | DWORD SizeOfStackCommit; |
- | |
89 | DWORD SizeOfHeapReserve; |
- | |
90 | DWORD SizeOfHeapCommit; |
- | |
91 | DWORD LoaderFlags; |
- | |
92 | DWORD NumberOfRvaAndSizes; |
- | |
93 | IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
9 | int __stdcall strncmp(const char *s1, const char *s2, size_t n); |
94 | } IMAGE_OPTIONAL_HEADER,*PIMAGE_OPTIONAL_HEADER; |
- | |
95 | - | ||
96 | #pragma pack(pop) |
- | |
97 | - | ||
98 | - | ||
99 | #pragma pack(push,4) |
- | |
100 | typedef struct _IMAGE_NT_HEADERS |
- | |
101 | { |
- | |
102 | DWORD Signature; |
- | |
103 | IMAGE_FILE_HEADER FileHeader; |
- | |
104 | IMAGE_OPTIONAL_HEADER OptionalHeader; |
- | |
105 | } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32; |
- | |
106 | - | ||
107 | #define IMAGE_SIZEOF_SHORT_NAME 8 |
- | |
108 | - | ||
109 | typedef struct _IMAGE_SECTION_HEADER |
- | |
110 | { |
- | |
111 | BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; |
- | |
112 | union |
- | |
113 | { |
- | |
114 | DWORD PhysicalAddress; |
- | |
115 | DWORD VirtualSize; |
- | |
116 | } Misc; |
- | |
117 | DWORD VirtualAddress; |
- | |
118 | DWORD SizeOfRawData; |
- | |
119 | DWORD PointerToRawData; |
- | |
120 | DWORD PointerToRelocations; |
- | |
121 | DWORD PointerToLinenumbers; |
- | |
122 | WORD NumberOfRelocations; |
- | |
123 | WORD NumberOfLinenumbers; |
- | |
124 | DWORD Characteristics; |
- | |
125 | } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; |
- | |
126 | #pragma pack(pop) |
- | |
127 | - | ||
128 | #pragma pack(push,4) |
- | |
129 | typedef struct _IMAGE_BASE_RELOCATION { |
- | |
130 | DWORD VirtualAddress; |
- | |
131 | DWORD SizeOfBlock; |
- | |
132 | } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; |
- | |
133 | #pragma pack(pop) |
- | |
Line 134... | Line -... | ||
134 | - | ||
135 | typedef struct _IMAGE_IMPORT_DESCRIPTOR |
- | |
136 | { |
- | |
137 | union |
- | |
138 | { |
10 | |
139 | DWORD Characteristics; |
- | |
140 | DWORD OriginalFirstThunk; |
- | |
141 | }; |
- | |
142 | DWORD TimeDateStamp; |
- | |
143 | DWORD ForwarderChain; |
- | |
144 | DWORD Name; |
- | |
145 | DWORD FirstThunk; |
- | |
Line 146... | Line 11... | ||
146 | } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; |
11 | static dll_t core_dll; |
147 | - | ||
148 | typedef struct _IMAGE_THUNK_DATA32 |
- | |
149 | { |
12 | |
150 | union |
- | |
151 | { |
- | |
152 | DWORD ForwarderString; |
13 | static char* strupr(char *str ) |
153 | DWORD Function; |
14 | { |
154 | DWORD Ordinal; |
- | |
155 | DWORD AddressOfData; |
- | |
Line -... | Line 15... | ||
- | 15 | char *p; |
|
156 | } u1; |
16 | unsigned char c; |
157 | } IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32; |
17 | |
158 | - | ||
159 | typedef struct _IMAGE_IMPORT_BY_NAME |
- | |
160 | { |
- | |
161 | WORD Hint; |
- | |
162 | BYTE Name[1]; |
- | |
163 | } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; |
- | |
164 | 18 | p = str; |
|
165 | #define IMAGE_ORDINAL_FLAG 0x80000000 |
19 | while( (c = *p) ) |
166 | - | ||
167 | typedef struct _IMAGE_EXPORT_DIRECTORY { |
- | |
168 | DWORD Characteristics; |
- | |
169 | DWORD TimeDateStamp; |
20 | { |
170 | WORD MajorVersion; |
21 | if( c >= 'a' && c <= 'z' ) |
171 | WORD MinorVersion; |
- | |
172 | DWORD Name; |
- | |
173 | DWORD Base; |
- | |
174 | DWORD NumberOfFunctions; |
- | |
175 | DWORD NumberOfNames; |
- | |
176 | DWORD AddressOfFunctions; |
- | |
177 | DWORD AddressOfNames; |
- | |
178 | DWORD AddressOfNameOrdinals; |
- | |
Line 179... | Line 22... | ||
179 | } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; |
22 | *p = c - 'a' + 'A'; |
- | 23 | ++p; |
|
Line 180... | Line 24... | ||
180 | 24 | } |
|
181 | //extern IMAGE_EXPORT_DIRECTORY kernel_exports; |
25 | |
182 | - | ||
183 | #define MakePtr( cast, ptr, addValue ) (cast)( (addr_t)(ptr) + (addValue) ) |
26 | return( str ); |
184 | 27 | } |
|
185 | typedef struct |
- | |
186 | { |
28 | |
Line 187... | Line 29... | ||
187 | addr_t base; |
29 | void init_core_dll() |
- | 30 | { |
|
- | 31 | PIMAGE_DOS_HEADER dos; |
|
- | 32 | PIMAGE_NT_HEADERS32 nt; |
|
Line 188... | Line -... | ||
188 | addr_t frame; |
- | |
189 | md_t *md; |
- | |
190 | - | ||
191 | IMAGE_OPTIONAL_HEADER *opthdr; |
- | |
192 | 33 | PIMAGE_EXPORT_DIRECTORY exp; |
|
193 | }dll_t; |
- | |
Line -... | Line 34... | ||
- | 34 | ||
- | 35 | dos = (PIMAGE_DOS_HEADER)LOAD_BASE; |
|
- | 36 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
|
Line 194... | Line -... | ||
194 | - | ||
195 | static inline bool IsPowerOf2(u32_t val) |
- | |
196 | { |
37 | exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE, |
197 | if(val == 0) |
38 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
198 | return false; |
39 | |
199 | return (val & (val - 1)) == 0; |
- | |
200 | } |
40 | list_initialize(&core_dll.link); |
201 | 41 | ||
202 | - | ||
203 | static inline void sec_copy(void *dst, const void *src, size_t len) |
- | |
Line 204... | Line 42... | ||
204 | { |
42 | core_dll.img_base = LOAD_BASE; |
205 | u32_t tmp; |
- | |
206 | __asm__ __volatile__ ( |
- | |
207 | "shrl $2, %%ecx \n\t" |
43 | core_dll.img_size = nt->OptionalHeader.SizeOfImage; |
208 | "rep movsl" |
44 | core_dll.img_md = NULL; |
209 | :"=c"(tmp),"=S"(tmp),"=D"(tmp) |
- | |
210 | :"c"(len),"S"(src),"D"(dst) |
45 | |
211 | :"cc"); |
- | |
212 | }; |
- | |
213 | 46 | core_dll.img_hdr = nt; |
|
Line 214... | Line -... | ||
214 | static inline void sec_clear(void *dst, size_t len) |
- | |
215 | { |
- | |
216 | u32_t tmp; |
- | |
217 | __asm__ __volatile__ ( |
- | |
218 | "xorl %%eax, %%eax \n\t" |
- | |
219 | "rep stosb" |
- | |
Line -... | Line 47... | ||
- | 47 | core_dll.img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32)); |
|
- | 48 | core_dll.img_exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE, |
|
- | 49 | nt->OptionalHeader.DataDirectory[0].VirtualAddress); |
|
Line 220... | Line 50... | ||
220 | :"=c"(tmp),"=D"(tmp) |
50 | core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name)); |
221 | :"c"(len),"D"(dst) |
51 | |
- | 52 | DBG("%s base %x size %x sections %d exports %x\n", |
|
222 | :"eax","cc"); |
53 | core_dll.img_name, core_dll.img_base, |
Line 223... | Line 54... | ||
223 | }; |
54 | core_dll.img_size, nt->FileHeader.NumberOfSections, |
Line 224... | Line -... | ||
224 | - | ||
225 | int __stdcall strncmp(const char *s1, const char *s2, size_t n); |
55 | core_dll.img_exp ); |
Line 226... | Line 56... | ||
226 | 56 | }; |
|
227 | 57 | ||
Line -... | Line 58... | ||
- | 58 | ||
228 | void __export create_image(void *img_base, void *image) asm ("CreateImage"); |
59 | dll_t * find_dll(const char *name) |
229 | 60 | { |
|
230 | md_t* __fastcall load_image(const char *path); |
61 | dll_t* dll = &core_dll; |
231 | 62 | ||
232 | 63 | do |
|
Line 269... | Line 100... | ||
269 | 100 | ||
Line 270... | Line 101... | ||
270 | if( ! md ) |
101 | if( ! md ) |
271 | return 0; |
102 | return 0; |
Line -... | Line 103... | ||
- | 103 | ||
- | 104 | if( link_image( md->base ) ) |
|
272 | 105 | { |
|
273 | dos = (PIMAGE_DOS_HEADER)md->base; |
106 | dos = (PIMAGE_DOS_HEADER)md->base; |
Line 274... | Line 107... | ||
274 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
107 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
275 | 108 | ||
Line 282... | Line 115... | ||
282 | srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base; |
115 | srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base; |
283 | 116 | ||
Line 284... | Line 117... | ||
284 | return srv; |
117 | return srv; |
285 | } |
118 | } |
286 | - | ||
287 | md_t* __fastcall load_image(const char *path) |
- | |
288 | { |
- | |
289 | PIMAGE_DOS_HEADER dos; |
- | |
290 | PIMAGE_NT_HEADERS32 nt; |
- | |
291 | - | ||
292 | md_t *img_md; |
- | |
293 | - | ||
294 | size_t img_size; |
- | |
295 | void *img_base; |
- | |
296 | count_t img_pages; |
- | |
297 | - | ||
298 | size_t raw_size = 0; |
- | |
299 | void *raw; |
- | |
300 | - | ||
301 | // void *image; |
- | |
302 | - | ||
303 | DBG("load file %s\n", path); |
- | |
304 | - | ||
305 | raw = load_file(path, &raw_size); |
- | |
306 | - | ||
307 | DBG("raw = %x\n\n", raw); |
- | |
308 | - | ||
309 | dos = (PIMAGE_DOS_HEADER)raw; |
- | |
310 | - | ||
311 | if( !raw || raw_size < sizeof(IMAGE_DOS_HEADER) ) |
- | |
312 | return NULL; |
- | |
313 | - | ||
314 | if( dos->e_magic != IMAGE_DOS_SIGNATURE || dos->e_lfanew <= 0) |
- | |
315 | return NULL; |
- | |
316 | - | ||
317 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
- | |
318 | - | ||
319 | if( (addr_t)nt < (addr_t)raw) |
- | |
320 | return NULL; |
- | |
321 | - | ||
322 | if(nt->Signature != IMAGE_NT_SIGNATURE) |
- | |
323 | return NULL; |
- | |
324 | - | ||
325 | if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) |
- | |
326 | return NULL; |
- | |
327 | - | ||
328 | if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE) |
- | |
329 | { |
- | |
330 | if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment) |
- | |
331 | return NULL; |
- | |
332 | } |
- | |
333 | else if(nt->OptionalHeader.SectionAlignment < nt->OptionalHeader.FileAlignment) |
- | |
334 | return NULL; |
- | |
335 | - | ||
336 | if(!IsPowerOf2(nt->OptionalHeader.SectionAlignment) || |
- | |
337 | !IsPowerOf2(nt->OptionalHeader.FileAlignment)) |
- | |
338 | return NULL; |
- | |
339 | - | ||
340 | if(nt->FileHeader.NumberOfSections > 96) |
- | |
341 | return NULL; |
- | |
342 | - | ||
343 | img_size = nt->OptionalHeader.SizeOfImage; |
- | |
344 | // img_pages = img_size / PAGE_SIZE; |
- | |
345 | - | ||
346 | img_md = md_alloc(img_size, PG_SW); |
- | |
347 | - | ||
348 | - | ||
349 | if( !img_md) |
- | |
350 | { |
- | |
351 | mem_free(raw); |
- | |
352 | return NULL; |
- | |
353 | }; |
- | |
354 | - | ||
355 | img_base = (void*)img_md->base; |
- | |
356 | - | ||
357 | create_image(img_base, raw); |
- | |
358 | - | ||
359 | mem_free(raw); |
- | |
360 | - | ||
361 | // dos = (PIMAGE_DOS_HEADER)img_base; |
- | |
362 | // nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
- | |
363 | - | ||
364 | return img_md; |
- | |
365 | }; |
- | |
366 | - | ||
367 | - | ||
368 | /* |
- | |
369 | addr_t get_proc_addr(addr_t module, char *name) |
- | |
370 | { |
- | |
371 | PIMAGE_DOS_HEADER expdos; |
- | |
372 | PIMAGE_NT_HEADERS32 expnt; |
- | |
373 | PIMAGE_EXPORT_DIRECTORY exp; |
- | |
374 | u32_t *functions; |
- | |
375 | char **funcname; |
- | |
376 | int ind; |
- | |
377 | - | ||
378 | expdos = (PIMAGE_DOS_HEADER)module; |
- | |
379 | expnt = MakePtr( PIMAGE_NT_HEADERS32, expdos, expdos->e_lfanew); |
- | |
380 | - | ||
381 | exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,module, |
- | |
382 | expnt->OptionalHeader.DataDirectory[0].VirtualAddress); |
- | |
383 | - | ||
384 | functions = MakePtr(DWORD*,exp->AddressOfFunctions,module); |
- | |
385 | funcname = MakePtr(char**,exp->AddressOfNames,module); |
- | |
386 | - | ||
387 | for(ind=0; *funcname;funcname++,ind++) |
- | |
388 | { |
- | |
389 | if(!strcmp(name,MakePtr(char*,*funcname,module))) |
- | |
390 | return functions[ind] + module; |
- | |
391 | }; |
- | |
392 | return -1; |
- | |
393 | }; |
- | |
394 | */ |
- | |
395 | - | ||
396 | - | ||
397 | void create_image(void *img_base, void *image) |
- | |
398 | { |
- | |
399 | PIMAGE_DOS_HEADER dos; |
- | |
400 | PIMAGE_NT_HEADERS32 nt; |
- | |
401 | PIMAGE_SECTION_HEADER img_sec; |
- | |
402 | - | ||
403 | u32_t sec_align; |
- | |
404 | int i; |
- | |
405 | - | ||
406 | - | ||
407 | /* assumed that image is valid */ |
- | |
408 | - | ||
409 | dos = (PIMAGE_DOS_HEADER)image; |
- | |
410 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
- | |
411 | - | ||
412 | sec_copy(img_base,image,nt->OptionalHeader.SizeOfHeaders); |
- | |
413 | - | ||
414 | img_sec = MakePtr(PIMAGE_SECTION_HEADER,nt,sizeof(IMAGE_NT_HEADERS32)); |
- | |
415 | - | ||
416 | sec_align = nt->OptionalHeader.SectionAlignment; |
- | |
417 | - | ||
418 | for(i=0; i< nt->FileHeader.NumberOfSections; i++) |
- | |
419 | { |
- | |
420 | char *src_ptr; |
- | |
421 | char *dest_ptr; |
- | |
422 | size_t sec_size; |
- | |
423 | - | ||
424 | src_ptr = MakePtr(char*, image, img_sec->PointerToRawData); |
- | |
425 | dest_ptr = MakePtr(char*,img_base, img_sec->VirtualAddress); |
- | |
426 | - | ||
427 | if(img_sec->SizeOfRawData) |
- | |
428 | sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData); |
- | |
429 | - | ||
430 | sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align; |
- | |
431 | - | ||
432 | if(sec_size > img_sec->SizeOfRawData) |
- | |
433 | sec_clear(dest_ptr + img_sec->SizeOfRawData, |
- | |
434 | sec_size - img_sec->SizeOfRawData); |
- | |
435 | img_sec++; |
- | |
436 | } |
- | |
437 | - | ||
438 | if(nt->OptionalHeader.DataDirectory[5].Size) |
- | |
439 | { |
- | |
440 | PIMAGE_BASE_RELOCATION reloc; |
- | |
441 | - | ||
442 | /* FIXME addr_t */ |
- | |
443 | - | ||
444 | u32_t delta = (u32_t)img_base - nt->OptionalHeader.ImageBase; |
- | |
445 | - | ||
446 | reloc = MakePtr(PIMAGE_BASE_RELOCATION, img_base, |
- | |
447 | nt->OptionalHeader.DataDirectory[5].VirtualAddress); |
- | |
448 | - | ||
449 | while ( reloc->SizeOfBlock != 0 ) |
- | |
450 | { |
- | |
451 | u32_t cnt; |
- | |
452 | u16_t *entry; |
- | |
453 | u16_t reltype; |
- | |
454 | u32_t offs; |
- | |
455 | - | ||
456 | cnt = (reloc->SizeOfBlock - sizeof(*reloc))/sizeof(u16_t); |
- | |
457 | entry = MakePtr( u16_t*, reloc, sizeof(*reloc) ); |
- | |
458 | - | ||
459 | for ( i=0; i < cnt; i++ ) |
- | |
460 | { |
- | |
461 | u16_t *p16; |
- | |
462 | u32_t *p32; |
- | |
463 | - | ||
464 | reltype = (*entry & 0xF000) >> 12; |
- | |
465 | offs = (*entry & 0x0FFF) + reloc->VirtualAddress; |
- | |
466 | switch(reltype) |
- | |
467 | { |
- | |
468 | case 1: |
- | |
469 | p16 = MakePtr(u16_t*, img_base, offs); |
- | |
470 | *p16+= (u16_t)(delta>>16); |
- | |
471 | break; |
- | |
472 | case 2: |
- | |
473 | p16 = MakePtr(u16_t*, img_base, offs); |
- | |
474 | *p16+= (u16_t)delta; |
- | |
475 | break; |
- | |
476 | case 3: |
- | |
477 | p32 = MakePtr(u32_t*, img_base, offs); |
- | |
478 | *p32+= delta; |
- | |
479 | } |
- | |
480 | entry++; |
- | |
481 | } |
- | |
482 | reloc = MakePtr(PIMAGE_BASE_RELOCATION, reloc,reloc->SizeOfBlock); |
- | |
483 | } |
- | |
484 | }; |
- | |
485 | - | ||
486 | if(nt->OptionalHeader.DataDirectory[1].Size) |
- | |
487 | { |
- | |
488 | PIMAGE_IMPORT_DESCRIPTOR imp; |
- | |
489 | - | ||
490 | int warn = 0; |
- | |
491 | - | ||
492 | imp = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, img_base, |
- | |
493 | nt->OptionalHeader.DataDirectory[1].VirtualAddress); |
- | |
494 | - | ||
495 | - | ||
496 | - | ||
497 | while ( 1 ) |
- | |
498 | { |
- | |
499 | PIMAGE_THUNK_DATA32 thunk; |
- | |
500 | - | ||
501 | PIMAGE_DOS_HEADER expdos; |
- | |
502 | PIMAGE_NT_HEADERS32 expnt; |
- | |
503 | PIMAGE_EXPORT_DIRECTORY exp; |
- | |
504 | - | ||
505 | u32_t *iat; |
- | |
506 | char *libname; |
- | |
507 | addr_t *functions; |
- | |
508 | u16_t *ordinals; |
- | |
509 | char **funcname; |
- | |
510 | - | ||
511 | - | ||
512 | if ( (imp->TimeDateStamp==0 ) && (imp->Name==0) ) |
- | |
513 | break; |
- | |
514 | - | ||
515 | libname=MakePtr(char*,imp->Name, img_base); |
- | |
516 | - | ||
517 | DBG("import from %s\n",libname); |
- | |
518 | - | ||
519 | expdos = (PIMAGE_DOS_HEADER)IMAGE_BASE; |
- | |
520 | expnt = MakePtr( PIMAGE_NT_HEADERS32, expdos, expdos->e_lfanew); |
- | |
521 | - | ||
522 | exp = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE, |
- | |
523 | expnt->OptionalHeader.DataDirectory[0].VirtualAddress); |
- | |
524 | - | ||
525 | functions = MakePtr(DWORD*,exp->AddressOfFunctions,LOAD_BASE); |
- | |
526 | ordinals = MakePtr(WORD*, exp->AddressOfNameOrdinals,LOAD_BASE); |
- | |
527 | funcname = MakePtr(char**, exp->AddressOfNames,LOAD_BASE); |
- | |
528 | - | ||
529 | thunk = MakePtr(PIMAGE_THUNK_DATA32, |
- | |
530 | imp->Characteristics, img_base); |
- | |
531 | iat= MakePtr(DWORD*,imp->FirstThunk, img_base); |
- | |
532 | - | ||
533 | while ( 1 ) // Loop forever (or until we break out) |
- | |
534 | { |
- | |
535 | PIMAGE_IMPORT_BY_NAME ord; |
- | |
536 | addr_t addr; |
- | |
537 | - | ||
538 | if ( thunk->u1.AddressOfData == 0 ) |
- | |
539 | break; |
- | |
540 | - | ||
541 | if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) |
- | |
542 | { |
- | |
543 | // printf(" %4u\n", thunk->u1.Ordinal & 0xFFFF); |
- | |
544 | break; |
- | |
545 | } |
- | |
546 | else |
- | |
547 | { |
- | |
548 | ord = MakePtr(PIMAGE_IMPORT_BY_NAME, |
- | |
549 | thunk->u1.AddressOfData, img_base); |
- | |
550 | *iat=0; |
- | |
551 | - | ||
552 | DBG("import %s", ord->Name); |
- | |
553 | - | ||
554 | if(strncmp(ord->Name, |
- | |
555 | MakePtr(char*,funcname[ord->Hint],LOAD_BASE),32)) |
- | |
556 | { |
- | |
557 | int ind; |
- | |
558 | char **names=funcname; |
- | |
559 | - | ||
560 | for(names = funcname,ind = 0; |
- | |
561 | ind < exp->NumberOfNames; names++,ind++) |
- | |
562 | { |
- | |
563 | if(!strncmp(ord->Name,MakePtr(char*,*names,LOAD_BASE),32)) |
- | |
564 | { |
- | |
565 | DBG(" \tat %x\n", functions[ind] + LOAD_BASE); |
- | |
566 | *iat = functions[ind] + LOAD_BASE; |
- | |
567 | break; |
- | |
568 | }; |
- | |
569 | }; |
- | |
570 | if(ind == exp->NumberOfNames) |
- | |
571 | { |
- | |
572 | DBG(" unresolved import %s\n",ord->Name); |
- | |
573 | warn=1; |
- | |
574 | }; |
- | |
575 | } |
- | |
576 | else |
119 | else |
577 | { |
120 | { |
578 | DBG(" \tat %x\n", functions[ord->Hint] + LOAD_BASE); |
- | |
579 | *iat = functions[ord->Hint] + LOAD_BASE; |
- | |
580 | }; |
121 | md_free( md ); |
581 | }; |
- | |
582 | thunk++; // Advance to next thunk |
- | |
583 | iat++; |
- | |
584 | } |
- | |
585 | imp++; // advance to next IMAGE_IMPORT_DESCRIPTOR |
- | |
586 | }; |
- | |
587 | }; |
- | |
588 | - | ||
589 | DBG("\ncreate pe base %x, size %x, %d sections\n\n",img_base, |
- | |
590 | nt->OptionalHeader.SizeOfImage, nt->FileHeader.NumberOfSections); |
- | |
591 | }; |
- | |
592 | - | ||
593 | - | ||
594 | - | ||
595 | - | ||
596 | - | ||
597 | /* |
- | |
598 | - | ||
599 | u32 map_PE(u32 base, void *image) |
- | |
600 | { |
- | |
601 | PIMAGE_DOS_HEADER dos; |
- | |
602 | PIMAGE_NT_HEADERS32 nt; |
- | |
603 | PIMAGE_SECTION_HEADER sec; |
- | |
604 | - | ||
605 | int i; |
- | |
606 | int pages; |
- | |
607 | - | ||
608 | dos = (PIMAGE_DOS_HEADER)image; |
- | |
609 | nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); |
- | |
610 | - | ||
611 | - | ||
612 | img_size = nt->OptionalHeader.SizeOfImage; |
- | |
613 | img_pages = img_size / PAGE_SIZE; |
- | |
614 | - | ||
615 | img_md = md_alloc(img_size, PG_SW); |
- | |
616 | - | ||
617 | if( !img_md) |
- | |
618 | return NULL; |
122 | return NULL; |
619 | - | ||
620 | - | ||
621 | - | ||
622 | scopy(base,(u32)image,nt->OptionalHeader.SizeOfHeaders); |
- | |
623 | - | ||
624 | sec = MakePtr(PIMAGE_SECTION_HEADER,nt,sizeof(IMAGE_NT_HEADERS32)); |
- | |
625 | - | ||
626 | - | ||
627 | if(nt->OptionalHeader.DataDirectory[1].Size) |
- | |
628 | { |
- | |
629 | PIMAGE_IMPORT_DESCRIPTOR imp; |
- | |
630 | - | ||
631 | imp = MakePtr(PIMAGE_IMPORT_DESCRIPTOR,base, |
- | |
632 | nt->OptionalHeader.DataDirectory[1].VirtualAddress); |
- | |
633 | while ( 1 ) |
- | |
634 | { |
- | |
635 | PIMAGE_THUNK_DATA32 thunk; |
- | |
636 | u32 *iat; |
- | |
637 | char *libname; |
- | |
638 | - | ||
639 | if ( (imp->TimeDateStamp==0 ) && (imp->Name==0) ) |
- | |
640 | break; |
- | |
641 | - | ||
642 | - | ||
643 | thunk = MakePtr(PIMAGE_THUNK_DATA32, |
- | |
644 | imp->Characteristics, base); |
- | |
645 | iat= MakePtr(DWORD*,imp->FirstThunk, base); |
- | |
646 | - | ||
647 | while ( 1 ) // Loop forever (or until we break out) |
- | |
648 | { |
- | |
649 | PIMAGE_IMPORT_BY_NAME ord; |
- | |
650 | - | ||
651 | u32 addr; |
- | |
652 | - | ||
653 | if ( thunk->u1.AddressOfData == 0 ) |
- | |
654 | break; |
- | |
655 | - | ||
656 | if ( thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG ) |
- | |
657 | { |
- | |
658 | // printf(" %4u\n", thunk->u1.Ordinal & 0xFFFF); |
- | |
659 | break; |
- | |
660 | } |
- | |
661 | else |
- | |
662 | { |
- | |
663 | PKERNEL_EXPORT exp; |
- | |
664 | exp = kernel_export; |
- | |
665 | - | ||
666 | ord = MakePtr(PIMAGE_IMPORT_BY_NAME, |
- | |
667 | thunk->u1.AddressOfData,base); |
- | |
668 | *iat=-1; |
- | |
669 | - | ||
670 | do |
- | |
671 | { |
- | |
672 | if(!strncmp(ord->Name,exp->name,16)) |
- | |
673 | { |
- | |
674 | *iat = exp->address; |
- | |
675 | break; |
- | |
676 | } |
123 | } |
677 | exp++; |
- | |
678 | } while(exp->name != 0); |
- | |
679 | }; |
- | |
680 | thunk++; // Advance to next thunk |
- | |
681 | iat++; |
- | |
682 | } |
- | |
683 | imp++; // advance to next IMAGE_IMPORT_DESCRIPTOR |
- | |
684 | } |
124 | }=> |
685 | }; |
- | |
Line 686... | Line -... | ||
686 | - |