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

Last change on this file since 9901 was 9617, checked in by sandervl, 23 years ago

added dll load hook and function to override named or ordinal exports

File size: 5.2 KB
Line 
1/* $Id: winimagepeldr.h,v 1.19 2003-01-05 12:31:26 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 DWORD 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 virtual ULONG setApi(char *name, ULONG pfnNewProc);
90 virtual ULONG setApi(int ordinal, ULONG pfnNewProc);
91
92 virtual ULONG getImageSize();
93
94 //Returns required OS version for this image
95 virtual ULONG getVersion();
96
97 //tell loader to only process resources and ignore the rest
98 void setLoadAsDataFile() { dwFlags |= FLAG_PELDR_LOADASDATAFILE; };
99 void disableImportHandling() { dwFlags |= FLAG_PELDR_SKIPIMPORTS; };
100
101 //commits image page(s) when an access violation exception is dispatched
102 BOOL commitPage(ULONG virtAddress, BOOL fWriteAccess, int fPageCmd = SECTION_PAGES);
103
104protected:
105 void StoreImportByOrd(Win32ImageBase *WinImage, ULONG ordinal, ULONG impaddr);
106 void StoreImportByName(Win32ImageBase *WinImage, char *impname, ULONG impaddr);
107
108 void addSection(ULONG type, ULONG rawoffset, ULONG rawsize, ULONG virtaddress, ULONG virtsize, ULONG flags);
109 BOOL allocSections(ULONG reservedMem);
110 BOOL allocFixedMem(ULONG reservedMem);
111 Section *findSection(ULONG type);
112 Section *findSectionByAddr(ULONG addr);
113 Section *findSectionByOS2Addr(ULONG addr);
114 Section *findPreviousSectionByOS2Addr(ULONG addr);
115
116 OrdExport *findApi(int ordinal);
117 NameExport *findApi(char *name);
118
119 BOOL setMemFlags();
120 BOOL setFixups(PIMAGE_BASE_RELOCATION prel);
121 BOOL setFixups(ULONG virtAddress, ULONG size);
122 void AddOff32Fixup(ULONG fixupaddr);
123 void AddOff16Fixup(ULONG fixupaddr, BOOL fHighFixup);
124
125 BOOL processImports(char *win32file);
126
127 BOOL processExports(char *win32file);
128 void AddNameExport(ULONG virtaddr, char *apiname, ULONG ordinal, BOOL fAbsoluteAddress=FALSE);
129 void AddOrdExport(ULONG virtaddr, ULONG ordinal, BOOL fAbsoluteAddress=FALSE);
130 BOOL AddForwarder(ULONG virtaddr, char *apiname, ULONG ordinal);
131
132Win32DllBase *loadDll(char *pszCurModule);
133
134 IMAGE_OPTIONAL_HEADER oh;
135 IMAGE_FILE_HEADER fh;
136
137 ULONG nrNameExports, nameExportSize;
138 ULONG nrOrdExports;
139 ULONG nrOrdExportsRegistered;
140 NameExport *nameexports, *curnameexport;
141 OrdExport *ordexports, *curordexport;
142
143 ULONG nrsections, imageSize, imageVirtBase, imageVirtEnd;
144 //OS/2 virtual base address
145 ULONG realBaseAddress;
146 Section *section;
147
148 //offset in executable image where real PE file starts (default 0)
149 ULONG ulPEOffset;
150
151 //internal flags (see FLAGS_PELDR_*)
152 DWORD dwFlags;
153
154 HFILE hFile;
155
156 PIMAGE_BASE_RELOCATION pFixups;
157 DWORD dwFixupSize;
158
159 Win32MemMap *memmap;
160private:
161};
162
163#endif //__WINIMAGEPELDR_H__
164
Note: See TracBrowser for help on using the repository browser.