4 * Copyright 1998 Patrik Stridvall
15 /***********************************************************************
19 static PLOADED_IMAGE32 IMAGEHLP_pFirstLoadedImage32=NULL;
20 static PLOADED_IMAGE32 IMAGEHLP_pLastLoadedImage32=NULL;
22 static LOADED_IMAGE32 IMAGEHLP_EmptyLoadedImage32 = {
23 NULL, /* ModuleName */
24 0xffffffff, /* hFile */
25 NULL, /* MappedAddress */
26 NULL, /* FileHeader */
27 NULL, /* LastRvaSection */
28 0, /* NumberOfSections */
30 1, /* Characteristics */
31 FALSE, /* fSystemImage */
32 FALSE, /* fDOSImage */
33 { &IMAGEHLP_EmptyLoadedImage32.Links, &IMAGEHLP_EmptyLoadedImage32.Links }, /* Links */
34 148, /* SizeOfImage; */
37 /***********************************************************************
38 * EnumerateLoadedModules32 (IMAGEHLP.4)
40 BOOL32 WINAPI EnumerateLoadedModules32(
42 PENUMLOADED_MODULES_CALLBACK32 EnumLoadedModulesCallback,
45 FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
46 hProcess, EnumLoadedModulesCallback, UserContext
48 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
52 /***********************************************************************
53 * GetTimestampForLoadedLibrary32 (IMAGEHLP.9)
55 DWORD WINAPI GetTimestampForLoadedLibrary32(HMODULE32 Module)
57 FIXME(imagehlp, "(0x%08x): stub\n", Module);
58 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
62 /***********************************************************************
63 * GetImageConfigInformation32 (IMAGEHLP.7)
65 BOOL32 WINAPI GetImageConfigInformation32(
66 PLOADED_IMAGE32 LoadedImage,
67 PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
69 FIXME(imagehlp, "(%p, %p): stub\n",
70 LoadedImage, ImageConfigInformation
72 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
76 /***********************************************************************
77 * GetImageUnusedHeaderBytes32 (IMAGEHLP.8)
79 DWORD WINAPI GetImageUnusedHeaderBytes32(
80 PLOADED_IMAGE32 LoadedImage,
81 LPDWORD SizeUnusedHeaderBytes)
83 FIXME(imagehlp, "(%p, %p): stub\n",
84 LoadedImage, SizeUnusedHeaderBytes
86 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
90 /***********************************************************************
91 * ImageDirectoryEntryToData32 (IMAGEHLP.11)
93 PVOID WINAPI ImageDirectoryEntryToData32(
94 PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
96 FIXME(imagehlp, "(%p, %d, %d, %p): stub\n",
97 Base, MappedAsImage, DirectoryEntry, Size
99 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
103 /***********************************************************************
104 * ImageLoad32 (IMAGEHLP.16)
106 PLOADED_IMAGE32 WINAPI ImageLoad32(LPSTR DllName, LPSTR DllPath)
108 PLOADED_IMAGE32 pLoadedImage =
109 HeapAlloc(IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32));
113 /***********************************************************************
114 * ImageNtHeader32 (IMAGEHLP.17)
116 PIMAGE_NT_HEADERS32 WINAPI ImageNtHeader32(PVOID Base)
118 return (PIMAGE_NT_HEADERS32)
119 ((LPBYTE) Base + ((PIMAGE_DOS_HEADER32) Base)->e_lfanew);
122 /***********************************************************************
123 * ImageRvaToSection32 (IMAGEHLP.19)
125 PIMAGE_SECTION_HEADER32 WINAPI ImageRvaToSection32(
126 PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva)
128 FIXME(imagehlp, "(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
129 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
133 /***********************************************************************
134 * ImageRvaToVa32 (IMAGEHLP.20)
136 PVOID WINAPI ImageRvaToVa32(
137 PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva,
138 PIMAGE_SECTION_HEADER32 *LastRvaSection)
140 FIXME(imagehlp, "(%p, %p, %ld, %p): stub\n",
141 NtHeaders, Base, Rva, LastRvaSection
143 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
147 /***********************************************************************
148 * ImageUnload32 (IMAGEHLP.21)
150 BOOL32 WINAPI ImageUnload32(PLOADED_IMAGE32 pLoadedImage)
152 LIST_ENTRY32 *pCurrent, *pFind;
153 if(!IMAGEHLP_pFirstLoadedImage32 || !pLoadedImage)
155 /* No image loaded or null pointer */
156 SetLastError(ERROR_INVALID_PARAMETER);
160 pFind=&pLoadedImage->Links;
161 pCurrent=&IMAGEHLP_pFirstLoadedImage32->Links;
162 while((pCurrent != pFind) &&
164 pCurrent = pCurrent->Flink;
168 SetLastError(ERROR_INVALID_PARAMETER);
173 pCurrent->Blink->Flink = pCurrent->Flink;
175 IMAGEHLP_pFirstLoadedImage32 = pCurrent->Flink?CONTAINING_RECORD(
176 pCurrent->Flink, LOADED_IMAGE32, Links):NULL;
179 pCurrent->Flink->Blink = pCurrent->Blink;
181 IMAGEHLP_pLastLoadedImage32 = pCurrent->Blink?CONTAINING_RECORD(
182 pCurrent->Blink, LOADED_IMAGE32, Links):NULL;
187 /***********************************************************************
188 * MapAndLoad32 (IMAGEHLP.25)
190 BOOL32 WINAPI MapAndLoad32(
191 LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE32 pLoadedImage,
192 BOOL32 bDotDll, BOOL32 bReadOnly)
194 CHAR szFileName[MAX_PATH];
195 HANDLE32 hFile = (HANDLE32) NULL;
196 HANDLE32 hFileMapping = (HANDLE32) NULL;
197 HMODULE32 hModule = (HMODULE32) NULL;
198 PIMAGE_NT_HEADERS32 pNtHeader = NULL;
200 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
201 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
203 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage32) */
204 if(!(hFile = CreateFile32A(
205 szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
206 NULL, OPEN_EXISTING, 0, (HANDLE32) NULL)))
208 SetLastError(ERROR_FILE_NOT_FOUND);
212 if(!(hFileMapping = CreateFileMapping32A(
213 hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
215 DWORD dwLastError = GetLastError();
216 WARN(imagehlp, "CreateFileMapping: Error = %ld\n", dwLastError);
217 SetLastError(dwLastError);
221 hFile = (HANDLE32) NULL;
223 if(!(hModule = (HMODULE32) MapViewOfFile(
224 hFileMapping, FILE_MAP_READ, 0, 0, 0)))
226 DWORD dwLastError = GetLastError();
227 WARN(imagehlp, "MapViewOfFile: Error = %ld\n", dwLastError);
228 SetLastError(dwLastError);
232 CloseHandle(hFileMapping);
233 hFileMapping=(HANDLE32) NULL;
235 pLoadedImage = (PLOADED_IMAGE32) HeapAlloc(
236 IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32)
239 pNtHeader = ImageNtHeader32((PVOID) hModule);
241 pLoadedImage->ModuleName =
242 HEAP_strdupA(IMAGEHLP_hHeap32, 0, pszDllPath); /* FIXME: Correct? */
243 pLoadedImage->hFile = hFile;
244 pLoadedImage->MappedAddress = (PUCHAR) hModule;
245 pLoadedImage->FileHeader = pNtHeader;
246 pLoadedImage->Sections = (PIMAGE_SECTION_HEADER32)
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;
257 pLoadedImage->fSystemImage = FALSE; /* FIXME */
258 pLoadedImage->fDOSImage = FALSE; /* FIXME */
260 /* FIXME: Make thread safe */
261 pLoadedImage->Links.Flink = NULL;
262 pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage32->Links;
263 if(IMAGEHLP_pLastLoadedImage32)
264 IMAGEHLP_pLastLoadedImage32->Links.Flink = &pLoadedImage->Links;
265 IMAGEHLP_pLastLoadedImage32 = pLoadedImage;
266 if(!IMAGEHLP_pFirstLoadedImage32)
267 IMAGEHLP_pFirstLoadedImage32 = pLoadedImage;
273 UnmapViewOfFile((PVOID) hModule);
275 CloseHandle(hFileMapping);
281 /***********************************************************************
282 * SetImageConfigInformation32 (IMAGEHLP.34)
284 BOOL32 WINAPI SetImageConfigInformation32(
285 PLOADED_IMAGE32 LoadedImage,
286 PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
288 FIXME(imagehlp, "(%p, %p): stub\n",
289 LoadedImage, ImageConfigInformation
291 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
295 /***********************************************************************
296 * UnMapAndLoad32 (IMAGEHLP.58)
298 BOOL32 WINAPI UnMapAndLoad32(PLOADED_IMAGE32 LoadedImage)
300 FIXME(imagehlp, "(%p): stub\n", LoadedImage);
301 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);