blob: 306098b4fabff9eec21bef1b1267dc8746f148c4 [file] [log] [blame]
Patrik Stridvall091e7851998-10-11 17:04:17 +00001/*
2 * IMAGEHLP library
3 *
4 * Copyright 1998 Patrik Stridvall
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Patrik Stridvall091e7851998-10-11 17:04:17 +000019 */
20
James Juranf4d5fef2001-01-26 20:43:40 +000021#include <string.h>
Patrik Stridvall091e7851998-10-11 17:04:17 +000022#include "winbase.h"
23#include "winnt.h"
24#include "winerror.h"
Jim Aston2e1cafa1999-03-14 16:35:05 +000025#include "windef.h"
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000026#include "wine/debug.h"
Patrik Stridvall091e7851998-10-11 17:04:17 +000027#include "imagehlp.h"
28
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000029WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000030
Patrik Stridvall091e7851998-10-11 17:04:17 +000031/***********************************************************************
32 * Data
33 */
34
Alexandre Julliarda3960291999-02-26 11:11:13 +000035static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
36static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +000037
Alexandre Julliarda3960291999-02-26 11:11:13 +000038static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
Patrik Stridvall091e7851998-10-11 17:04:17 +000039 NULL, /* ModuleName */
Alexandre Julliard613ead72002-10-04 00:27:10 +000040 0, /* hFile */
Patrik Stridvall091e7851998-10-11 17:04:17 +000041 NULL, /* MappedAddress */
42 NULL, /* FileHeader */
43 NULL, /* LastRvaSection */
44 0, /* NumberOfSections */
45 NULL, /* Sections */
46 1, /* Characteristics */
47 FALSE, /* fSystemImage */
48 FALSE, /* fDOSImage */
Alexandre Julliarda3960291999-02-26 11:11:13 +000049 { &IMAGEHLP_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
Patrik Stridvall091e7851998-10-11 17:04:17 +000050 148, /* SizeOfImage; */
51};
52
Alexandre Julliard0643acd2003-06-27 22:24:23 +000053extern HANDLE IMAGEHLP_hHeap;
54
Patrik Stridvall091e7851998-10-11 17:04:17 +000055/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000056 * EnumerateLoadedModules (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +000057 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000058BOOL WINAPI EnumerateLoadedModules(
59 HANDLE hProcess,
60 PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
Patrik Stridvall091e7851998-10-11 17:04:17 +000061 PVOID UserContext)
62{
Michael Stefaniuc9a7bc342002-10-22 00:45:27 +000063 FIXME("(%p, %p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000064 hProcess, EnumLoadedModulesCallback, UserContext
65 );
66 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
67 return FALSE;
68}
69
70/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000071 * GetTimestampForLoadedLibrary (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +000072 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000073DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
Patrik Stridvall091e7851998-10-11 17:04:17 +000074{
Michael Stefaniuc9a7bc342002-10-22 00:45:27 +000075 FIXME("(%p): stub\n", Module);
Patrik Stridvall091e7851998-10-11 17:04:17 +000076 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
77 return 0;
78}
79
80/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000081 * GetImageConfigInformation (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +000082 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000083BOOL WINAPI GetImageConfigInformation(
84 PLOADED_IMAGE LoadedImage,
85 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Patrik Stridvall091e7851998-10-11 17:04:17 +000086{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000087 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000088 LoadedImage, ImageConfigInformation
89 );
90 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
91 return FALSE;
92}
93
94/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +000095 * GetImageUnusedHeaderBytes (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +000096 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000097DWORD WINAPI GetImageUnusedHeaderBytes(
98 PLOADED_IMAGE LoadedImage,
Patrik Stridvall091e7851998-10-11 17:04:17 +000099 LPDWORD SizeUnusedHeaderBytes)
100{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000101 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000102 LoadedImage, SizeUnusedHeaderBytes
103 );
104 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
105 return 0;
106}
107
108/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000109 * ImageDirectoryEntryToData (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000110 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000111PVOID WINAPI ImageDirectoryEntryToData(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000112 PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
113{
Patrik Stridvallb9050232000-05-11 21:48:28 +0000114 FIXME("(%p, %d, %hd, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000115 Base, MappedAsImage, DirectoryEntry, Size
116 );
117 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
118 return NULL;
119}
120
121/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000122 * ImageLoad (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000123 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000124PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000125{
Vincent BĂ©ron9a624912002-05-31 23:06:46 +0000126 PLOADED_IMAGE pLoadedImage =
Alexandre Julliarda3960291999-02-26 11:11:13 +0000127 HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
Patrik Stridvall091e7851998-10-11 17:04:17 +0000128 return pLoadedImage;
129}
130
131/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000132 * ImageNtHeader (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000133 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000134PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000135{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000136 return (PIMAGE_NT_HEADERS)
137 ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000138}
139
140/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000141 * ImageRvaToSection (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000142 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000143PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
144 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000145{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000146 FIXME("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000147 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
148 return NULL;
149}
150
151/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000152 * ImageRvaToVa (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000153 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000154PVOID WINAPI ImageRvaToVa(
155 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
156 PIMAGE_SECTION_HEADER *LastRvaSection)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000157{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000158 FIXME("(%p, %p, %ld, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000159 NtHeaders, Base, Rva, LastRvaSection
160 );
161 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
162 return NULL;
163}
164
165/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000166 * ImageUnload (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000167 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000168BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000169{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000170 LIST_ENTRY *pCurrent, *pFind;
171 if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000172 {
173 /* No image loaded or null pointer */
174 SetLastError(ERROR_INVALID_PARAMETER);
175 return FALSE;
176 }
177
178 pFind=&pLoadedImage->Links;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000179 pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
Vincent BĂ©ron9a624912002-05-31 23:06:46 +0000180 while((pCurrent != pFind) &&
181 (pCurrent != NULL))
Patrik Stridvall091e7851998-10-11 17:04:17 +0000182 pCurrent = pCurrent->Flink;
183 if(!pCurrent)
184 {
185 /* Not found */
186 SetLastError(ERROR_INVALID_PARAMETER);
187 return FALSE;
188 }
189
190 if(pCurrent->Blink)
191 pCurrent->Blink->Flink = pCurrent->Flink;
192 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000193 IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
194 pCurrent->Flink, LOADED_IMAGE, Links):NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000195
196 if(pCurrent->Flink)
197 pCurrent->Flink->Blink = pCurrent->Blink;
198 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000199 IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
200 pCurrent->Blink, LOADED_IMAGE, Links):NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000201
202 return FALSE;
203}
204
205/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000206 * MapAndLoad (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000207 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000208BOOL WINAPI MapAndLoad(
209 LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
210 BOOL bDotDll, BOOL bReadOnly)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000211{
212 CHAR szFileName[MAX_PATH];
Francois Gouget9b0b1e02003-01-14 23:43:41 +0000213 HANDLE hFile = NULL;
214 HANDLE hFileMapping = NULL;
215 HMODULE hModule = NULL;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000216 PIMAGE_NT_HEADERS pNtHeader = NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000217
218 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
219 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
220
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000221 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000222 if(!(hFile = CreateFileA(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000223 szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
Francois Gouget9b0b1e02003-01-14 23:43:41 +0000224 NULL, OPEN_EXISTING, 0, NULL)))
Patrik Stridvall091e7851998-10-11 17:04:17 +0000225 {
226 SetLastError(ERROR_FILE_NOT_FOUND);
227 goto Error;
228 }
229
Alexandre Julliarda3960291999-02-26 11:11:13 +0000230 if(!(hFileMapping = CreateFileMappingA(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000231 hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
232 {
233 DWORD dwLastError = GetLastError();
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000234 WARN("CreateFileMapping: Error = %ld\n", dwLastError);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000235 SetLastError(dwLastError);
236 goto Error;
237 }
238 CloseHandle(hFile);
Francois Gouget9b0b1e02003-01-14 23:43:41 +0000239 hFile = NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000240
Alexandre Julliarda3960291999-02-26 11:11:13 +0000241 if(!(hModule = (HMODULE) MapViewOfFile(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000242 hFileMapping, FILE_MAP_READ, 0, 0, 0)))
243 {
244 DWORD dwLastError = GetLastError();
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000245 WARN("MapViewOfFile: Error = %ld\n", dwLastError);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000246 SetLastError(dwLastError);
247 goto Error;
248 }
249
250 CloseHandle(hFileMapping);
Francois Gouget9b0b1e02003-01-14 23:43:41 +0000251 hFileMapping=NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000252
Alexandre Julliarda3960291999-02-26 11:11:13 +0000253 pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
254 IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000255 );
256
Alexandre Julliarda3960291999-02-26 11:11:13 +0000257 pNtHeader = ImageNtHeader((PVOID) hModule);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000258
Alexandre Julliard8c540c62000-11-13 04:16:05 +0000259 pLoadedImage->ModuleName = HeapAlloc(IMAGEHLP_hHeap, 0, strlen(pszDllPath)+1); /* FIXME: Correct? */
260 strcpy( pLoadedImage->ModuleName, pszDllPath );
Patrik Stridvall091e7851998-10-11 17:04:17 +0000261 pLoadedImage->hFile = hFile;
262 pLoadedImage->MappedAddress = (PUCHAR) hModule;
263 pLoadedImage->FileHeader = pNtHeader;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000264 pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000265 ((LPBYTE) &pNtHeader->OptionalHeader +
266 pNtHeader->FileHeader.SizeOfOptionalHeader);
267 pLoadedImage->NumberOfSections =
268 pNtHeader->FileHeader.NumberOfSections;
269 pLoadedImage->SizeOfImage =
270 pNtHeader->OptionalHeader.SizeOfImage;
271 pLoadedImage->Characteristics =
272 pNtHeader->FileHeader.Characteristics;
273 pLoadedImage->LastRvaSection = pLoadedImage->Sections;
274
275 pLoadedImage->fSystemImage = FALSE; /* FIXME */
276 pLoadedImage->fDOSImage = FALSE; /* FIXME */
277
278 /* FIXME: Make thread safe */
279 pLoadedImage->Links.Flink = NULL;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000280 pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
281 if(IMAGEHLP_pLastLoadedImage)
282 IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
283 IMAGEHLP_pLastLoadedImage = pLoadedImage;
284 if(!IMAGEHLP_pFirstLoadedImage)
285 IMAGEHLP_pFirstLoadedImage = pLoadedImage;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000286
287 return TRUE;
288
289Error:
290 if(hModule)
291 UnmapViewOfFile((PVOID) hModule);
292 if(hFileMapping)
293 CloseHandle(hFileMapping);
294 if(hFile)
295 CloseHandle(hFile);
296 return FALSE;
297}
298
299/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000300 * SetImageConfigInformation (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000301 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000302BOOL WINAPI SetImageConfigInformation(
303 PLOADED_IMAGE LoadedImage,
304 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000305{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000306 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000307 LoadedImage, ImageConfigInformation
308 );
309 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
310 return FALSE;
311}
312
313/***********************************************************************
Patrik Stridvall2d6457c2000-03-28 20:22:59 +0000314 * UnMapAndLoad (IMAGEHLP.@)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000315 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000316BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000317{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000318 FIXME("(%p): stub\n", LoadedImage);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000319 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
320 return FALSE;
321}