wintrust: Implement WintrustLoadFunctionPointers.
[wine] / dlls / imagehlp / modify.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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <stdarg.h>
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winreg.h"
26 #include "winternl.h"
27 #include "winerror.h"
28 #include "wine/debug.h"
29 #include "imagehlp.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
32
33 static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
34
35
36 /***********************************************************************
37  *              BindImage (IMAGEHLP.@)
38  */
39 BOOL WINAPI BindImage(
40   LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath)
41 {
42   return BindImageEx(0, ImageName, DllPath, SymbolPath, NULL);
43 }
44
45 /***********************************************************************
46  *              BindImageEx (IMAGEHLP.@)
47  */
48 BOOL WINAPI BindImageEx(
49   DWORD Flags, LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath,
50   PIMAGEHLP_STATUS_ROUTINE StatusRoutine)
51 {
52   FIXME("(%d, %s, %s, %s, %p): stub\n",
53     Flags, debugstr_a(ImageName), debugstr_a(DllPath),
54     debugstr_a(SymbolPath), StatusRoutine
55   );
56   return TRUE;
57 }
58
59
60 /***********************************************************************
61  *              CheckSum (internal)
62  */
63 static WORD CalcCheckSum(
64   DWORD StartValue, LPVOID BaseAddress, DWORD WordCount)
65 {
66    LPWORD Ptr;
67    DWORD Sum;
68    DWORD i;
69
70    Sum = StartValue;
71    Ptr = (LPWORD)BaseAddress;
72    for (i = 0; i < WordCount; i++)
73      {
74         Sum += *Ptr;
75         if (HIWORD(Sum) != 0)
76           {
77              Sum = LOWORD(Sum) + HIWORD(Sum);
78           }
79         Ptr++;
80      }
81
82    return (WORD)(LOWORD(Sum) + HIWORD(Sum));
83 }
84
85
86 /***********************************************************************
87  *              CheckSumMappedFile (IMAGEHLP.@)
88  */
89 PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
90   LPVOID BaseAddress, DWORD FileLength,
91   LPDWORD HeaderSum, LPDWORD CheckSum)
92 {
93   PIMAGE_NT_HEADERS Header;
94   DWORD CalcSum;
95   DWORD HdrSum;
96
97   FIXME("(%p, %d, %p, %p): stub\n",
98     BaseAddress, FileLength, HeaderSum, CheckSum
99   );
100
101   CalcSum = (DWORD)CalcCheckSum(0,
102                                 BaseAddress,
103                                 (FileLength + 1) / sizeof(WORD));
104
105   Header = RtlImageNtHeader(BaseAddress);
106   HdrSum = Header->OptionalHeader.CheckSum;
107
108   /* Subtract image checksum from calculated checksum. */
109   /* fix low word of checksum */
110   if (LOWORD(CalcSum) >= LOWORD(HdrSum))
111   {
112     CalcSum -= LOWORD(HdrSum);
113   }
114   else
115   {
116     CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1;
117   }
118
119    /* fix high word of checksum */
120   if (LOWORD(CalcSum) >= HIWORD(HdrSum))
121   {
122     CalcSum -= HIWORD(HdrSum);
123   }
124   else
125   {
126     CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1;
127   }
128
129   /* add file length */
130   CalcSum += FileLength;
131
132   *CheckSum = CalcSum;
133   *HeaderSum = Header->OptionalHeader.CheckSum;
134
135   return Header;
136 }
137
138 /***********************************************************************
139  *              MapFileAndCheckSumA (IMAGEHLP.@)
140  */
141 DWORD WINAPI MapFileAndCheckSumA(
142   LPSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum)
143 {
144   HANDLE hFile;
145   HANDLE hMapping;
146   LPVOID BaseAddress;
147   DWORD FileLength;
148
149   TRACE("(%s, %p, %p): stub\n",
150     debugstr_a(Filename), HeaderSum, CheckSum
151   );
152
153   hFile = CreateFileA(Filename,
154                       GENERIC_READ,
155                       FILE_SHARE_READ | FILE_SHARE_WRITE,
156                       NULL,
157                       OPEN_EXISTING,
158                       FILE_ATTRIBUTE_NORMAL,
159                       0);
160   if (hFile == INVALID_HANDLE_VALUE)
161   {
162     return CHECKSUM_OPEN_FAILURE;
163   }
164
165   hMapping = CreateFileMappingW(hFile,
166                                NULL,
167                                PAGE_READONLY,
168                                0,
169                                0,
170                                NULL);
171   if (hMapping == 0)
172   {
173     CloseHandle(hFile);
174     return CHECKSUM_MAP_FAILURE;
175   }
176
177   BaseAddress = MapViewOfFile(hMapping,
178                               FILE_MAP_READ,
179                               0,
180                               0,
181                               0);
182   if (BaseAddress == 0)
183   {
184     CloseHandle(hMapping);
185     CloseHandle(hFile);
186     return CHECKSUM_MAPVIEW_FAILURE;
187   }
188
189   FileLength = GetFileSize(hFile,
190                            NULL);
191
192   CheckSumMappedFile(BaseAddress,
193                      FileLength,
194                      HeaderSum,
195                      CheckSum);
196
197   UnmapViewOfFile(BaseAddress);
198   CloseHandle(hMapping);
199   CloseHandle(hFile);
200
201   return 0;
202 }
203
204 /***********************************************************************
205  *              MapFileAndCheckSumW (IMAGEHLP.@)
206  */
207 DWORD WINAPI MapFileAndCheckSumW(
208   LPWSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum)
209 {
210   HANDLE hFile;
211   HANDLE hMapping;
212   LPVOID BaseAddress;
213   DWORD FileLength;
214
215   TRACE("(%s, %p, %p): stub\n",
216     debugstr_w(Filename), HeaderSum, CheckSum
217   );
218
219   hFile = CreateFileW(Filename,
220                       GENERIC_READ,
221                       FILE_SHARE_READ | FILE_SHARE_WRITE,
222                       NULL,
223                       OPEN_EXISTING,
224                       FILE_ATTRIBUTE_NORMAL,
225                       0);
226   if (hFile == INVALID_HANDLE_VALUE)
227   {
228   return CHECKSUM_OPEN_FAILURE;
229   }
230
231   hMapping = CreateFileMappingW(hFile,
232                                NULL,
233                                PAGE_READONLY,
234                                0,
235                                0,
236                                NULL);
237   if (hMapping == 0)
238   {
239     CloseHandle(hFile);
240     return CHECKSUM_MAP_FAILURE;
241   }
242
243   BaseAddress = MapViewOfFile(hMapping,
244                               FILE_MAP_READ,
245                               0,
246                               0,
247                               0);
248   if (BaseAddress == 0)
249   {
250     CloseHandle(hMapping);
251     CloseHandle(hFile);
252     return CHECKSUM_MAPVIEW_FAILURE;
253   }
254
255   FileLength = GetFileSize(hFile,
256                            NULL);
257
258   CheckSumMappedFile(BaseAddress,
259                      FileLength,
260                      HeaderSum,
261                      CheckSum);
262
263   UnmapViewOfFile(BaseAddress);
264   CloseHandle(hMapping);
265   CloseHandle(hFile);
266
267   return 0;
268 }
269
270 /***********************************************************************
271  *              ReBaseImage (IMAGEHLP.@)
272  */
273 BOOL WINAPI ReBaseImage(
274   LPSTR CurrentImageName, LPSTR SymbolPath, BOOL fReBase,
275   BOOL fRebaseSysfileOk, BOOL fGoingDown, ULONG CheckImageSize,
276   ULONG *OldImageSize, ULONG *OldImageBase, ULONG *NewImageSize,
277   ULONG *NewImageBase, ULONG TimeStamp)
278 {
279   FIXME(
280     "(%s, %s, %d, %d, %d, %d, %p, %p, %p, %p, %d): stub\n",
281       debugstr_a(CurrentImageName),debugstr_a(SymbolPath), fReBase,
282       fRebaseSysfileOk, fGoingDown, CheckImageSize, OldImageSize,
283       OldImageBase, NewImageSize, NewImageBase, TimeStamp
284   );
285   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
286   return FALSE;
287 }
288
289 /***********************************************************************
290  *              RemovePrivateCvSymbolic (IMAGEHLP.@)
291  */
292 BOOL WINAPI RemovePrivateCvSymbolic(
293   PCHAR DebugData, PCHAR *NewDebugData, ULONG *NewDebugSize)
294 {
295   FIXME("(%p, %p, %p): stub\n",
296     DebugData, NewDebugData, NewDebugSize
297   );
298   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
299   return FALSE;
300 }
301
302 /***********************************************************************
303  *              RemoveRelocations (IMAGEHLP.@)
304  */
305 VOID WINAPI RemoveRelocations(PCHAR ImageName)
306 {
307   FIXME("(%p): stub\n", ImageName);
308   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
309 }
310
311 /***********************************************************************
312  *              SplitSymbols (IMAGEHLP.@)
313  */
314 BOOL WINAPI SplitSymbols(
315   LPSTR ImageName, LPSTR SymbolsPath,
316   LPSTR SymbolFilePath, DWORD Flags)
317 {
318   FIXME("(%s, %s, %s, %d): stub\n",
319     debugstr_a(ImageName), debugstr_a(SymbolsPath),
320     debugstr_a(SymbolFilePath), Flags
321   );
322   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
323   return FALSE;
324 }
325
326 /***********************************************************************
327  *              UpdateDebugInfoFile (IMAGEHLP.@)
328  */
329 BOOL WINAPI UpdateDebugInfoFile(
330   LPSTR ImageFileName, LPSTR SymbolPath,
331   LPSTR DebugFilePath, PIMAGE_NT_HEADERS NtHeaders)
332 {
333   FIXME("(%s, %s, %s, %p): stub\n",
334     debugstr_a(ImageFileName), debugstr_a(SymbolPath),
335     debugstr_a(DebugFilePath), NtHeaders
336   );
337   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
338   return FALSE;
339 }
340
341 /***********************************************************************
342  *              UpdateDebugInfoFileEx (IMAGEHLP.@)
343  */
344 BOOL WINAPI UpdateDebugInfoFileEx(
345   LPSTR ImageFileName, LPSTR SymbolPath, LPSTR DebugFilePath,
346   PIMAGE_NT_HEADERS NtHeaders, DWORD OldChecksum)
347 {
348   FIXME("(%s, %s, %s, %p, %d): stub\n",
349     debugstr_a(ImageFileName), debugstr_a(SymbolPath),
350     debugstr_a(DebugFilePath), NtHeaders, OldChecksum
351   );
352   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
353   return FALSE;
354 }