source: trunk/src/kernel32/winimagepeldr.h@ 9304

Last change on this file since 9304 was 8913, checked in by sandervl, 23 years ago

Enhanced PE loader class to support files with PE image starting at an offset ..= 0 (custom build) & Fixes for memory map view with offset

File size: 5.1 KB
Line 
1/* $Id: winimagepeldr.h,v 1.17 2002-07-23 13:51:49 sandervl Exp $ */
2
3/*
4 * Win32 PE loader Image base class
5 *
6 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#ifndef __WINIMAGEPELDR_H__
13#define __WINIMAGEPELDR_H__
14
15#include <winimagebase.h>
16
17#define SINGLE_PAGE 0 //commit single page
18#define COMPLETE_SECTION 1 //commit entire section
19#define SECTION_PAGES 2 //commit default nr of pages
20
21#define DEFAULT_NR_PAGES 16 //default nr of pages to commit during exception
22
23//SvL: To load a dll/exe for i.e. getting a single resource (GetVersionSize/Resource)
24#define FLAG_PELDR_LOADASDATAFILE 1 //also implies FLAG_PELDR_SKIPIMPORTS
25#define FLAG_PELDR_SKIPIMPORTS 2
26
27//SvL: Amount of memory the peldr dll reserves for win32 exes without fixups
28//(most of them need to be loaded at 4 MB; except MS Office apps of course)
29#define PELDR_RESERVEDMEMSIZE 32*1024*1024
30
31#define ERROR_INTERNAL 1
32
33#define SECTION_CODE 1
34#define SECTION_INITDATA 2
35#define SECTION_UNINITDATA 4
36#define SECTION_READONLYDATA 8
37#define SECTION_IMPORT 16
38#define SECTION_RESOURCE 32
39#define SECTION_RELOC 64
40#define SECTION_EXPORT 128
41#define SECTION_DEBUG 256
42#define SECTION_TLS 512
43
44#define PAGE_SIZE 4096
45
46typedef struct {
47 ULONG rawoffset;
48 ULONG rawsize;
49 ULONG virtaddr;
50 ULONG realvirtaddr; //as allocated in OS/2
51 ULONG virtualsize;
52 ULONG type;
53 ULONG pageflags;
54 ULONG flags; //psh[i].Characteristics
55} Section;
56
57typedef struct {
58 ULONG virtaddr;
59 ULONG ordinal;
60 ULONG nlength;
61 char name[4];
62} NameExport;
63
64typedef struct {
65 ULONG virtaddr;
66 ULONG ordinal;
67} OrdExport;
68
69class Win32DllBase;
70class Win32MemMap;
71
72class Win32PeLdrImage : public virtual Win32ImageBase
73{
74public:
75 Win32PeLdrImage(char *szFileName, BOOL isExe);
76virtual ~Win32PeLdrImage();
77
78 //reservedMem: address of memory reserved in peldr.dll (allocated before
79 // any dlls are loaded, so that exes without fixups can be
80 // loaded at a low address)
81 //ulPEOffset: offset in file where real PE image starts
82 virtual BOOL init(ULONG reservedMem, ULONG ulPEOffset = 0);
83
84 virtual BOOL insideModule(ULONG address);
85 virtual BOOL insideModuleCode(ULONG address);
86
87 virtual ULONG getApi(char *name);
88 virtual ULONG getApi(int ordinal);
89
90 virtual ULONG getImageSize();
91
92 //Returns required OS version for this image
93 virtual ULONG getVersion();
94
95 //tell loader to only process resources and ignore the rest
96 void setLoadAsDataFile() { dwFlags |= FLAG_PELDR_LOADASDATAFILE; };
97 void disableImportHandling() { dwFlags |= FLAG_PELDR_SKIPIMPORTS; };
98
99 //commits image page(s) when an access violation exception is dispatched
100 BOOL commitPage(ULONG virtAddress, BOOL fWriteAccess, int fPageCmd = SECTION_PAGES);
101
102protected:
103 void StoreImportByOrd(Win32ImageBase *WinImage, ULONG ordinal, ULONG impaddr);
104 void StoreImportByName(Win32ImageBase *WinImage, char *impname, ULONG impaddr);
105
106 void addSection(ULONG type, ULONG rawoffset, ULONG rawsize, ULONG virtaddress, ULONG virtsize, ULONG flags);
107 BOOL allocSections(ULONG reservedMem);
108 BOOL allocFixedMem(ULONG reservedMem);
109 Section *findSection(ULONG type);
110 Section *findSectionByAddr(ULONG addr);
111 Section *findSectionByOS2Addr(ULONG addr);
112 Section *findPreviousSectionByOS2Addr(ULONG addr);
113
114 BOOL setMemFlags();
115 BOOL setFixups(PIMAGE_BASE_RELOCATION prel);
116 BOOL setFixups(ULONG virtAddress, ULONG size);
117 void AddOff32Fixup(ULONG fixupaddr);
118 void AddOff16Fixup(ULONG fixupaddr, BOOL fHighFixup);
119
120 BOOL processImports(char *win32file);
121
122 BOOL processExports(char *win32file);
123 void AddNameExport(ULONG virtaddr, char *apiname, ULONG ordinal, BOOL fAbsoluteAddress=FALSE);
124 void AddOrdExport(ULONG virtaddr, ULONG ordinal, BOOL fAbsoluteAddress=FALSE);
125 BOOL AddForwarder(ULONG virtaddr, char *apiname, ULONG ordinal);
126
127Win32DllBase *loadDll(char *pszCurModule);
128
129 IMAGE_OPTIONAL_HEADER oh;
130 IMAGE_FILE_HEADER fh;
131
132 ULONG nrNameExports, nameExportSize;
133 ULONG nrOrdExports;
134 ULONG nrOrdExportsRegistered;
135 NameExport *nameexports, *curnameexport;
136 OrdExport *ordexports, *curordexport;
137
138 ULONG nrsections, imageSize, imageVirtBase, imageVirtEnd;
139 //OS/2 virtual base address
140 ULONG realBaseAddress;
141 Section *section;
142
143 //offset in executable image where real PE file starts (default 0)
144 ULONG ulPEOffset;
145
146 //internal flags (see FLAGS_PELDR_*)
147 DWORD dwFlags;
148
149 HFILE hFile;
150
151 PIMAGE_BASE_RELOCATION pFixups;
152 DWORD dwFixupSize;
153
154 Win32MemMap *memmap;
155private:
156};
157
158#endif //__WINIMAGEPELDR_H__
159
Note: See TracBrowser for help on using the repository browser.