Added LGPL standard comment, and copyright notices where necessary.
[wine] / dlls / imagehlp / access.c
1 /*
2  *      IMAGEHLP library
3  *
4  *      Copyright 1998  Patrik Stridvall
5  *
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.
10  *
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.
15  *
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
19  */
20
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"
28
29 WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
30
31 /***********************************************************************
32  *           Data
33  */
34
35 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
36 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
37
38 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
39   NULL,       /* ModuleName */
40   0xffffffff, /* 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; */
51 };
52
53 /***********************************************************************
54  *              EnumerateLoadedModules (IMAGEHLP.@)
55  */
56 BOOL WINAPI EnumerateLoadedModules(
57   HANDLE hProcess,
58   PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
59   PVOID UserContext)
60 {
61   FIXME("(0x%08x, %p, %p): stub\n",
62     hProcess, EnumLoadedModulesCallback, UserContext
63   );
64   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
65   return FALSE;
66 }
67
68 /***********************************************************************
69  *              GetTimestampForLoadedLibrary (IMAGEHLP.@)
70  */
71 DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
72 {
73   FIXME("(0x%08x): stub\n", Module);
74   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
75   return 0;
76 }
77
78 /***********************************************************************
79  *              GetImageConfigInformation (IMAGEHLP.@)
80  */
81 BOOL WINAPI GetImageConfigInformation(
82   PLOADED_IMAGE LoadedImage,
83   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
84 {
85   FIXME("(%p, %p): stub\n",
86     LoadedImage, ImageConfigInformation
87   );
88   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
89   return FALSE;
90 }
91
92 /***********************************************************************
93  *              GetImageUnusedHeaderBytes (IMAGEHLP.@)
94  */
95 DWORD WINAPI GetImageUnusedHeaderBytes(
96   PLOADED_IMAGE LoadedImage,
97   LPDWORD SizeUnusedHeaderBytes)
98 {
99   FIXME("(%p, %p): stub\n",
100     LoadedImage, SizeUnusedHeaderBytes
101   );
102   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
103   return 0;
104 }
105
106 /***********************************************************************
107  *              ImageDirectoryEntryToData (IMAGEHLP.@)
108  */
109 PVOID WINAPI ImageDirectoryEntryToData(
110   PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
111 {
112   FIXME("(%p, %d, %hd, %p): stub\n",
113     Base, MappedAsImage, DirectoryEntry, Size
114   );
115   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
116   return NULL;
117 }
118
119 /***********************************************************************
120  *              ImageLoad (IMAGEHLP.@)
121  */
122 PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
123 {
124   PLOADED_IMAGE pLoadedImage = 
125     HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
126   return pLoadedImage;
127 }
128
129 /***********************************************************************
130  *              ImageNtHeader (IMAGEHLP.@)
131  */
132 PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
133 {
134   return (PIMAGE_NT_HEADERS)
135     ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
136 }
137
138 /***********************************************************************
139  *              ImageRvaToSection (IMAGEHLP.@)
140  */
141 PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
142   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
143 {
144   FIXME("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
145   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
146   return NULL;
147 }
148
149 /***********************************************************************
150  *              ImageRvaToVa (IMAGEHLP.@)
151  */
152 PVOID WINAPI ImageRvaToVa(
153   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
154   PIMAGE_SECTION_HEADER *LastRvaSection)
155 {
156   FIXME("(%p, %p, %ld, %p): stub\n",
157     NtHeaders, Base, Rva, LastRvaSection
158   );
159   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
160   return NULL;
161 }
162
163 /***********************************************************************
164  *              ImageUnload (IMAGEHLP.@)
165  */
166 BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
167 {
168   LIST_ENTRY *pCurrent, *pFind;
169   if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
170     {
171       /* No image loaded or null pointer */
172       SetLastError(ERROR_INVALID_PARAMETER);
173       return FALSE;
174     }
175
176   pFind=&pLoadedImage->Links;
177   pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
178   while((pCurrent != pFind) && 
179     (pCurrent != NULL)) 
180       pCurrent = pCurrent->Flink;
181   if(!pCurrent)
182     {
183       /* Not found */
184       SetLastError(ERROR_INVALID_PARAMETER);
185       return FALSE;
186     }
187
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;
193
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;
199
200   return FALSE;
201 }
202
203 /***********************************************************************
204  *              MapAndLoad (IMAGEHLP.@)
205  */
206 BOOL WINAPI MapAndLoad(
207   LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
208   BOOL bDotDll, BOOL bReadOnly)
209 {
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;
215
216   /* PathCombine(&szFileName, pszDllPath, pszImageName); */
217   /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
218
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)))
223     {
224       SetLastError(ERROR_FILE_NOT_FOUND);
225       goto Error;
226     }
227
228   if(!(hFileMapping = CreateFileMappingA(
229     hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
230     {
231       DWORD dwLastError = GetLastError();
232       WARN("CreateFileMapping: Error = %ld\n", dwLastError);
233       SetLastError(dwLastError);
234       goto Error;
235     }
236   CloseHandle(hFile);
237   hFile = (HANDLE) NULL;
238
239   if(!(hModule = (HMODULE) MapViewOfFile(
240     hFileMapping, FILE_MAP_READ, 0, 0, 0)))
241     {
242       DWORD dwLastError = GetLastError();
243       WARN("MapViewOfFile: Error = %ld\n", dwLastError);
244       SetLastError(dwLastError);
245       goto Error;
246     }
247
248   CloseHandle(hFileMapping);
249   hFileMapping=(HANDLE) NULL;
250
251   pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
252     IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
253   );
254
255   pNtHeader = ImageNtHeader((PVOID) hModule);
256
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;
272
273   pLoadedImage->fSystemImage = FALSE; /* FIXME */
274   pLoadedImage->fDOSImage = FALSE;    /* FIXME */
275
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;
284
285   return TRUE;
286
287 Error:
288   if(hModule)
289     UnmapViewOfFile((PVOID) hModule);
290   if(hFileMapping)
291     CloseHandle(hFileMapping);
292   if(hFile)
293     CloseHandle(hFile);
294   return FALSE;
295 }
296
297 /***********************************************************************
298  *              SetImageConfigInformation (IMAGEHLP.@)
299  */
300 BOOL WINAPI SetImageConfigInformation(
301   PLOADED_IMAGE LoadedImage,
302   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
303 {
304   FIXME("(%p, %p): stub\n",
305     LoadedImage, ImageConfigInformation
306   );
307   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
308   return FALSE;
309 }
310
311 /***********************************************************************
312  *              UnMapAndLoad (IMAGEHLP.@)
313  */
314 BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
315 {
316   FIXME("(%p): stub\n", LoadedImage);
317   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
318   return FALSE;
319 }
320
321