source: trunk/src/imagehlp/access.cpp@ 3922

Last change on this file since 3922 was 3922, checked in by bird, 25 years ago

Added the CVS Id keyword.

File size: 8.4 KB
Line 
1/* $Id: access.cpp,v 1.2 2000-08-02 14:56:26 bird Exp $ */
2/*
3 * IMAGEHLP library
4 *
5 * Copyright 1998 Patrik Stridvall
6 */
7
8#include <os2win.h>
9#include <odinwrap.h>
10#include <imagehlp.h>
11#include <heapstring.h>
12
13ODINDEBUGCHANNEL(imagehlp)
14
15/***********************************************************************
16 * Data
17 */
18
19static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
20static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
21
22static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
23 NULL, /* ModuleName */
24 0xffffffff, /* hFile */
25 NULL, /* MappedAddress */
26 NULL, /* FileHeader */
27 NULL, /* LastRvaSection */
28 0, /* NumberOfSections */
29 NULL, /* Sections */
30 1, /* Characteristics */
31 FALSE, /* fSystemImage */
32 FALSE, /* fDOSImage */
33 { &IMAGEHLP_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
34 148, /* SizeOfImage; */
35};
36
37/***********************************************************************
38 * EnumerateLoadedModules (IMAGEHLP.@)
39 */
40BOOL WINAPI EnumerateLoadedModules(
41 HANDLE hProcess,
42 PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
43 PVOID UserContext)
44{
45 dprintf(("(0x%08x, %p, %p): stub\n",
46 hProcess, EnumLoadedModulesCallback, UserContext
47 ));
48 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
49 return FALSE;
50}
51
52/***********************************************************************
53 * GetTimestampForLoadedLibrary (IMAGEHLP.@)
54 */
55DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
56{
57 dprintf(("(0x%08x): stub\n", Module));
58 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
59 return 0;
60}
61
62/***********************************************************************
63 * GetImageConfigInformation (IMAGEHLP.@)
64 */
65BOOL WINAPI GetImageConfigInformation(
66 PLOADED_IMAGE LoadedImage,
67 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
68{
69 dprintf(("(%p, %p): stub\n",
70 LoadedImage, ImageConfigInformation
71 ));
72 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
73 return FALSE;
74}
75
76/***********************************************************************
77 * GetImageUnusedHeaderBytes (IMAGEHLP.@)
78 */
79DWORD WINAPI GetImageUnusedHeaderBytes(
80 PLOADED_IMAGE LoadedImage,
81 LPDWORD SizeUnusedHeaderBytes)
82{
83 dprintf(("(%p, %p): stub\n",
84 LoadedImage, SizeUnusedHeaderBytes
85 ));
86 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
87 return 0;
88}
89
90/***********************************************************************
91 * ImageDirectoryEntryToData (IMAGEHLP.@)
92 */
93PVOID WINAPI ImageDirectoryEntryToData(
94 PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
95{
96 dprintf(("(%p, %d, %hd, %p): stub\n",
97 Base, MappedAsImage, DirectoryEntry, Size
98 ));
99 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
100 return NULL;
101}
102
103/***********************************************************************
104 * ImageLoad (IMAGEHLP.@)
105 */
106PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
107{
108 PLOADED_IMAGE pLoadedImage =
109 (_LOADED_IMAGE*)HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
110 return pLoadedImage;
111}
112
113/***********************************************************************
114 * ImageNtHeader (IMAGEHLP.@)
115 */
116PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
117{
118 return (PIMAGE_NT_HEADERS)
119 ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
120}
121
122/***********************************************************************
123 * ImageRvaToSection (IMAGEHLP.@)
124 */
125PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
126 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
127{
128 dprintf(("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva));
129 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
130 return NULL;
131}
132
133/***********************************************************************
134 * ImageRvaToVa (IMAGEHLP.@)
135 */
136PVOID WINAPI ImageRvaToVa(
137 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
138 PIMAGE_SECTION_HEADER *LastRvaSection)
139{
140 dprintf(("(%p, %p, %ld, %p): stub\n",
141 NtHeaders, Base, Rva, LastRvaSection
142 ));
143 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
144 return NULL;
145}
146
147/***********************************************************************
148 * ImageUnload (IMAGEHLP.@)
149 */
150BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
151{
152 LIST_ENTRY *pCurrent, *pFind;
153 if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
154 {
155 /* No image loaded or null pointer */
156 SetLastError(ERROR_INVALID_PARAMETER);
157 return FALSE;
158 }
159
160 pFind=&pLoadedImage->Links;
161 pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
162 while((pCurrent != pFind) &&
163 (pCurrent != NULL))
164 pCurrent = pCurrent->Flink;
165 if(!pCurrent)
166 {
167 /* Not found */
168 SetLastError(ERROR_INVALID_PARAMETER);
169 return FALSE;
170 }
171
172 if(pCurrent->Blink)
173 pCurrent->Blink->Flink = pCurrent->Flink;
174 else
175 IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
176 pCurrent->Flink, LOADED_IMAGE, Links):NULL;
177
178 if(pCurrent->Flink)
179 pCurrent->Flink->Blink = pCurrent->Blink;
180 else
181 IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
182 pCurrent->Blink, LOADED_IMAGE, Links):NULL;
183
184 return FALSE;
185}
186
187/***********************************************************************
188 * MapAndLoad (IMAGEHLP.@)
189 */
190BOOL WINAPI MapAndLoad(
191 LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
192 BOOL bDotDll, BOOL bReadOnly)
193{
194 CHAR szFileName[MAX_PATH];
195 HANDLE hFile = (HANDLE) NULL;
196 HANDLE hFileMapping = (HANDLE) NULL;
197 HMODULE hModule = (HMODULE) NULL;
198 PIMAGE_NT_HEADERS pNtHeader = NULL;
199
200 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
201 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
202
203 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */
204 if(!(hFile = CreateFileA(
205 szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
206 NULL, OPEN_EXISTING, 0, (HANDLE) NULL)))
207 {
208 SetLastError(ERROR_FILE_NOT_FOUND);
209 goto Error;
210 }
211
212 if(!(hFileMapping = CreateFileMappingA(
213 hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
214 {
215 DWORD dwLastError = GetLastError();
216 dprintf(("CreateFileMapping: Error = %ld\n", dwLastError));
217 SetLastError(dwLastError);
218 goto Error;
219 }
220 CloseHandle(hFile);
221 hFile = (HANDLE) NULL;
222
223 if(!(hModule = (HMODULE) MapViewOfFile(
224 hFileMapping, FILE_MAP_READ, 0, 0, 0)))
225 {
226 DWORD dwLastError = GetLastError();
227 dprintf(("MapViewOfFile: Error = %ld\n", dwLastError));
228 SetLastError(dwLastError);
229 goto Error;
230 }
231
232 CloseHandle(hFileMapping);
233 hFileMapping=(HANDLE) NULL;
234
235 pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
236 IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
237 );
238
239 pNtHeader = ImageNtHeader((PVOID) hModule);
240
241 pLoadedImage->ModuleName =
242 HEAP_strdupA(IMAGEHLP_hHeap, 0, pszDllPath); /* FIXME: Correct? */
243 pLoadedImage->hFile = hFile;
244 pLoadedImage->MappedAddress = (PUCHAR) hModule;
245 pLoadedImage->FileHeader = pNtHeader;
246 pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
247 ((LPBYTE) &pNtHeader->OptionalHeader +
248 pNtHeader->FileHeader.SizeOfOptionalHeader);
249 pLoadedImage->NumberOfSections =
250 pNtHeader->FileHeader.NumberOfSections;
251 pLoadedImage->SizeOfImage =
252 pNtHeader->OptionalHeader.SizeOfImage;
253 pLoadedImage->Characteristics =
254 pNtHeader->FileHeader.Characteristics;
255 pLoadedImage->LastRvaSection = pLoadedImage->Sections;
256
257 pLoadedImage->fSystemImage = FALSE; /* FIXME */
258 pLoadedImage->fDOSImage = FALSE; /* FIXME */
259
260 /* FIXME: Make thread safe */
261 pLoadedImage->Links.Flink = NULL;
262 pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
263 if(IMAGEHLP_pLastLoadedImage)
264 IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
265 IMAGEHLP_pLastLoadedImage = pLoadedImage;
266 if(!IMAGEHLP_pFirstLoadedImage)
267 IMAGEHLP_pFirstLoadedImage = pLoadedImage;
268
269 return TRUE;
270
271Error:
272 if(hModule)
273 UnmapViewOfFile((PVOID) hModule);
274 if(hFileMapping)
275 CloseHandle(hFileMapping);
276 if(hFile)
277 CloseHandle(hFile);
278 return FALSE;
279}
280
281/***********************************************************************
282 * SetImageConfigInformation (IMAGEHLP.@)
283 */
284BOOL WINAPI SetImageConfigInformation(
285 PLOADED_IMAGE LoadedImage,
286 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
287{
288 dprintf(("(%p, %p): stub\n",
289 LoadedImage, ImageConfigInformation
290 ));
291 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
292 return FALSE;
293}
294
295/***********************************************************************
296 * UnMapAndLoad (IMAGEHLP.@)
297 */
298BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
299{
300 dprintf(("(%p): stub\n", LoadedImage));
301 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
302 return FALSE;
303}
304
305
Note: See TracBrowser for help on using the repository browser.