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