4 * Copyright 1998 Patrik Stridvall
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.
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.
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
26 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(imagehlp
);
31 /***********************************************************************
35 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage
=NULL
;
36 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage
=NULL
;
38 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage
= {
39 NULL
, /* ModuleName */
41 NULL
, /* MappedAddress */
42 NULL
, /* FileHeader */
43 NULL
, /* LastRvaSection */
44 0, /* NumberOfSections */
46 1, /* Characteristics */
47 FALSE
, /* fSystemImage */
48 FALSE
, /* fDOSImage */
49 { &IMAGEHLP_EmptyLoadedImage
.Links
, &IMAGEHLP_EmptyLoadedImage
.Links
}, /* Links */
50 148, /* SizeOfImage; */
53 /***********************************************************************
54 * EnumerateLoadedModules (IMAGEHLP.@)
56 BOOL WINAPI
EnumerateLoadedModules(
58 PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback
,
61 FIXME("(%p, %p, %p): stub\n",
62 hProcess
, EnumLoadedModulesCallback
, UserContext
64 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
68 /***********************************************************************
69 * GetTimestampForLoadedLibrary (IMAGEHLP.@)
71 DWORD WINAPI
GetTimestampForLoadedLibrary(HMODULE Module
)
73 FIXME("(%p): stub\n", Module
);
74 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
78 /***********************************************************************
79 * GetImageConfigInformation (IMAGEHLP.@)
81 BOOL WINAPI
GetImageConfigInformation(
82 PLOADED_IMAGE LoadedImage
,
83 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation
)
85 FIXME("(%p, %p): stub\n",
86 LoadedImage
, ImageConfigInformation
88 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
92 /***********************************************************************
93 * GetImageUnusedHeaderBytes (IMAGEHLP.@)
95 DWORD WINAPI
GetImageUnusedHeaderBytes(
96 PLOADED_IMAGE LoadedImage
,
97 LPDWORD SizeUnusedHeaderBytes
)
99 FIXME("(%p, %p): stub\n",
100 LoadedImage
, SizeUnusedHeaderBytes
102 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
106 /***********************************************************************
107 * ImageDirectoryEntryToData (IMAGEHLP.@)
109 PVOID WINAPI
ImageDirectoryEntryToData(
110 PVOID Base
, BOOLEAN MappedAsImage
, USHORT DirectoryEntry
, PULONG Size
)
112 FIXME("(%p, %d, %hd, %p): stub\n",
113 Base
, MappedAsImage
, DirectoryEntry
, Size
115 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
119 /***********************************************************************
120 * ImageLoad (IMAGEHLP.@)
122 PLOADED_IMAGE WINAPI
ImageLoad(LPSTR DllName
, LPSTR DllPath
)
124 PLOADED_IMAGE pLoadedImage
=
125 HeapAlloc(IMAGEHLP_hHeap
, 0, sizeof(LOADED_IMAGE
));
129 /***********************************************************************
130 * ImageNtHeader (IMAGEHLP.@)
132 PIMAGE_NT_HEADERS WINAPI
ImageNtHeader(PVOID Base
)
134 return (PIMAGE_NT_HEADERS
)
135 ((LPBYTE
) Base
+ ((PIMAGE_DOS_HEADER
) Base
)->e_lfanew
);
138 /***********************************************************************
139 * ImageRvaToSection (IMAGEHLP.@)
141 PIMAGE_SECTION_HEADER WINAPI
ImageRvaToSection(
142 PIMAGE_NT_HEADERS NtHeaders
, PVOID Base
, ULONG Rva
)
144 FIXME("(%p, %p, %ld): stub\n", NtHeaders
, Base
, Rva
);
145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
149 /***********************************************************************
150 * ImageRvaToVa (IMAGEHLP.@)
152 PVOID WINAPI
ImageRvaToVa(
153 PIMAGE_NT_HEADERS NtHeaders
, PVOID Base
, ULONG Rva
,
154 PIMAGE_SECTION_HEADER
*LastRvaSection
)
156 FIXME("(%p, %p, %ld, %p): stub\n",
157 NtHeaders
, Base
, Rva
, LastRvaSection
159 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
163 /***********************************************************************
164 * ImageUnload (IMAGEHLP.@)
166 BOOL WINAPI
ImageUnload(PLOADED_IMAGE pLoadedImage
)
168 LIST_ENTRY
*pCurrent
, *pFind
;
169 if(!IMAGEHLP_pFirstLoadedImage
|| !pLoadedImage
)
171 /* No image loaded or null pointer */
172 SetLastError(ERROR_INVALID_PARAMETER
);
176 pFind
=&pLoadedImage
->Links
;
177 pCurrent
=&IMAGEHLP_pFirstLoadedImage
->Links
;
178 while((pCurrent
!= pFind
) &&
180 pCurrent
= pCurrent
->Flink
;
184 SetLastError(ERROR_INVALID_PARAMETER
);
189 pCurrent
->Blink
->Flink
= pCurrent
->Flink
;
191 IMAGEHLP_pFirstLoadedImage
= pCurrent
->Flink
?CONTAINING_RECORD(
192 pCurrent
->Flink
, LOADED_IMAGE
, Links
):NULL
;
195 pCurrent
->Flink
->Blink
= pCurrent
->Blink
;
197 IMAGEHLP_pLastLoadedImage
= pCurrent
->Blink
?CONTAINING_RECORD(
198 pCurrent
->Blink
, LOADED_IMAGE
, Links
):NULL
;
203 /***********************************************************************
204 * MapAndLoad (IMAGEHLP.@)
206 BOOL WINAPI
MapAndLoad(
207 LPSTR pszImageName
, LPSTR pszDllPath
, PLOADED_IMAGE pLoadedImage
,
208 BOOL bDotDll
, BOOL bReadOnly
)
210 CHAR szFileName
[MAX_PATH
];
211 HANDLE hFile
= (HANDLE
) NULL
;
212 HANDLE hFileMapping
= (HANDLE
) NULL
;
213 HMODULE hModule
= (HMODULE
) NULL
;
214 PIMAGE_NT_HEADERS pNtHeader
= NULL
;
216 /* PathCombine(&szFileName, pszDllPath, pszImageName); */
217 /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
219 /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */
220 if(!(hFile
= CreateFileA(
221 szFileName
, GENERIC_READ
, 1, /* FIXME: FILE_SHARE_READ not defined */
222 NULL
, OPEN_EXISTING
, 0, (HANDLE
) NULL
)))
224 SetLastError(ERROR_FILE_NOT_FOUND
);
228 if(!(hFileMapping
= CreateFileMappingA(
229 hFile
, NULL
, PAGE_READONLY
| SEC_COMMIT
, 0, 0, NULL
)))
231 DWORD dwLastError
= GetLastError();
232 WARN("CreateFileMapping: Error = %ld\n", dwLastError
);
233 SetLastError(dwLastError
);
237 hFile
= (HANDLE
) NULL
;
239 if(!(hModule
= (HMODULE
) MapViewOfFile(
240 hFileMapping
, FILE_MAP_READ
, 0, 0, 0)))
242 DWORD dwLastError
= GetLastError();
243 WARN("MapViewOfFile: Error = %ld\n", dwLastError
);
244 SetLastError(dwLastError
);
248 CloseHandle(hFileMapping
);
249 hFileMapping
=(HANDLE
) NULL
;
251 pLoadedImage
= (PLOADED_IMAGE
) HeapAlloc(
252 IMAGEHLP_hHeap
, 0, sizeof(LOADED_IMAGE
)
255 pNtHeader
= ImageNtHeader((PVOID
) hModule
);
257 pLoadedImage
->ModuleName
= HeapAlloc(IMAGEHLP_hHeap
, 0, strlen(pszDllPath
)+1); /* FIXME: Correct? */
258 strcpy( pLoadedImage
->ModuleName
, pszDllPath
);
259 pLoadedImage
->hFile
= hFile
;
260 pLoadedImage
->MappedAddress
= (PUCHAR
) hModule
;
261 pLoadedImage
->FileHeader
= pNtHeader
;
262 pLoadedImage
->Sections
= (PIMAGE_SECTION_HEADER
)
263 ((LPBYTE
) &pNtHeader
->OptionalHeader
+
264 pNtHeader
->FileHeader
.SizeOfOptionalHeader
);
265 pLoadedImage
->NumberOfSections
=
266 pNtHeader
->FileHeader
.NumberOfSections
;
267 pLoadedImage
->SizeOfImage
=
268 pNtHeader
->OptionalHeader
.SizeOfImage
;
269 pLoadedImage
->Characteristics
=
270 pNtHeader
->FileHeader
.Characteristics
;
271 pLoadedImage
->LastRvaSection
= pLoadedImage
->Sections
;
273 pLoadedImage
->fSystemImage
= FALSE
; /* FIXME */
274 pLoadedImage
->fDOSImage
= FALSE
; /* FIXME */
276 /* FIXME: Make thread safe */
277 pLoadedImage
->Links
.Flink
= NULL
;
278 pLoadedImage
->Links
.Blink
= &IMAGEHLP_pLastLoadedImage
->Links
;
279 if(IMAGEHLP_pLastLoadedImage
)
280 IMAGEHLP_pLastLoadedImage
->Links
.Flink
= &pLoadedImage
->Links
;
281 IMAGEHLP_pLastLoadedImage
= pLoadedImage
;
282 if(!IMAGEHLP_pFirstLoadedImage
)
283 IMAGEHLP_pFirstLoadedImage
= pLoadedImage
;
289 UnmapViewOfFile((PVOID
) hModule
);
291 CloseHandle(hFileMapping
);
297 /***********************************************************************
298 * SetImageConfigInformation (IMAGEHLP.@)
300 BOOL WINAPI
SetImageConfigInformation(
301 PLOADED_IMAGE LoadedImage
,
302 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation
)
304 FIXME("(%p, %p): stub\n",
305 LoadedImage
, ImageConfigInformation
307 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
311 /***********************************************************************
312 * UnMapAndLoad (IMAGEHLP.@)
314 BOOL WINAPI
UnMapAndLoad(PLOADED_IMAGE LoadedImage
)
316 FIXME("(%p): stub\n", LoadedImage
);
317 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);