Compile the imagehlp dll with STRICT defined.
[wine/dcerpc.git] / dlls / imagehlp / access.c
blob35afaeaabd1963cfb5dc89432d741ffe932894cb
1 /*
2 * IMAGEHLP library
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
21 #include <string.h>
22 #include "winbase.h"
23 #include "winnt.h"
24 #include "winerror.h"
25 #include "windef.h"
26 #include "wine/debug.h"
27 #include "imagehlp.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
31 /***********************************************************************
32 * Data
35 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
36 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
38 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
39 NULL, /* ModuleName */
40 0, /* hFile */
41 NULL, /* MappedAddress */
42 NULL, /* FileHeader */
43 NULL, /* LastRvaSection */
44 0, /* NumberOfSections */
45 NULL, /* Sections */
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(
57 HANDLE hProcess,
58 PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
59 PVOID UserContext)
61 FIXME("(%p, %p, %p): stub\n",
62 hProcess, EnumLoadedModulesCallback, UserContext
64 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
65 return FALSE;
68 /***********************************************************************
69 * GetTimestampForLoadedLibrary (IMAGEHLP.@)
71 DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
73 FIXME("(%p): stub\n", Module);
74 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
75 return 0;
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);
89 return FALSE;
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);
103 return 0;
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);
116 return NULL;
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));
126 return pLoadedImage;
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);
146 return NULL;
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);
160 return NULL;
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);
173 return FALSE;
176 pFind=&pLoadedImage->Links;
177 pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
178 while((pCurrent != pFind) &&
179 (pCurrent != NULL))
180 pCurrent = pCurrent->Flink;
181 if(!pCurrent)
183 /* Not found */
184 SetLastError(ERROR_INVALID_PARAMETER);
185 return FALSE;
188 if(pCurrent->Blink)
189 pCurrent->Blink->Flink = pCurrent->Flink;
190 else
191 IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
192 pCurrent->Flink, LOADED_IMAGE, Links):NULL;
194 if(pCurrent->Flink)
195 pCurrent->Flink->Blink = pCurrent->Blink;
196 else
197 IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
198 pCurrent->Blink, LOADED_IMAGE, Links):NULL;
200 return FALSE;
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);
225 goto Error;
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);
234 goto Error;
236 CloseHandle(hFile);
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);
245 goto Error;
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;
285 return TRUE;
287 Error:
288 if(hModule)
289 UnmapViewOfFile((PVOID) hModule);
290 if(hFileMapping)
291 CloseHandle(hFileMapping);
292 if(hFile)
293 CloseHandle(hFile);
294 return FALSE;
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);
308 return FALSE;
311 /***********************************************************************
312 * UnMapAndLoad (IMAGEHLP.@)
314 BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
316 FIXME("(%p): stub\n", LoadedImage);
317 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
318 return FALSE;