blob: bcf52e3d7cacadc26c7ba7e3f5a168377d366b84 [file] [log] [blame]
Patrik Stridvall091e7851998-10-11 17:04:17 +00001/*
2 * IMAGEHLP library
3 *
4 * Copyright 1998 Patrik Stridvall
5 */
6
Patrik Stridvall091e7851998-10-11 17:04:17 +00007#include "winbase.h"
8#include "winnt.h"
9#include "winerror.h"
Jim Aston2e1cafa1999-03-14 16:35:05 +000010#include "windef.h"
Patrik Stridvall091e7851998-10-11 17:04:17 +000011#include "heap.h"
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000012#include "debugtools.h"
Patrik Stridvall091e7851998-10-11 17:04:17 +000013#include "imagehlp.h"
14
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000015DEFAULT_DEBUG_CHANNEL(imagehlp)
16
Patrik Stridvall091e7851998-10-11 17:04:17 +000017/***********************************************************************
18 * Data
19 */
20
Alexandre Julliarda3960291999-02-26 11:11:13 +000021static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
22static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +000023
Alexandre Julliarda3960291999-02-26 11:11:13 +000024static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
Patrik Stridvall091e7851998-10-11 17:04:17 +000025 NULL, /* ModuleName */
26 0xffffffff, /* hFile */
27 NULL, /* MappedAddress */
28 NULL, /* FileHeader */
29 NULL, /* LastRvaSection */
30 0, /* NumberOfSections */
31 NULL, /* Sections */
32 1, /* Characteristics */
33 FALSE, /* fSystemImage */
34 FALSE, /* fDOSImage */
Alexandre Julliarda3960291999-02-26 11:11:13 +000035 { &IMAGEHLP_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
Patrik Stridvall091e7851998-10-11 17:04:17 +000036 148, /* SizeOfImage; */
37};
38
39/***********************************************************************
40 * EnumerateLoadedModules32 (IMAGEHLP.4)
41 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000042BOOL WINAPI EnumerateLoadedModules(
43 HANDLE hProcess,
44 PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
Patrik Stridvall091e7851998-10-11 17:04:17 +000045 PVOID UserContext)
46{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000047 FIXME("(0x%08x, %p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000048 hProcess, EnumLoadedModulesCallback, UserContext
49 );
50 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
51 return FALSE;
52}
53
54/***********************************************************************
55 * GetTimestampForLoadedLibrary32 (IMAGEHLP.9)
56 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000057DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
Patrik Stridvall091e7851998-10-11 17:04:17 +000058{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000059 FIXME("(0x%08x): stub\n", Module);
Patrik Stridvall091e7851998-10-11 17:04:17 +000060 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
61 return 0;
62}
63
64/***********************************************************************
65 * GetImageConfigInformation32 (IMAGEHLP.7)
66 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000067BOOL WINAPI GetImageConfigInformation(
68 PLOADED_IMAGE LoadedImage,
69 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Patrik Stridvall091e7851998-10-11 17:04:17 +000070{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000071 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000072 LoadedImage, ImageConfigInformation
73 );
74 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
75 return FALSE;
76}
77
78/***********************************************************************
79 * GetImageUnusedHeaderBytes32 (IMAGEHLP.8)
80 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000081DWORD WINAPI GetImageUnusedHeaderBytes(
82 PLOADED_IMAGE LoadedImage,
Patrik Stridvall091e7851998-10-11 17:04:17 +000083 LPDWORD SizeUnusedHeaderBytes)
84{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000085 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000086 LoadedImage, SizeUnusedHeaderBytes
87 );
88 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
89 return 0;
90}
91
92/***********************************************************************
93 * ImageDirectoryEntryToData32 (IMAGEHLP.11)
94 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000095PVOID WINAPI ImageDirectoryEntryToData(
Patrik Stridvall091e7851998-10-11 17:04:17 +000096 PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
97{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000098 FIXME("(%p, %d, %d, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +000099 Base, MappedAsImage, DirectoryEntry, Size
100 );
101 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
102 return NULL;
103}
104
105/***********************************************************************
106 * ImageLoad32 (IMAGEHLP.16)
107 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000108PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000109{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000110 PLOADED_IMAGE pLoadedImage =
111 HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
Patrik Stridvall091e7851998-10-11 17:04:17 +0000112 return pLoadedImage;
113}
114
115/***********************************************************************
116 * ImageNtHeader32 (IMAGEHLP.17)
117 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000118PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000119{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000120 return (PIMAGE_NT_HEADERS)
121 ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000122}
123
124/***********************************************************************
125 * ImageRvaToSection32 (IMAGEHLP.19)
126 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000127PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
128 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000129{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000130 FIXME("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000131 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
132 return NULL;
133}
134
135/***********************************************************************
136 * ImageRvaToVa32 (IMAGEHLP.20)
137 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000138PVOID WINAPI ImageRvaToVa(
139 PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
140 PIMAGE_SECTION_HEADER *LastRvaSection)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000141{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000142 FIXME("(%p, %p, %ld, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000143 NtHeaders, Base, Rva, LastRvaSection
144 );
145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
146 return NULL;
147}
148
149/***********************************************************************
150 * ImageUnload32 (IMAGEHLP.21)
151 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000152BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000153{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000154 LIST_ENTRY *pCurrent, *pFind;
155 if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000156 {
157 /* No image loaded or null pointer */
158 SetLastError(ERROR_INVALID_PARAMETER);
159 return FALSE;
160 }
161
162 pFind=&pLoadedImage->Links;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000163 pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000164 while((pCurrent != pFind) &&
165 (pCurrent != NULL))
166 pCurrent = pCurrent->Flink;
167 if(!pCurrent)
168 {
169 /* Not found */
170 SetLastError(ERROR_INVALID_PARAMETER);
171 return FALSE;
172 }
173
174 if(pCurrent->Blink)
175 pCurrent->Blink->Flink = pCurrent->Flink;
176 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000177 IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
178 pCurrent->Flink, LOADED_IMAGE, Links):NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000179
180 if(pCurrent->Flink)
181 pCurrent->Flink->Blink = pCurrent->Blink;
182 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000183 IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
184 pCurrent->Blink, LOADED_IMAGE, Links):NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000185
186 return FALSE;
187}
188
189/***********************************************************************
190 * MapAndLoad32 (IMAGEHLP.25)
191 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000192BOOL WINAPI MapAndLoad(
193 LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
194 BOOL bDotDll, BOOL bReadOnly)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000195{
196 CHAR szFileName[MAX_PATH];
Alexandre Julliarda3960291999-02-26 11:11:13 +0000197 HANDLE hFile = (HANDLE) NULL;
198 HANDLE hFileMapping = (HANDLE) NULL;
199 HMODULE hModule = (HMODULE) NULL;
200 PIMAGE_NT_HEADERS pNtHeader = NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000201
202 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
203 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
204
205 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage32) */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000206 if(!(hFile = CreateFileA(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000207 szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000208 NULL, OPEN_EXISTING, 0, (HANDLE) NULL)))
Patrik Stridvall091e7851998-10-11 17:04:17 +0000209 {
210 SetLastError(ERROR_FILE_NOT_FOUND);
211 goto Error;
212 }
213
Alexandre Julliarda3960291999-02-26 11:11:13 +0000214 if(!(hFileMapping = CreateFileMappingA(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000215 hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
216 {
217 DWORD dwLastError = GetLastError();
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000218 WARN("CreateFileMapping: Error = %ld\n", dwLastError);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000219 SetLastError(dwLastError);
220 goto Error;
221 }
222 CloseHandle(hFile);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000223 hFile = (HANDLE) NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000224
Alexandre Julliarda3960291999-02-26 11:11:13 +0000225 if(!(hModule = (HMODULE) MapViewOfFile(
Patrik Stridvall091e7851998-10-11 17:04:17 +0000226 hFileMapping, FILE_MAP_READ, 0, 0, 0)))
227 {
228 DWORD dwLastError = GetLastError();
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000229 WARN("MapViewOfFile: Error = %ld\n", dwLastError);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000230 SetLastError(dwLastError);
231 goto Error;
232 }
233
234 CloseHandle(hFileMapping);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000235 hFileMapping=(HANDLE) NULL;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000236
Alexandre Julliarda3960291999-02-26 11:11:13 +0000237 pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
238 IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000239 );
240
Alexandre Julliarda3960291999-02-26 11:11:13 +0000241 pNtHeader = ImageNtHeader((PVOID) hModule);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000242
243 pLoadedImage->ModuleName =
Alexandre Julliarda3960291999-02-26 11:11:13 +0000244 HEAP_strdupA(IMAGEHLP_hHeap, 0, pszDllPath); /* FIXME: Correct? */
Patrik Stridvall091e7851998-10-11 17:04:17 +0000245 pLoadedImage->hFile = hFile;
246 pLoadedImage->MappedAddress = (PUCHAR) hModule;
247 pLoadedImage->FileHeader = pNtHeader;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000248 pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000249 ((LPBYTE) &pNtHeader->OptionalHeader +
250 pNtHeader->FileHeader.SizeOfOptionalHeader);
251 pLoadedImage->NumberOfSections =
252 pNtHeader->FileHeader.NumberOfSections;
253 pLoadedImage->SizeOfImage =
254 pNtHeader->OptionalHeader.SizeOfImage;
255 pLoadedImage->Characteristics =
256 pNtHeader->FileHeader.Characteristics;
257 pLoadedImage->LastRvaSection = pLoadedImage->Sections;
258
259 pLoadedImage->fSystemImage = FALSE; /* FIXME */
260 pLoadedImage->fDOSImage = FALSE; /* FIXME */
261
262 /* FIXME: Make thread safe */
263 pLoadedImage->Links.Flink = NULL;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000264 pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
265 if(IMAGEHLP_pLastLoadedImage)
266 IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
267 IMAGEHLP_pLastLoadedImage = pLoadedImage;
268 if(!IMAGEHLP_pFirstLoadedImage)
269 IMAGEHLP_pFirstLoadedImage = pLoadedImage;
Patrik Stridvall091e7851998-10-11 17:04:17 +0000270
271 return TRUE;
272
273Error:
274 if(hModule)
275 UnmapViewOfFile((PVOID) hModule);
276 if(hFileMapping)
277 CloseHandle(hFileMapping);
278 if(hFile)
279 CloseHandle(hFile);
280 return FALSE;
281}
282
283/***********************************************************************
284 * SetImageConfigInformation32 (IMAGEHLP.34)
285 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000286BOOL WINAPI SetImageConfigInformation(
287 PLOADED_IMAGE LoadedImage,
288 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000289{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000290 FIXME("(%p, %p): stub\n",
Patrik Stridvall091e7851998-10-11 17:04:17 +0000291 LoadedImage, ImageConfigInformation
292 );
293 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
294 return FALSE;
295}
296
297/***********************************************************************
298 * UnMapAndLoad32 (IMAGEHLP.58)
299 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000300BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
Patrik Stridvall091e7851998-10-11 17:04:17 +0000301{
Alexandre Julliard9fe7a251999-05-14 08:17:14 +0000302 FIXME("(%p): stub\n", LoadedImage);
Patrik Stridvall091e7851998-10-11 17:04:17 +0000303 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
304 return FALSE;
305}
306
307