source: trunk/src/kernel32/pefile.cpp@ 3830

Last change on this file since 3830 was 3759, checked in by sandervl, 25 years ago

* empty log message *

File size: 6.1 KB
Line 
1/* $Id: pefile.cpp,v 1.9 2000-06-26 13:21:34 sandervl Exp $ */
2
3/*
4 * PE2LX PE utility functions
5 *
6 * Project Odin Software License can be found in LICENSE.TXT
7 *
8 */
9#define INCL_BASE
10#include <os2wrap.h> //Odin32 OS/2 api wrappers
11#include <stdio.h>
12#include <string.h>
13#include <stdlib.h>
14#include <win32type.h>
15#include <pefile.h>
16#include <misc.h>
17
18#define DBG_LOCALLOG DBG_pefile
19#include "dbglocal.h"
20
21//******************************************************************************
22//******************************************************************************
23char *UnicodeToFixedAsciiString(int length, WCHAR *NameString)
24{
25static char asciistring[256];
26int i;
27
28 if(length >= 255) length = 255;
29 for(i=0;i<length;i++) {
30 asciistring[i] = NameString[i] & 0xFF;
31 }
32 asciistring[length] = 0;
33 return(asciistring);
34}
35//******************************************************************************
36//******************************************************************************
37BOOL GetPEFileHeader (LPVOID lpFile, PIMAGE_FILE_HEADER pHeader)
38{
39 if(*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE &&
40 *(DWORD *)PE_HEADER (lpFile) == IMAGE_NT_SIGNATURE)
41 {
42 memcpy ((LPVOID)pHeader, PEHEADEROFF (lpFile), sizeof (IMAGE_FILE_HEADER));
43 return TRUE;
44 }
45 else return FALSE;
46}
47//******************************************************************************
48//******************************************************************************
49BOOL GetPEOptionalHeader (LPVOID lpFile, PIMAGE_OPTIONAL_HEADER pHeader)
50{
51 if(*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE &&
52 *(DWORD *)PE_HEADER (lpFile) == IMAGE_NT_SIGNATURE)
53 {
54 memcpy ((LPVOID)pHeader, OPTHEADEROFF (lpFile), sizeof (IMAGE_OPTIONAL_HEADER));
55 return TRUE;
56 }
57 else return FALSE;
58}
59//******************************************************************************
60//******************************************************************************
61LPVOID ImageDirectoryOffset(LPVOID lpFile, DWORD dwIMAGE_DIRECTORY)
62{
63 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
64 IMAGE_SECTION_HEADER sh;
65
66 if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
67 return NULL;
68
69 if(GetSectionHdrByRVA(lpFile, &sh, poh->DataDirectory[dwIMAGE_DIRECTORY].VirtualAddress) == FALSE)
70 {
71 return NULL;
72 }
73
74 return (LPVOID)((ULONG)lpFile + poh->DataDirectory[dwIMAGE_DIRECTORY].VirtualAddress);
75}
76//******************************************************************************
77//******************************************************************************
78DWORD ImageDirectorySize(LPVOID lpFile, DWORD dwIMAGE_DIRECTORY)
79{
80 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
81 IMAGE_SECTION_HEADER sh;
82
83 if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
84 return 0;
85
86 if(GetSectionHdrByRVA(lpFile, &sh, poh->DataDirectory[dwIMAGE_DIRECTORY].VirtualAddress) == FALSE)
87 {
88 return 0;
89 }
90
91 return poh->DataDirectory[dwIMAGE_DIRECTORY].Size;
92}
93//******************************************************************************
94//******************************************************************************
95BOOL GetSectionHdrByImageDir(LPVOID lpFile, DWORD dwIMAGE_DIRECTORY, PIMAGE_SECTION_HEADER pSect)
96{
97 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
98
99 if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
100 return FALSE;
101
102 return GetSectionHdrByRVA(lpFile, pSect, poh->DataDirectory[dwIMAGE_DIRECTORY].VirtualAddress);
103}
104//******************************************************************************
105//******************************************************************************
106BOOL IsImportSection(LPVOID lpFile, PIMAGE_SECTION_HEADER psh)
107{
108 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
109 int i = 0;
110 DWORD ImageDirVA;
111
112 ImageDirVA = poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
113
114 if(psh->VirtualAddress <= ImageDirVA &&
115 psh->VirtualAddress + max(psh->Misc.VirtualSize,psh->SizeOfRawData) > ImageDirVA &&
116 strcmp(psh->Name, ".idata") == 0)
117 {
118 return TRUE;
119 }
120 return FALSE;
121}
122//******************************************************************************
123//******************************************************************************
124BOOL GetSectionHdrByName (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, char *szSection)
125{
126 PIMAGE_SECTION_HEADER psh;
127 int nSections = NR_SECTIONS (lpFile);
128 int i;
129
130 if((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
131 {
132 for(i=0; i<nSections; i++)
133 {
134 if(strcmp (psh->Name, szSection) == 0)
135 {
136 memcpy ((LPVOID)sh, (LPVOID)psh, sizeof (IMAGE_SECTION_HEADER));
137 return TRUE;
138 }
139 else psh++;
140 }
141 }
142 return FALSE;
143}
144//******************************************************************************
145//******************************************************************************
146BOOL GetSectionHdrByType (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, int type)
147{
148 PIMAGE_SECTION_HEADER psh;
149 int nSections = NR_SECTIONS (lpFile);
150 int i;
151
152 if((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
153 {
154 for(i=0; i<nSections; i++)
155 {
156 if(psh->Characteristics & type)
157 {
158 memcpy ((LPVOID)sh, (LPVOID)psh, sizeof (IMAGE_SECTION_HEADER));
159 return TRUE;
160 }
161 else psh++;
162 }
163 }
164 return FALSE;
165}
166/** Get Section Header for the given RVA - returns boolean according to the result
167 *
168 * knut [Jul 22 1998 2:53am]
169 */
170BOOL GetSectionHdrByRVA (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, ULONG rva)
171{
172 PIMAGE_SECTION_HEADER psh;
173 int nSections = NR_SECTIONS (lpFile);
174 int i;
175
176 if ((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
177 {
178 for (i=0; i<nSections; i++)
179 {
180 if (rva >= psh->VirtualAddress && rva < psh->VirtualAddress + max(psh->Misc.VirtualSize,psh->SizeOfRawData))
181 {
182 memcpy (sh, psh, sizeof(IMAGE_SECTION_HEADER));
183 return TRUE;
184 }
185 else psh++;
186 }
187 }
188 return FALSE;
189}
190//******************************************************************************
191//******************************************************************************
Note: See TracBrowser for help on using the repository browser.