4 * Copyright 1998 Patrik Stridvall
15 /***********************************************************************
19 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage
=NULL
;
20 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage
=NULL
;
22 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage
= {
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_EmptyLoadedImage
.Links
, &IMAGEHLP_EmptyLoadedImage
.Links
}, /* Links */
34 148, /* SizeOfImage; */
37 /***********************************************************************
38 * EnumerateLoadedModules32 (IMAGEHLP.4)
40 BOOL WINAPI
EnumerateLoadedModules(
42 PENUMLOADED_MODULES_CALLBACK 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
GetTimestampForLoadedLibrary(HMODULE Module
)
57 FIXME(imagehlp
, "(0x%08x): stub\n", Module
);
58 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
62 /***********************************************************************
63 * GetImageConfigInformation32 (IMAGEHLP.7)
65 BOOL WINAPI
GetImageConfigInformation(
66 PLOADED_IMAGE LoadedImage
,
67 PIMAGE_LOAD_CONFIG_DIRECTORY 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
GetImageUnusedHeaderBytes(
80 PLOADED_IMAGE 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
ImageDirectoryEntryToData(
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_IMAGE WINAPI
ImageLoad(LPSTR DllName
, LPSTR DllPath
)
108 PLOADED_IMAGE pLoadedImage
=
109 HeapAlloc(IMAGEHLP_hHeap
, 0, sizeof(LOADED_IMAGE
));
113 /***********************************************************************
114 * ImageNtHeader32 (IMAGEHLP.17)
116 PIMAGE_NT_HEADERS WINAPI
ImageNtHeader(PVOID Base
)
118 return (PIMAGE_NT_HEADERS
)
119 ((LPBYTE
) Base
+ ((PIMAGE_DOS_HEADER
) Base
)->e_lfanew
);
122 /***********************************************************************
123 * ImageRvaToSection32 (IMAGEHLP.19)
125 PIMAGE_SECTION_HEADER WINAPI
ImageRvaToSection(
126 PIMAGE_NT_HEADERS 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
ImageRvaToVa(
137 PIMAGE_NT_HEADERS NtHeaders
, PVOID Base
, ULONG Rva
,
138 PIMAGE_SECTION_HEADER
*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 BOOL WINAPI
ImageUnload(PLOADED_IMAGE pLoadedImage
)
152 LIST_ENTRY
*pCurrent
, *pFind
;
153 if(!IMAGEHLP_pFirstLoadedImage
|| !pLoadedImage
)
155 /* No image loaded or null pointer */
156 SetLastError(ERROR_INVALID_PARAMETER
);
160 pFind
=&pLoadedImage
->Links
;
161 pCurrent
=&IMAGEHLP_pFirstLoadedImage
->Links
;
162 while((pCurrent
!= pFind
) &&
164 pCurrent
= pCurrent
->Flink
;
168 SetLastError(ERROR_INVALID_PARAMETER
);
173 pCurrent
->Blink
->Flink
= pCurrent
->Flink
;
175 IMAGEHLP_pFirstLoadedImage
= pCurrent
->Flink
?CONTAINING_RECORD(
176 pCurrent
->Flink
, LOADED_IMAGE
, Links
):NULL
;
179 pCurrent
->Flink
->Blink
= pCurrent
->Blink
;
181 IMAGEHLP_pLastLoadedImage
= pCurrent
->Blink
?CONTAINING_RECORD(
182 pCurrent
->Blink
, LOADED_IMAGE
, Links
):NULL
;
187 /***********************************************************************
188 * MapAndLoad32 (IMAGEHLP.25)
190 BOOL WINAPI
MapAndLoad(
191 LPSTR pszImageName
, LPSTR pszDllPath
, PLOADED_IMAGE pLoadedImage
,
192 BOOL bDotDll
, BOOL bReadOnly
)
194 CHAR szFileName
[MAX_PATH
];
195 HANDLE hFile
= (HANDLE
) NULL
;
196 HANDLE hFileMapping
= (HANDLE
) NULL
;
197 HMODULE hModule
= (HMODULE
) NULL
;
198 PIMAGE_NT_HEADERS 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
= CreateFileA(
205 szFileName
, GENERIC_READ
, 1, /* FIXME: FILE_SHARE_READ not defined */
206 NULL
, OPEN_EXISTING
, 0, (HANDLE
) NULL
)))
208 SetLastError(ERROR_FILE_NOT_FOUND
);
212 if(!(hFileMapping
= CreateFileMappingA(
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
= (HANDLE
) NULL
;
223 if(!(hModule
= (HMODULE
) 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
=(HANDLE
) NULL
;
235 pLoadedImage
= (PLOADED_IMAGE
) HeapAlloc(
236 IMAGEHLP_hHeap
, 0, sizeof(LOADED_IMAGE
)
239 pNtHeader
= ImageNtHeader((PVOID
) hModule
);
241 pLoadedImage
->ModuleName
=
242 HEAP_strdupA(IMAGEHLP_hHeap
, 0, pszDllPath
); /* FIXME: Correct? */
243 pLoadedImage
->hFile
= hFile
;
244 pLoadedImage
->MappedAddress
= (PUCHAR
) hModule
;
245 pLoadedImage
->FileHeader
= pNtHeader
;
246 pLoadedImage
->Sections
= (PIMAGE_SECTION_HEADER
)
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_pLastLoadedImage
->Links
;
263 if(IMAGEHLP_pLastLoadedImage
)
264 IMAGEHLP_pLastLoadedImage
->Links
.Flink
= &pLoadedImage
->Links
;
265 IMAGEHLP_pLastLoadedImage
= pLoadedImage
;
266 if(!IMAGEHLP_pFirstLoadedImage
)
267 IMAGEHLP_pFirstLoadedImage
= pLoadedImage
;
273 UnmapViewOfFile((PVOID
) hModule
);
275 CloseHandle(hFileMapping
);
281 /***********************************************************************
282 * SetImageConfigInformation32 (IMAGEHLP.34)
284 BOOL WINAPI
SetImageConfigInformation(
285 PLOADED_IMAGE LoadedImage
,
286 PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation
)
288 FIXME(imagehlp
, "(%p, %p): stub\n",
289 LoadedImage
, ImageConfigInformation
291 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
295 /***********************************************************************
296 * UnMapAndLoad32 (IMAGEHLP.58)
298 BOOL WINAPI
UnMapAndLoad(PLOADED_IMAGE LoadedImage
)
300 FIXME(imagehlp
, "(%p): stub\n", LoadedImage
);
301 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);