Fixes for FreeBSD.
[wine] / dlls / imagehlp / access.c
1 /*
2  *      IMAGEHLP library
3  *
4  *      Copyright 1998  Patrik Stridvall
5  */
6
7 #include "windows.h"
8 #include "winbase.h"
9 #include "winnt.h"
10 #include "winerror.h"
11 #include "wintypes.h"
12 #include "heap.h"
13 #include "debug.h"
14 #include "imagehlp.h"
15
16 /***********************************************************************
17  *           Data
18  */
19
20 static PLOADED_IMAGE32 IMAGEHLP_pFirstLoadedImage32=NULL;
21 static PLOADED_IMAGE32 IMAGEHLP_pLastLoadedImage32=NULL;
22
23 static LOADED_IMAGE32 IMAGEHLP_EmptyLoadedImage32 = {
24   NULL,       /* ModuleName */
25   0xffffffff, /* hFile */
26   NULL,       /* MappedAddress */
27   NULL,       /* FileHeader */
28   NULL,       /* LastRvaSection */
29   0,          /* NumberOfSections */
30   NULL,       /* Sections */
31   1,          /* Characteristics */
32   FALSE,      /* fSystemImage */
33   FALSE,      /* fDOSImage */
34   { &IMAGEHLP_EmptyLoadedImage32.Links, &IMAGEHLP_EmptyLoadedImage32.Links }, /* Links */
35   148,        /* SizeOfImage; */
36 };
37
38 /***********************************************************************
39  *           EnumerateLoadedModules32 (IMAGEHLP.4)
40  */
41 BOOL32 WINAPI EnumerateLoadedModules32(
42   HANDLE32 hProcess,
43   PENUMLOADED_MODULES_CALLBACK32 EnumLoadedModulesCallback,
44   PVOID UserContext)
45 {
46   FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
47     hProcess, EnumLoadedModulesCallback, UserContext
48   );
49   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
50   return FALSE;
51 }
52
53 /***********************************************************************
54  *           GetTimestampForLoadedLibrary32 (IMAGEHLP.9)
55  */
56 DWORD WINAPI GetTimestampForLoadedLibrary32(HMODULE32 Module)
57 {
58   FIXME(imagehlp, "(0x%08x): stub\n", Module);
59   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
60   return 0;
61 }
62
63 /***********************************************************************
64  *           GetImageConfigInformation32 (IMAGEHLP.7)
65  */
66 BOOL32 WINAPI GetImageConfigInformation32(
67   PLOADED_IMAGE32 LoadedImage,
68   PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
69 {
70   FIXME(imagehlp, "(%p, %p): stub\n",
71     LoadedImage, ImageConfigInformation
72   );
73   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
74   return FALSE;
75 }
76
77 /***********************************************************************
78  *           GetImageUnusedHeaderBytes32 (IMAGEHLP.8)
79  */
80 DWORD WINAPI GetImageUnusedHeaderBytes32(
81   PLOADED_IMAGE32 LoadedImage,
82   LPDWORD SizeUnusedHeaderBytes)
83 {
84   FIXME(imagehlp, "(%p, %p): stub\n",
85     LoadedImage, SizeUnusedHeaderBytes
86   );
87   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
88   return 0;
89 }
90
91 /***********************************************************************
92  *           ImageDirectoryEntryToData32 (IMAGEHLP.11)
93  */
94 PVOID WINAPI ImageDirectoryEntryToData32(
95   PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
96 {
97   FIXME(imagehlp, "(%p, %d, %d, %p): stub\n",
98     Base, MappedAsImage, DirectoryEntry, Size
99   );
100   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
101   return NULL;
102 }
103
104 /***********************************************************************
105  *           ImageLoad32 (IMAGEHLP.16)
106  */
107 PLOADED_IMAGE32 WINAPI ImageLoad32(LPSTR DllName, LPSTR DllPath)
108 {
109   PLOADED_IMAGE32 pLoadedImage = 
110     HeapAlloc(IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32));
111   return pLoadedImage;
112 }
113
114 /***********************************************************************
115  *           ImageNtHeader32 (IMAGEHLP.17)
116  */
117 PIMAGE_NT_HEADERS32 WINAPI ImageNtHeader32(PVOID Base)
118 {
119   return (PIMAGE_NT_HEADERS32)
120     ((LPBYTE) Base + ((PIMAGE_DOS_HEADER32) Base)->e_lfanew);
121 }
122
123 /***********************************************************************
124  *           ImageRvaToSection32 (IMAGEHLP.19)
125  */
126 PIMAGE_SECTION_HEADER32 WINAPI ImageRvaToSection32(
127   PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva)
128 {
129   FIXME(imagehlp, "(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
130   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
131   return NULL;
132 }
133
134 /***********************************************************************
135  *           ImageRvaToVa32 (IMAGEHLP.20)
136  */
137 PVOID WINAPI ImageRvaToVa32(
138   PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva,
139   PIMAGE_SECTION_HEADER32 *LastRvaSection)
140 {
141   FIXME(imagehlp, "(%p, %p, %ld, %p): stub\n",
142     NtHeaders, Base, Rva, LastRvaSection
143   );
144   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
145   return NULL;
146 }
147
148 /***********************************************************************
149  *           ImageUnload32 (IMAGEHLP.21)
150  */
151 BOOL32 WINAPI ImageUnload32(PLOADED_IMAGE32 pLoadedImage)
152 {
153   LIST_ENTRY32 *pCurrent, *pFind;
154   if(!IMAGEHLP_pFirstLoadedImage32 || !pLoadedImage)
155     {
156       /* No image loaded or null pointer */
157       SetLastError(ERROR_INVALID_PARAMETER);
158       return FALSE;
159     }
160
161   pFind=&pLoadedImage->Links;
162   pCurrent=&IMAGEHLP_pFirstLoadedImage32->Links;
163   while((pCurrent != pFind) && 
164     (pCurrent != NULL)) 
165       pCurrent = pCurrent->Flink;
166   if(!pCurrent)
167     {
168       /* Not found */
169       SetLastError(ERROR_INVALID_PARAMETER);
170       return FALSE;
171     }
172
173   if(pCurrent->Blink)
174     pCurrent->Blink->Flink = pCurrent->Flink;
175   else
176     IMAGEHLP_pFirstLoadedImage32 = pCurrent->Flink?CONTAINING_RECORD(
177       pCurrent->Flink, LOADED_IMAGE32, Links):NULL;
178
179   if(pCurrent->Flink)
180     pCurrent->Flink->Blink = pCurrent->Blink;
181   else
182     IMAGEHLP_pLastLoadedImage32 = pCurrent->Blink?CONTAINING_RECORD(
183       pCurrent->Blink, LOADED_IMAGE32, Links):NULL;
184
185   return FALSE;
186 }
187
188 /***********************************************************************
189  *           MapAndLoad32 (IMAGEHLP.25)
190  */
191 BOOL32 WINAPI MapAndLoad32(
192   LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE32 pLoadedImage,
193   BOOL32 bDotDll, BOOL32 bReadOnly)
194 {
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;
200
201   /* PathCombine(&szFileName, pszDllPath, pszImageName); */
202   /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
203
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)))
208     {
209       SetLastError(ERROR_FILE_NOT_FOUND);
210       goto Error;
211     }
212
213   if(!(hFileMapping = CreateFileMapping32A(
214     hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
215     {
216       DWORD dwLastError = GetLastError();
217       WARN(imagehlp, "CreateFileMapping: Error = %ld\n", dwLastError);
218       SetLastError(dwLastError);
219       goto Error;
220     }
221   CloseHandle(hFile);
222   hFile = (HANDLE32) NULL;
223
224   if(!(hModule = (HMODULE32) MapViewOfFile(
225     hFileMapping, FILE_MAP_READ, 0, 0, 0)))
226     {
227       DWORD dwLastError = GetLastError();
228       WARN(imagehlp, "MapViewOfFile: Error = %ld\n", dwLastError);
229       SetLastError(dwLastError);
230       goto Error;
231     }
232
233   CloseHandle(hFileMapping);
234   hFileMapping=(HANDLE32) NULL;
235
236   pLoadedImage = (PLOADED_IMAGE32) HeapAlloc(
237     IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32)
238   );
239
240   pNtHeader = ImageNtHeader32((PVOID) hModule);
241
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;
257
258   pLoadedImage->fSystemImage = FALSE; /* FIXME */
259   pLoadedImage->fDOSImage = FALSE;    /* FIXME */
260
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;
269
270   return TRUE;
271
272 Error:
273   if(hModule)
274     UnmapViewOfFile((PVOID) hModule);
275   if(hFileMapping)
276     CloseHandle(hFileMapping);
277   if(hFile)
278     CloseHandle(hFile);
279   return FALSE;
280 }
281
282 /***********************************************************************
283  *           SetImageConfigInformation32 (IMAGEHLP.34)
284  */
285 BOOL32 WINAPI SetImageConfigInformation32(
286   PLOADED_IMAGE32 LoadedImage,
287   PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation)
288 {
289   FIXME(imagehlp, "(%p, %p): stub\n",
290     LoadedImage, ImageConfigInformation
291   );
292   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
293   return FALSE;
294 }
295
296 /***********************************************************************
297  *           UnMapAndLoad32 (IMAGEHLP.58)
298  */
299 BOOL32 WINAPI UnMapAndLoad32(PLOADED_IMAGE32 LoadedImage)
300 {
301   FIXME(imagehlp, "(%p): stub\n", LoadedImage);
302   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
303   return FALSE;
304 }
305
306