Moved standard syslevel APIs declaration to winbase.h.
[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 "debugtools.h"
12 #include "imagehlp.h"
13
14 DEFAULT_DEBUG_CHANNEL(imagehlp);
15
16 /***********************************************************************
17  *           Data
18  */
19
20 static PLOADED_IMAGE IMAGEHLP_pFirstLoadedImage=NULL;
21 static PLOADED_IMAGE IMAGEHLP_pLastLoadedImage=NULL;
22
23 static LOADED_IMAGE IMAGEHLP_EmptyLoadedImage = {
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_EmptyLoadedImage.Links, &IMAGEHLP_EmptyLoadedImage.Links }, /* Links */
35   148,        /* SizeOfImage; */
36 };
37
38 /***********************************************************************
39  *              EnumerateLoadedModules (IMAGEHLP.@)
40  */
41 BOOL WINAPI EnumerateLoadedModules(
42   HANDLE hProcess,
43   PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
44   PVOID UserContext)
45 {
46   FIXME("(0x%08x, %p, %p): stub\n",
47     hProcess, EnumLoadedModulesCallback, UserContext
48   );
49   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
50   return FALSE;
51 }
52
53 /***********************************************************************
54  *              GetTimestampForLoadedLibrary (IMAGEHLP.@)
55  */
56 DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE Module)
57 {
58   FIXME("(0x%08x): stub\n", Module);
59   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
60   return 0;
61 }
62
63 /***********************************************************************
64  *              GetImageConfigInformation (IMAGEHLP.@)
65  */
66 BOOL WINAPI GetImageConfigInformation(
67   PLOADED_IMAGE LoadedImage,
68   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
69 {
70   FIXME("(%p, %p): stub\n",
71     LoadedImage, ImageConfigInformation
72   );
73   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
74   return FALSE;
75 }
76
77 /***********************************************************************
78  *              GetImageUnusedHeaderBytes (IMAGEHLP.@)
79  */
80 DWORD WINAPI GetImageUnusedHeaderBytes(
81   PLOADED_IMAGE LoadedImage,
82   LPDWORD SizeUnusedHeaderBytes)
83 {
84   FIXME("(%p, %p): stub\n",
85     LoadedImage, SizeUnusedHeaderBytes
86   );
87   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
88   return 0;
89 }
90
91 /***********************************************************************
92  *              ImageDirectoryEntryToData (IMAGEHLP.@)
93  */
94 PVOID WINAPI ImageDirectoryEntryToData(
95   PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size)
96 {
97   FIXME("(%p, %d, %hd, %p): stub\n",
98     Base, MappedAsImage, DirectoryEntry, Size
99   );
100   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
101   return NULL;
102 }
103
104 /***********************************************************************
105  *              ImageLoad (IMAGEHLP.@)
106  */
107 PLOADED_IMAGE WINAPI ImageLoad(LPSTR DllName, LPSTR DllPath)
108 {
109   PLOADED_IMAGE pLoadedImage = 
110     HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE));
111   return pLoadedImage;
112 }
113
114 /***********************************************************************
115  *              ImageNtHeader (IMAGEHLP.@)
116  */
117 PIMAGE_NT_HEADERS WINAPI ImageNtHeader(PVOID Base)
118 {
119   return (PIMAGE_NT_HEADERS)
120     ((LPBYTE) Base + ((PIMAGE_DOS_HEADER) Base)->e_lfanew);
121 }
122
123 /***********************************************************************
124  *              ImageRvaToSection (IMAGEHLP.@)
125  */
126 PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(
127   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva)
128 {
129   FIXME("(%p, %p, %ld): stub\n", NtHeaders, Base, Rva);
130   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
131   return NULL;
132 }
133
134 /***********************************************************************
135  *              ImageRvaToVa (IMAGEHLP.@)
136  */
137 PVOID WINAPI ImageRvaToVa(
138   PIMAGE_NT_HEADERS NtHeaders, PVOID Base, ULONG Rva,
139   PIMAGE_SECTION_HEADER *LastRvaSection)
140 {
141   FIXME("(%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  *              ImageUnload (IMAGEHLP.@)
150  */
151 BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
152 {
153   LIST_ENTRY *pCurrent, *pFind;
154   if(!IMAGEHLP_pFirstLoadedImage || !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_pFirstLoadedImage->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_pFirstLoadedImage = pCurrent->Flink?CONTAINING_RECORD(
177       pCurrent->Flink, LOADED_IMAGE, Links):NULL;
178
179   if(pCurrent->Flink)
180     pCurrent->Flink->Blink = pCurrent->Blink;
181   else
182     IMAGEHLP_pLastLoadedImage = pCurrent->Blink?CONTAINING_RECORD(
183       pCurrent->Blink, LOADED_IMAGE, Links):NULL;
184
185   return FALSE;
186 }
187
188 /***********************************************************************
189  *              MapAndLoad (IMAGEHLP.@)
190  */
191 BOOL WINAPI MapAndLoad(
192   LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
193   BOOL bDotDll, BOOL bReadOnly)
194 {
195   CHAR szFileName[MAX_PATH];
196   HANDLE hFile = (HANDLE) NULL;
197   HANDLE hFileMapping = (HANDLE) NULL;
198   HMODULE hModule = (HMODULE) NULL;
199   PIMAGE_NT_HEADERS 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_pFirstLoadedImage) */
205   if(!(hFile = CreateFileA(
206     szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
207     NULL, OPEN_EXISTING, 0, (HANDLE) NULL)))
208     {
209       SetLastError(ERROR_FILE_NOT_FOUND);
210       goto Error;
211     }
212
213   if(!(hFileMapping = CreateFileMappingA(
214     hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL)))
215     {
216       DWORD dwLastError = GetLastError();
217       WARN("CreateFileMapping: Error = %ld\n", dwLastError);
218       SetLastError(dwLastError);
219       goto Error;
220     }
221   CloseHandle(hFile);
222   hFile = (HANDLE) NULL;
223
224   if(!(hModule = (HMODULE) MapViewOfFile(
225     hFileMapping, FILE_MAP_READ, 0, 0, 0)))
226     {
227       DWORD dwLastError = GetLastError();
228       WARN("MapViewOfFile: Error = %ld\n", dwLastError);
229       SetLastError(dwLastError);
230       goto Error;
231     }
232
233   CloseHandle(hFileMapping);
234   hFileMapping=(HANDLE) NULL;
235
236   pLoadedImage = (PLOADED_IMAGE) HeapAlloc(
237     IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)
238   );
239
240   pNtHeader = ImageNtHeader((PVOID) hModule);
241
242   pLoadedImage->ModuleName = HeapAlloc(IMAGEHLP_hHeap, 0, strlen(pszDllPath)+1); /* FIXME: Correct? */
243   strcpy( pLoadedImage->ModuleName, pszDllPath );
244   pLoadedImage->hFile = hFile;
245   pLoadedImage->MappedAddress = (PUCHAR) hModule;
246   pLoadedImage->FileHeader = pNtHeader;
247   pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
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_pLastLoadedImage->Links;
264   if(IMAGEHLP_pLastLoadedImage)
265     IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
266   IMAGEHLP_pLastLoadedImage = pLoadedImage;
267   if(!IMAGEHLP_pFirstLoadedImage)
268     IMAGEHLP_pFirstLoadedImage = 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  *              SetImageConfigInformation (IMAGEHLP.@)
284  */
285 BOOL WINAPI SetImageConfigInformation(
286   PLOADED_IMAGE LoadedImage,
287   PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
288 {
289   FIXME("(%p, %p): stub\n",
290     LoadedImage, ImageConfigInformation
291   );
292   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
293   return FALSE;
294 }
295
296 /***********************************************************************
297  *              UnMapAndLoad (IMAGEHLP.@)
298  */
299 BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage)
300 {
301   FIXME("(%p): stub\n", LoadedImage);
302   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
303   return FALSE;
304 }
305
306