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