4 * Copyright 1998 Patrik Stridvall
16 /***********************************************************************
20 static PLOADED_IMAGE32 IMAGEHLP_pFirstLoadedImage32=NULL;
21 static PLOADED_IMAGE32 IMAGEHLP_pLastLoadedImage32=NULL;
23 static LOADED_IMAGE32 IMAGEHLP_EmptyLoadedImage32 = {
24 NULL, /* ModuleName */
25 0xffffffff, /* hFile */
26 NULL, /* MappedAddress */
27 NULL, /* FileHeader */
28 NULL, /* LastRvaSection */
29 0, /* NumberOfSections */
31 1, /* Characteristics */
32 FALSE, /* fSystemImage */
33 FALSE, /* fDOSImage */
34 { &IMAGEHLP_EmptyLoadedImage32.Links, &IMAGEHLP_EmptyLoadedImage32.Links }, /* Links */
35 148, /* SizeOfImage; */
38 /***********************************************************************
39 * EnumerateLoadedModules32 (IMAGEHLP.4)
41 BOOL32 WINAPI EnumerateLoadedModules32(
43 PENUMLOADED_MODULES_CALLBACK32 EnumLoadedModulesCallback,
46 FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
47 hProcess, EnumLoadedModulesCallback, UserContext
49 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
53 /***********************************************************************
54 * GetTimestampForLoadedLibrary32 (IMAGEHLP.9)
56 DWORD WINAPI GetTimestampForLoadedLibrary32(HMODULE32 Module)
58 FIXME(imagehlp, "(0x%08x): stub\n", Module);
59 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
63 /***********************************************************************
64 * GetImageConfigInformation32 (IMAGEHLP.7)
66 BOOL32 WINAPI GetImageConfigInformation32(
67 PLOADED_IMAGE32 LoadedImage,
68 PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
70 FIXME(imagehlp, "(%p, %p): stub\n",
71 LoadedImage, ImageConfigInformation
73 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
77 /***********************************************************************
78 * GetImageUnusedHeaderBytes32 (IMAGEHLP.8)
80 DWORD WINAPI GetImageUnusedHeaderBytes32(
81 PLOADED_IMAGE32 LoadedImage,
82 LPDWORD SizeUnusedHeaderBytes)
84 FIXME(imagehlp, "(%p, %p): stub\n",
85 LoadedImage, SizeUnusedHeaderBytes
87 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
91 /***********************************************************************
92 * ImageDirectoryEntryToData32 (IMAGEHLP.11)
94 PVOID WINAPI ImageDirectoryEntryToData32(
95 PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
97 FIXME(imagehlp, "(%p, %d, %d, %p): stub\n",
98 Base, MappedAsImage, DirectoryEntry, Size
100 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
104 /***********************************************************************
105 * ImageLoad32 (IMAGEHLP.16)
107 PLOADED_IMAGE32 WINAPI ImageLoad32(LPSTR DllName, LPSTR DllPath)
109 PLOADED_IMAGE32 pLoadedImage =
110 HeapAlloc(IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32));
114 /***********************************************************************
115 * ImageNtHeader32 (IMAGEHLP.17)
117 PIMAGE_NT_HEADERS32 WINAPI ImageNtHeader32(PVOID Base)
119 return (PIMAGE_NT_HEADERS32)
120 ((LPBYTE) Base + ((PIMAGE_DOS_HEADER32) Base)->e_lfanew);
123 /***********************************************************************
124 * ImageRvaToSection32 (IMAGEHLP.19)
126 PIMAGE_SECTION_HEADER32 WINAPI ImageRvaToSection32(
127 PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva)
129 FIXME(imagehlp, "(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
130 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
134 /***********************************************************************
135 * ImageRvaToVa32 (IMAGEHLP.20)
137 PVOID WINAPI ImageRvaToVa32(
138 PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva,
139 PIMAGE_SECTION_HEADER32 *LastRvaSection)
141 FIXME(imagehlp, "(%p, %p, %ld, %p): stub\n",
142 NtHeaders, Base, Rva, LastRvaSection
144 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
148 /***********************************************************************
149 * ImageUnload32 (IMAGEHLP.21)
151 BOOL32 WINAPI ImageUnload32(PLOADED_IMAGE32 pLoadedImage)
153 LIST_ENTRY32 *pCurrent, *pFind;
154 if(!IMAGEHLP_pFirstLoadedImage32 || !pLoadedImage)
156 /* No image loaded or null pointer */
157 SetLastError(ERROR_INVALID_PARAMETER);
161 pFind=&pLoadedImage->Links;
162 pCurrent=&IMAGEHLP_pFirstLoadedImage32->Links;
163 while((pCurrent != pFind) &&
165 pCurrent = pCurrent->Flink;
169 SetLastError(ERROR_INVALID_PARAMETER);
174 pCurrent->Blink->Flink = pCurrent->Flink;
176 IMAGEHLP_pFirstLoadedImage32 = pCurrent->Flink?CONTAINING_RECORD(
177 pCurrent->Flink, LOADED_IMAGE32, Links):NULL;
180 pCurrent->Flink->Blink = pCurrent->Blink;
182 IMAGEHLP_pLastLoadedImage32 = pCurrent->Blink?CONTAINING_RECORD(
183 pCurrent->Blink, LOADED_IMAGE32, Links):NULL;
188 /***********************************************************************
189 * MapAndLoad32 (IMAGEHLP.25)
191 BOOL32 WINAPI MapAndLoad32(
192 LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE32 pLoadedImage,
193 BOOL32 bDotDll, BOOL32 bReadOnly)
195 CHAR szFileName[MAX_PATH];
196 HANDLE32 hFile = (HANDLE32) NULL;
197 HANDLE32 hFileMapping = (HANDLE32) NULL;
198 HMODULE32 hModule = (HMODULE32) NULL;
199 PIMAGE_NT_HEADERS32 pNtHeader = NULL;
201 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
202 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
204 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage32) */
205 if(!(hFile = CreateFile32A(
206 szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
207 NULL, OPEN_EXISTING, 0, (HANDLE32) NULL)))
209 SetLastError(ERROR_FILE_NOT_FOUND);
213 if(!(hFileMapping = CreateFileMapping32A(
214 hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
216 DWORD dwLastError = GetLastError();
217 WARN(imagehlp, "CreateFileMapping: Error = %ld\n", dwLastError);
218 SetLastError(dwLastError);
222 hFile = (HANDLE32) NULL;
224 if(!(hModule = (HMODULE32) MapViewOfFile(
225 hFileMapping, FILE_MAP_READ, 0, 0, 0)))
227 DWORD dwLastError = GetLastError();
228 WARN(imagehlp, "MapViewOfFile: Error = %ld\n", dwLastError);
229 SetLastError(dwLastError);
233 CloseHandle(hFileMapping);
234 hFileMapping=(HANDLE32) NULL;
236 pLoadedImage = (PLOADED_IMAGE32) HeapAlloc(
237 IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32)
240 pNtHeader = ImageNtHeader32((PVOID) hModule);
242 pLoadedImage->ModuleName =
243 HEAP_strdupA(IMAGEHLP_hHeap32, 0, pszDllPath); /* FIXME: Correct? */
244 pLoadedImage->hFile = hFile;
245 pLoadedImage->MappedAddress = (PUCHAR) hModule;
246 pLoadedImage->FileHeader = pNtHeader;
247 pLoadedImage->Sections = (PIMAGE_SECTION_HEADER32)
248 ((LPBYTE) &pNtHeader->OptionalHeader +
249 pNtHeader->FileHeader.SizeOfOptionalHeader);
250 pLoadedImage->NumberOfSections =
251 pNtHeader->FileHeader.NumberOfSections;
252 pLoadedImage->SizeOfImage =
253 pNtHeader->OptionalHeader.SizeOfImage;
254 pLoadedImage->Characteristics =
255 pNtHeader->FileHeader.Characteristics;
256 pLoadedImage->LastRvaSection = pLoadedImage->Sections;
258 pLoadedImage->fSystemImage = FALSE; /* FIXME */
259 pLoadedImage->fDOSImage = FALSE; /* FIXME */
261 /* FIXME: Make thread safe */
262 pLoadedImage->Links.Flink = NULL;
263 pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage32->Links;
264 if(IMAGEHLP_pLastLoadedImage32)
265 IMAGEHLP_pLastLoadedImage32->Links.Flink = &pLoadedImage->Links;
266 IMAGEHLP_pLastLoadedImage32 = pLoadedImage;
267 if(!IMAGEHLP_pFirstLoadedImage32)
268 IMAGEHLP_pFirstLoadedImage32 = pLoadedImage;
274 UnmapViewOfFile((PVOID) hModule);
276 CloseHandle(hFileMapping);
282 /***********************************************************************
283 * SetImageConfigInformation32 (IMAGEHLP.34)
285 BOOL32 WINAPI SetImageConfigInformation32(
286 PLOADED_IMAGE32 LoadedImage,
287 PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
289 FIXME(imagehlp, "(%p, %p): stub\n",
290 LoadedImage, ImageConfigInformation
292 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
296 /***********************************************************************
297 * UnMapAndLoad32 (IMAGEHLP.58)
299 BOOL32 WINAPI UnMapAndLoad32(PLOADED_IMAGE32 LoadedImage)
301 FIXME(imagehlp, "(%p): stub\n", LoadedImage);
302 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);