source: trunk/src/kernel32/winimagebase.h

Last change on this file was 21916, checked in by dmik, 14 years ago

Merge branch gcc-kmk to trunk.

File size: 6.8 KB
RevLine 
[10397]1/* $Id: winimagebase.h,v 1.24 2004-01-15 10:39:11 sandervl Exp $ */
[3059]2
3/*
4 * Win32 PE Image base class
5 *
[3404]6 * Copyright 1998-1999 Sander van Leeuwen (sandervl@xs4all.nl)
[4249]7 * Copyright 1999-2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
[3059]8 *
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13#ifndef __WINIMAGEBASE_H__
14#define __WINIMAGEBASE_H__
15
16#include <peexe.h>
17#include "queue.h"
[9537]18#include <odinpe.h>
[4023]19#ifdef OS2_INCLUDED
20#include <winconst.h>
21#else
[21916]22#include <win/winnls.h>
[4023]23#endif
[3059]24
25#define MAGIC_WINIMAGE 0x11223344
26
27#ifndef CCHMAXPATH
28#define CCHMAXPATH 260
29#endif
30
[3765]31#define ID_GETFIRST 0xF0000000
[3059]32
33class Win32Resource;
34class Win32DllBase;
35
[4249]36
[3059]37class Win32ImageBase
38{
39protected:
40 DWORD magic;
41public:
[4249]42 void checkObject()
43 {
44 if (magic != MAGIC_WINIMAGE) {
45 eprintf(("Corrupt this pointer %X %X!!", this, magic));
46 DebugInt3();
47 }
48 };
[3059]49
50public:
51 // Constructors and destructors
52 Win32ImageBase(HINSTANCE hInstance);
53virtual ~Win32ImageBase();
54
[4249]55 ULONG getError() { return errorState; };
56 HINSTANCE getInstanceHandle() { return hinstance; };
[3059]57
58//Returns required OS version for this image
[3765]59virtual ULONG getVersion();
[3059]60
[3765]61virtual void setFullPath(char *name);
[4249]62 char *getFullPath() { return fullpath; };
63 char *getModuleName() { return szModule; };
[3059]64
[3625]65 //findResource returns the pointer of the resource's IMAGE_RESOURCE_DATA_ENTRY structure
[4249]66 HRSRC findResourceA(LPCSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
67 HRSRC findResourceW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
[3625]68
[4249]69 ULONG getResourceSizeA(LPSTR lpszName, LPSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
70 ULONG getResourceSizeW(LPWSTR lpszName, LPWSTR lpszType, ULONG lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
71 BOOL enumResourceNamesA(HMODULE hmod, LPCTSTR lpszType, ENUMRESNAMEPROCA lpEnumFunc, LONG lParam);
72 BOOL enumResourceNamesW(HMODULE hmod, LPCWSTR lpszType, ENUMRESNAMEPROCW lpEnumFunc, LONG lParam);
73 BOOL enumResourceTypesA(HMODULE hmod, ENUMRESTYPEPROCA lpEnumFunc,
74 LONG lParam);
75 BOOL enumResourceTypesW(HMODULE hmod, ENUMRESTYPEPROCW lpEnumFunc,
76 LONG lParam);
77 BOOL enumResourceLanguagesA(HMODULE hmod, LPCSTR lpType, LPCSTR lpName,
78 ENUMRESLANGPROCA lpEnumFunc, LONG lParam);
79 BOOL enumResourceLanguagesW(HMODULE hmod, LPCWSTR lpType, LPCWSTR lpName,
80 ENUMRESLANGPROCW lpEnumFunc, LONG lParam);
[3059]81
[4249]82 ULONG getVersionSize();
83 BOOL getVersionStruct(char *verstruct, ULONG bufLength);
[3059]84
[4249]85 //Returns pointer to data of resource handle
86 char *getResourceAddr(HRSRC hResource);
87 ULONG getResourceSize(HRSRC hResource);
[3625]88
[4474]89//returns ERROR_SUCCESS or error code (Characteristics will contain
90//the Characteristics member of the file header structure)
[5959]91static ULONG isPEImage(char *szFileName, DWORD *Characteristics, DWORD *subsystem, DWORD *fNEExe = NULL);
[3397]92static BOOL findDll(const char *pszFileName, char *pszFullName,
93 int cchFullName, const char *pszAltPath = NULL);
[3059]94
[4249]95 void setEntryPoint(ULONG startAddress) { entryPoint = startAddress; };
[3059]96
[4249]97 void setTLSAddress(LPVOID dwTlsAddress) { tlsAddress = dwTlsAddress; };
98 void setTLSIndexAddr(LPDWORD dwTlsIndexAddr) { tlsIndexAddr = dwTlsIndexAddr; };
99 void setTLSInitSize(ULONG dwTlsSize) { tlsInitSize = dwTlsSize; };
100 void setTLSTotalSize(ULONG dwTlsSize) { tlsTotalSize = dwTlsSize; };
101 void setTLSCallBackAddr(PIMAGE_TLS_CALLBACK *dwTlsCallBackAddr)
102 {
103 tlsCallBackAddr = dwTlsCallBackAddr;
104 };
[3059]105
[4249]106 void tlsAttachThread(); //setup TLS structures for new thread
107 void tlsDetachThread(); //destroy TLS structures
[3059]108
[3483]109virtual BOOL insideModule(ULONG address);
110virtual BOOL insideModuleCode(ULONG address);
111
[10397]112virtual ULONG getApi(char *name);
113virtual ULONG getApi(int ordinal);
[3059]114
[9617]115virtual ULONG setApi(char *name, ULONG pfnNewProc);
116virtual ULONG setApi(int ordinal, ULONG pfnNewProc);
117
[3609]118virtual ULONG getImageSize();
119
[7811]120virtual BOOL isDll() = 0;
121 BOOL isPEImage() { return fIsPEImage; };
[3059]122
123static Win32ImageBase * findModule(HMODULE hModule);
[4249]124 BOOL matchModName(const char *pszFilename) const;
[3059]125
[4249]126 /* @cat Depencies */
127 //Add image to dependency list of this image
128 void addDependency(Win32DllBase *dll);
129 BOOL dependsOn(Win32DllBase *dll);
[3059]130
131protected:
[4249]132 void tlsAlloc(); //Allocate TLS index for this module
133 void tlsDelete(); //Destroy TLS index for this module
[3059]134
[10397]135 ULONG findApi(char *pszName, ULONG ulOrdinal, ULONG pfnNewProc = NULL);
136 ULONG findForwarder(ULONG virtaddr, char *apiname, ULONG ordinal);
137 virtual void *getPointerFromRVA(ULONG ulRVA, BOOL fOverride = FALSE);
138 void * getPointerFromRVA(const void *pvRVA) { return getPointerFromRVA((ULONG)pvRVA); }
139 virtual ULONG getRVAFromPointer(void *pv, BOOL fOverride = FALSE);
140
[4249]141 ULONG errorState,
142 entryPoint;
[3059]143
[4249]144 char * fullpath;
145 char szModule[CCHMAXPATH];
146 char szFileName[CCHMAXPATH];
[3059]147
[4249]148 HINSTANCE hinstance;
[7811]149 BOOL fIsPEImage;
[3059]150
[4249]151 LPVOID tlsAddress; //address of TLS data
152 LPDWORD tlsIndexAddr; //address of DWORD that receives the TLS index
153 ULONG tlsInitSize; //size of initialized TLS memory block
154 ULONG tlsTotalSize; //size of TLS memory block
155 PIMAGE_TLS_CALLBACK * tlsCallBackAddr; //ptr to TLS callback array
156 ULONG tlsIndex; //module TLS index
[3059]157
[4249]158 PIMAGE_RESOURCE_DIRECTORY getResSubDirW(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCWSTR lpszName);
159 PIMAGE_RESOURCE_DIRECTORY getResSubDirA(PIMAGE_RESOURCE_DIRECTORY pResDir, LPCTSTR lpszName);
[3059]160
[4249]161 PIMAGE_RESOURCE_DATA_ENTRY getResDataLang(PIMAGE_RESOURCE_DIRECTORY pResDir, ULONG language, BOOL fGetDefault = FALSE);
[3059]162
[4249]163 HRSRC getResourceLang(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch);
164 HRSRC getResourceLangEx(PIMAGE_RESOURCE_DIRECTORY pResDirToSearch,
165 DWORD lang);
[4023]166
[4249]167 PIMAGE_RESOURCE_DIRECTORY pResRootDir;
[3765]168
[10397]169 PIMAGE_EXPORT_DIRECTORY pExportDir;
170 PIMAGE_OPTIONAL_HEADER poh;
171
[4249]172 //substracted from RVA data offsets
173 ULONG ulRVAResourceSection;
[3059]174
[4249]175 //linked list of dlls loaded on behalf of this executable image (dll or exe)
176 Queue loadedDlls;
177
[3059]178private:
[4249]179 friend class Win32Resource;
180 friend ULONG SYSTEM GetVersionSize(char *modname);
[3059]181};
182
183#endif //__WINIMAGEBASE_H__
Note: See TracBrowser for help on using the repository browser.