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

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

resource handling changes

File size: 5.6 KB
Line 
1/* $Id: pefile.cpp,v 1.8 2000-05-28 16:45:12 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//******************************************************************************
78BOOL GetSectionHdrByImageDir(LPVOID lpFile, DWORD dwIMAGE_DIRECTORY, PIMAGE_SECTION_HEADER pSect)
79{
80 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
81
82 if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
83 return FALSE;
84
85 return GetSectionHdrByRVA(lpFile, pSect, poh->DataDirectory[dwIMAGE_DIRECTORY].VirtualAddress);
86}
87//******************************************************************************
88//******************************************************************************
89BOOL IsImportSection(LPVOID lpFile, PIMAGE_SECTION_HEADER psh)
90{
91 PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)OPTHEADEROFF (lpFile);
92 int i = 0;
93 DWORD ImageDirVA;
94
95 ImageDirVA = poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
96
97 if(psh->VirtualAddress <= ImageDirVA &&
98 psh->VirtualAddress + max(psh->Misc.VirtualSize,psh->SizeOfRawData) > ImageDirVA &&
99 strcmp(psh->Name, ".idata") == 0)
100 {
101 return TRUE;
102 }
103 return FALSE;
104}
105//******************************************************************************
106//******************************************************************************
107BOOL GetSectionHdrByName (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, char *szSection)
108{
109 PIMAGE_SECTION_HEADER psh;
110 int nSections = NR_SECTIONS (lpFile);
111 int i;
112
113 if((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
114 {
115 for(i=0; i<nSections; i++)
116 {
117 if(strcmp (psh->Name, szSection) == 0)
118 {
119 memcpy ((LPVOID)sh, (LPVOID)psh, sizeof (IMAGE_SECTION_HEADER));
120 return TRUE;
121 }
122 else psh++;
123 }
124 }
125 return FALSE;
126}
127//******************************************************************************
128//******************************************************************************
129BOOL GetSectionHdrByType (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, int type)
130{
131 PIMAGE_SECTION_HEADER psh;
132 int nSections = NR_SECTIONS (lpFile);
133 int i;
134
135 if((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
136 {
137 for(i=0; i<nSections; i++)
138 {
139 if(psh->Characteristics & type)
140 {
141 memcpy ((LPVOID)sh, (LPVOID)psh, sizeof (IMAGE_SECTION_HEADER));
142 return TRUE;
143 }
144 else psh++;
145 }
146 }
147 return FALSE;
148}
149/** Get Section Header for the given RVA - returns boolean according to the result
150 *
151 * knut [Jul 22 1998 2:53am]
152 */
153BOOL GetSectionHdrByRVA (LPVOID lpFile, IMAGE_SECTION_HEADER *sh, ULONG rva)
154{
155 PIMAGE_SECTION_HEADER psh;
156 int nSections = NR_SECTIONS (lpFile);
157 int i;
158
159 if ((psh = (PIMAGE_SECTION_HEADER)SECTIONHDROFF (lpFile)) != NULL)
160 {
161 for (i=0; i<nSections; i++)
162 {
163 if (rva >= psh->VirtualAddress && rva < psh->VirtualAddress + max(psh->Misc.VirtualSize,psh->SizeOfRawData))
164 {
165 memcpy (sh, psh, sizeof(IMAGE_SECTION_HEADER));
166 return TRUE;
167 }
168 else psh++;
169 }
170 }
171 return FALSE;
172}
173//******************************************************************************
174//******************************************************************************
Note: See TracBrowser for help on using the repository browser.