Removed all non-standard common control headers from the include
[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 "windef.h"
11 #include "heap.h"
12 #include "debugtools.h"
13 #include "imagehlp.h"
14
15 DEFAULT_DEBUG_CHANNEL(imagehlp);
16
17 /***********************************************************************
18  *           Data
19  */
20
21 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
22 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
23
24 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
25   NULL,       /* ModuleName */
26   0xffffffff, /* hFile */
27   NULL,       /* MappedAddress */
28   NULL,       /* FileHeader */
29   NULL,       /* LastRvaSection */
30   0,          /* NumberOfSections */
31   NULL,       /* Sections */
32   1,          /* Characteristics */
33   FALSE,      /* fSystemImage */
34   FALSE,      /* fDOSImage */
35   { &IMAGEHLP_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
36   148,        /* SizeOfImage; */
37 };
38
39 /***********************************************************************
40  *              EnumerateLoadedModules (IMAGEHLP.@)
41  */
42 BOOL WINAPI EnumerateLoadedModules(
43   HANDLE hProcess,
44   PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
45   PVOID UserContext)
46 {
47   FIXME("(0x%08x, %p, %p): stub\n",
48     hProcess, EnumLoadedModulesCallback, UserContext
49   );
50   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
51   return FALSE;
52 }
53
54 /***********************************************************************
55  *              GetTimestampForLoadedLibrary (IMAGEHLP.@)
56  */
57 DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
58 {
59   FIXME("(0x%08x): stub\n", Module);
60   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
61   return 0;
62 }
63
64 /***********************************************************************
65  *              GetImageConfigInformation (IMAGEHLP.@)
66  */
67 BOOL WINAPI GetImageConfigInformation(
68   PLOADED_IMAGE LoadedImage,
69   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
70 {
71   FIXME("(%p, %p): stub\n",
72     LoadedImage, ImageConfigInformation
73   );
74   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
75   return FALSE;
76 }
77
78 /***********************************************************************
79  *              GetImageUnusedHeaderBytes (IMAGEHLP.@)
80  */
81 DWORD WINAPI GetImageUnusedHeaderBytes(
82   PLOADED_IMAGE LoadedImage,
83   LPDWORD SizeUnusedHeaderBytes)
84 {
85   FIXME("(%p, %p): stub\n",
86     LoadedImage, SizeUnusedHeaderBytes
87   );
88   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
89   return 0;
90 }
91
92 /***********************************************************************
93  *              ImageDirectoryEntryToData (IMAGEHLP.@)
94  */
95 PVOID WINAPI ImageDirectoryEntryToData(
96   PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
97 {
98   FIXME("(%p, %d, %hd, %p): stub\n",
99     Base, MappedAsImage, DirectoryEntry, Size
100   );
101   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
102   return NULL;
103 }
104
105 /***********************************************************************
106  *              ImageLoad (IMAGEHLP.@)
107  */
108 PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
109 {
110   PLOADED_IMAGE pLoadedImage = 
111     HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
112   return pLoadedImage;
113 }
114
115 /***********************************************************************
116  *              ImageNtHeader (IMAGEHLP.@)
117  */
118 PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
119 {
120   return (PIMAGE_NT_HEADERS)
121     ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
122 }
123
124 /***********************************************************************
125  *              ImageRvaToSection (IMAGEHLP.@)
126  */
127 PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
128   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
129 {
130   FIXME("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
131   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
132   return NULL;
133 }
134
135 /***********************************************************************
136  *              ImageRvaToVa (IMAGEHLP.@)
137  */
138 PVOID WINAPI ImageRvaToVa(
139   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
140   PIMAGE_SECTION_HEADER *LastRvaSection)
141 {
142   FIXME("(%p, %p, %ld, %p): stub\n",
143     NtHeaders, Base, Rva, LastRvaSection
144   );
145   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
146   return NULL;
147 }
148
149 /***********************************************************************
150  *              ImageUnload (IMAGEHLP.@)
151  */
152 BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
153 {
154   LIST_ENTRY *pCurrent, *pFind;
155   if(!IMAGEHLP_pFirstLoadedImage || !pLoadedImage)
156     {
157       /* No image loaded or null pointer */
158       SetLastError(ERROR_INVALID_PARAMETER);
159       return FALSE;
160     }
161
162   pFind=&pLoadedImage->Links;
163   pCurrent=&IMAGEHLP_pFirstLoadedImage->Links;
164   while((pCurrent != pFind) && 
165     (pCurrent != NULL)) 
166       pCurrent = pCurrent->Flink;
167   if(!pCurrent)
168     {
169       /* Not found */
170       SetLastError(ERROR_INVALID_PARAMETER);
171       return FALSE;
172     }
173
174   if(pCurrent->Blink)
175     pCurrent->Blink->Flink = pCurrent->Flink;
176   else
177     IMAGEHLP_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
178       pCurrent->Flink, LOADED_IMAGE, Links):NULL;
179
180   if(pCurrent->Flink)
181     pCurrent->Flink->Blink = pCurrent->Blink;
182   else
183     IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
184       pCurrent->Blink, LOADED_IMAGE, Links):NULL;
185
186   return FALSE;
187 }
188
189 /***********************************************************************
190  *              MapAndLoad (IMAGEHLP.@)
191  */
192 BOOL WINAPI MapAndLoad(
193   LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
194   BOOL bDotDll, BOOL bReadOnly)
195 {
196   CHAR szFileName[MAX_PATH];
197   HANDLE hFile = (HANDLE) NULL;
198   HANDLE hFileMapping = (HANDLE) NULL;
199   HMODULE hModule = (HMODULE) NULL;
200   PIMAGE_NT_HEADERS pNtHeader = NULL;
201
202   /* PathCombine(&szFileName, pszDllPath, pszImageName); */
203   /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
204
205   /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */
206   if(!(hFile = CreateFileA(
207     szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
208     NULL, OPEN_EXISTING, 0, (HANDLE) NULL)))
209     {
210       SetLastError(ERROR_FILE_NOT_FOUND);
211       goto Error;
212     }
213
214   if(!(hFileMapping = CreateFileMappingA(
215     hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
216     {
217       DWORD dwLastError = GetLastError();
218       WARN("CreateFileMapping: Error = %ld\n", dwLastError);
219       SetLastError(dwLastError);
220       goto Error;
221     }
222   CloseHandle(hFile);
223   hFile = (HANDLE) NULL;
224
225   if(!(hModule = (HMODULE) MapViewOfFile(
226     hFileMapping, FILE_MAP_READ, 0, 0, 0)))
227     {
228       DWORD dwLastError = GetLastError();
229       WARN("MapViewOfFile: Error = %ld\n", dwLastError);
230       SetLastError(dwLastError);
231       goto Error;
232     }
233
234   CloseHandle(hFileMapping);
235   hFileMapping=(HANDLE) NULL;
236
237   pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
238     IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
239   );
240
241   pNtHeader = ImageNtHeader((PVOID) hModule);
242
243   pLoadedImage->ModuleName =
244     HEAP_strdupA(IMAGEHLP_hHeap, 0, pszDllPath); /* FIXME: Correct? */
245   pLoadedImage->hFile = hFile;
246   pLoadedImage->MappedAddress = (PUCHAR) hModule;
247   pLoadedImage->FileHeader = pNtHeader;
248   pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
249     ((LPBYTE) &pNtHeader->OptionalHeader +
250       pNtHeader->FileHeader.SizeOfOptionalHeader);
251   pLoadedImage->NumberOfSections =
252     pNtHeader->FileHeader.NumberOfSections;
253   pLoadedImage->SizeOfImage =
254     pNtHeader->OptionalHeader.SizeOfImage;
255   pLoadedImage->Characteristics =
256     pNtHeader->FileHeader.Characteristics;
257   pLoadedImage->LastRvaSection = pLoadedImage->Sections;
258
259   pLoadedImage->fSystemImage = FALSE; /* FIXME */
260   pLoadedImage->fDOSImage = FALSE;    /* FIXME */
261
262   /* FIXME: Make thread safe */
263   pLoadedImage->Links.Flink = NULL;
264   pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
265   if(IMAGEHLP_pLastLoadedImage)
266     IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
267   IMAGEHLP_pLastLoadedImage = pLoadedImage;
268   if(!IMAGEHLP_pFirstLoadedImage)
269     IMAGEHLP_pFirstLoadedImage = pLoadedImage;
270
271   return TRUE;
272
273 Error:
274   if(hModule)
275     UnmapViewOfFile((PVOID) hModule);
276   if(hFileMapping)
277     CloseHandle(hFileMapping);
278   if(hFile)
279     CloseHandle(hFile);
280   return FALSE;
281 }
282
283 /***********************************************************************
284  *              SetImageConfigInformation (IMAGEHLP.@)
285  */
286 BOOL WINAPI SetImageConfigInformation(
287   PLOADED_IMAGE LoadedImage,
288   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
289 {
290   FIXME("(%p, %p): stub\n",
291     LoadedImage, ImageConfigInformation
292   );
293   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
294   return FALSE;
295 }
296
297 /***********************************************************************
298  *              UnMapAndLoad (IMAGEHLP.@)
299  */
300 BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
301 {
302   FIXME("(%p): stub\n", LoadedImage);
303   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
304   return FALSE;
305 }
306
307