ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

modify.c
Go to the documentation of this file.
00001 /*
00002  *  IMAGEHLP library
00003  *
00004  *  Copyright 1998  Patrik Stridvall
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 
00021 #include <stdarg.h>
00022 
00023 #include "windef.h"
00024 #include "winbase.h"
00025 #include "winternl.h"
00026 #include "winerror.h"
00027 #include "wine/debug.h"
00028 #include "imagehlp.h"
00029 
00030 WINE_DEFAULT_DEBUG_CHANNEL(imagehlp);
00031 
00032 static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount);
00033 
00034 
00035 /***********************************************************************
00036  *      BindImage (IMAGEHLP.@)
00037  */
00038 BOOL WINAPI BindImage(
00039   PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath)
00040 {
00041   return BindImageEx(0, ImageName, DllPath, SymbolPath, NULL);
00042 }
00043 
00044 /***********************************************************************
00045  *      BindImageEx (IMAGEHLP.@)
00046  */
00047 BOOL WINAPI BindImageEx(
00048   DWORD Flags, PCSTR ImageName, PCSTR DllPath, PCSTR SymbolPath,
00049   PIMAGEHLP_STATUS_ROUTINE StatusRoutine)
00050 {
00051   FIXME("(%d, %s, %s, %s, %p): stub\n",
00052     Flags, debugstr_a(ImageName), debugstr_a(DllPath),
00053     debugstr_a(SymbolPath), StatusRoutine
00054   );
00055   return TRUE;
00056 }
00057 
00058 
00059 /***********************************************************************
00060  *      CheckSum (internal)
00061  */
00062 static WORD CalcCheckSum(
00063   DWORD StartValue, LPVOID BaseAddress, DWORD WordCount)
00064 {
00065    LPWORD Ptr;
00066    DWORD Sum;
00067    DWORD i;
00068 
00069    Sum = StartValue;
00070    Ptr = (LPWORD)BaseAddress;
00071    for (i = 0; i < WordCount; i++)
00072      {
00073     Sum += *Ptr;
00074     if (HIWORD(Sum) != 0)
00075       {
00076          Sum = LOWORD(Sum) + HIWORD(Sum);
00077       }
00078     Ptr++;
00079      }
00080 
00081    return (WORD)(LOWORD(Sum) + HIWORD(Sum));
00082 }
00083 
00084 
00085 /***********************************************************************
00086  *      CheckSumMappedFile (IMAGEHLP.@)
00087  */
00088 PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
00089   LPVOID BaseAddress, DWORD FileLength,
00090   LPDWORD HeaderSum, LPDWORD CheckSum)
00091 {
00092   IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress;
00093   PIMAGE_NT_HEADERS32 Header32;
00094   PIMAGE_NT_HEADERS64 Header64;
00095   DWORD *ChecksumFile;
00096   DWORD CalcSum;
00097   DWORD HdrSum;
00098 
00099   TRACE("(%p, %d, %p, %p)\n",
00100     BaseAddress, FileLength, HeaderSum, CheckSum
00101   );
00102 
00103   CalcSum = (DWORD)CalcCheckSum(0,
00104                 BaseAddress,
00105                 (FileLength + 1) / sizeof(WORD));
00106 
00107   if (dos->e_magic != IMAGE_DOS_SIGNATURE)
00108     return NULL;
00109 
00110   Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew);
00111 
00112   if (Header32->Signature != IMAGE_NT_SIGNATURE)
00113     return NULL;
00114 
00115   if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
00116     ChecksumFile = &Header32->OptionalHeader.CheckSum;
00117   else if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
00118   {
00119     Header64 = (IMAGE_NT_HEADERS64 *)Header32;
00120     ChecksumFile = &Header64->OptionalHeader.CheckSum;
00121   }
00122   else
00123     return NULL;
00124 
00125   HdrSum = *ChecksumFile;
00126 
00127   /* Subtract image checksum from calculated checksum. */
00128   /* fix low word of checksum */
00129   if (LOWORD(CalcSum) >= LOWORD(HdrSum))
00130   {
00131     CalcSum -= LOWORD(HdrSum);
00132   }
00133   else
00134   {
00135     CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1;
00136   }
00137 
00138    /* fix high word of checksum */
00139   if (LOWORD(CalcSum) >= HIWORD(HdrSum))
00140   {
00141     CalcSum -= HIWORD(HdrSum);
00142   }
00143   else
00144   {
00145     CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1;
00146   }
00147 
00148   /* add file length */
00149   CalcSum += FileLength;
00150 
00151   *CheckSum = CalcSum;
00152   *HeaderSum = *ChecksumFile;
00153 
00154   return (PIMAGE_NT_HEADERS) Header32;
00155 }
00156 
00157 /***********************************************************************
00158  *      MapFileAndCheckSumA (IMAGEHLP.@)
00159  */
00160 DWORD WINAPI MapFileAndCheckSumA(
00161   PCSTR Filename, PDWORD HeaderSum, PDWORD CheckSum)
00162 {
00163   HANDLE hFile;
00164   HANDLE hMapping;
00165   LPVOID BaseAddress;
00166   DWORD FileLength;
00167 
00168   TRACE("(%s, %p, %p): stub\n",
00169     debugstr_a(Filename), HeaderSum, CheckSum
00170   );
00171 
00172   hFile = CreateFileA(Filename,
00173               GENERIC_READ,
00174               FILE_SHARE_READ | FILE_SHARE_WRITE,
00175               NULL,
00176               OPEN_EXISTING,
00177               FILE_ATTRIBUTE_NORMAL,
00178               0);
00179   if (hFile == INVALID_HANDLE_VALUE)
00180   {
00181     return CHECKSUM_OPEN_FAILURE;
00182   }
00183 
00184   hMapping = CreateFileMappingW(hFile,
00185                    NULL,
00186                    PAGE_READONLY,
00187                    0,
00188                    0,
00189                    NULL);
00190   if (hMapping == 0)
00191   {
00192     CloseHandle(hFile);
00193     return CHECKSUM_MAP_FAILURE;
00194   }
00195 
00196   BaseAddress = MapViewOfFile(hMapping,
00197                   FILE_MAP_READ,
00198                   0,
00199                   0,
00200                   0);
00201   if (BaseAddress == 0)
00202   {
00203     CloseHandle(hMapping);
00204     CloseHandle(hFile);
00205     return CHECKSUM_MAPVIEW_FAILURE;
00206   }
00207 
00208   FileLength = GetFileSize(hFile,
00209                NULL);
00210 
00211   CheckSumMappedFile(BaseAddress,
00212              FileLength,
00213              HeaderSum,
00214              CheckSum);
00215 
00216   UnmapViewOfFile(BaseAddress);
00217   CloseHandle(hMapping);
00218   CloseHandle(hFile);
00219 
00220   return 0;
00221 }
00222 
00223 /***********************************************************************
00224  *      MapFileAndCheckSumW (IMAGEHLP.@)
00225  */
00226 DWORD WINAPI MapFileAndCheckSumW(
00227   PCWSTR Filename, PDWORD HeaderSum, PDWORD CheckSum)
00228 {
00229   HANDLE hFile;
00230   HANDLE hMapping;
00231   LPVOID BaseAddress;
00232   DWORD FileLength;
00233 
00234   TRACE("(%s, %p, %p): stub\n",
00235     debugstr_w(Filename), HeaderSum, CheckSum
00236   );
00237 
00238   hFile = CreateFileW(Filename,
00239               GENERIC_READ,
00240               FILE_SHARE_READ | FILE_SHARE_WRITE,
00241               NULL,
00242               OPEN_EXISTING,
00243               FILE_ATTRIBUTE_NORMAL,
00244               0);
00245   if (hFile == INVALID_HANDLE_VALUE)
00246   {
00247   return CHECKSUM_OPEN_FAILURE;
00248   }
00249 
00250   hMapping = CreateFileMappingW(hFile,
00251                    NULL,
00252                    PAGE_READONLY,
00253                    0,
00254                    0,
00255                    NULL);
00256   if (hMapping == 0)
00257   {
00258     CloseHandle(hFile);
00259     return CHECKSUM_MAP_FAILURE;
00260   }
00261 
00262   BaseAddress = MapViewOfFile(hMapping,
00263                   FILE_MAP_READ,
00264                   0,
00265                   0,
00266                   0);
00267   if (BaseAddress == 0)
00268   {
00269     CloseHandle(hMapping);
00270     CloseHandle(hFile);
00271     return CHECKSUM_MAPVIEW_FAILURE;
00272   }
00273 
00274   FileLength = GetFileSize(hFile,
00275                NULL);
00276 
00277   CheckSumMappedFile(BaseAddress,
00278              FileLength,
00279              HeaderSum,
00280              CheckSum);
00281 
00282   UnmapViewOfFile(BaseAddress);
00283   CloseHandle(hMapping);
00284   CloseHandle(hFile);
00285 
00286   return 0;
00287 }
00288 
00289 /***********************************************************************
00290  *      ReBaseImage (IMAGEHLP.@)
00291  */
00292 BOOL WINAPI ReBaseImage(
00293   PCSTR CurrentImageName, PCSTR SymbolPath, BOOL fReBase,
00294   BOOL fRebaseSysfileOk, BOOL fGoingDown, ULONG CheckImageSize,
00295   ULONG *OldImageSize, ULONG_PTR *OldImageBase, ULONG *NewImageSize,
00296   ULONG_PTR *NewImageBase, ULONG TimeStamp)
00297 {
00298   FIXME(
00299     "(%s, %s, %d, %d, %d, %d, %p, %p, %p, %p, %d): stub\n",
00300       debugstr_a(CurrentImageName),debugstr_a(SymbolPath), fReBase,
00301       fRebaseSysfileOk, fGoingDown, CheckImageSize, OldImageSize,
00302       OldImageBase, NewImageSize, NewImageBase, TimeStamp
00303   );
00304   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00305   return FALSE;
00306 }
00307 
00308 /***********************************************************************
00309  *      RemovePrivateCvSymbolic (IMAGEHLP.@)
00310  */
00311 BOOL WINAPI RemovePrivateCvSymbolic(
00312   PCHAR DebugData, PCHAR *NewDebugData, ULONG *NewDebugSize)
00313 {
00314   FIXME("(%p, %p, %p): stub\n",
00315     DebugData, NewDebugData, NewDebugSize
00316   );
00317   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00318   return FALSE;
00319 }
00320 
00321 /***********************************************************************
00322  *      RemoveRelocations (IMAGEHLP.@)
00323  */
00324 VOID WINAPI RemoveRelocations(PCHAR ImageName)
00325 {
00326   FIXME("(%p): stub\n", ImageName);
00327   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00328 }
00329 
00330 /***********************************************************************
00331  *      SplitSymbols (IMAGEHLP.@)
00332  */
00333 BOOL WINAPI SplitSymbols(
00334   PSTR ImageName, PCSTR SymbolsPath,
00335   PSTR SymbolFilePath, ULONG Flags)
00336 {
00337   FIXME("(%s, %s, %s, %d): stub\n",
00338     debugstr_a(ImageName), debugstr_a(SymbolsPath),
00339     debugstr_a(SymbolFilePath), Flags
00340   );
00341   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00342   return FALSE;
00343 }
00344 
00345 /***********************************************************************
00346  *      UpdateDebugInfoFile (IMAGEHLP.@)
00347  */
00348 BOOL WINAPI UpdateDebugInfoFile(
00349   PCSTR ImageFileName, PCSTR SymbolPath,
00350   PSTR DebugFilePath, PIMAGE_NT_HEADERS32 NtHeaders)
00351 {
00352   FIXME("(%s, %s, %s, %p): stub\n",
00353     debugstr_a(ImageFileName), debugstr_a(SymbolPath),
00354     debugstr_a(DebugFilePath), NtHeaders
00355   );
00356   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00357   return FALSE;
00358 }
00359 
00360 /***********************************************************************
00361  *      UpdateDebugInfoFileEx (IMAGEHLP.@)
00362  */
00363 BOOL WINAPI UpdateDebugInfoFileEx(
00364   PCSTR ImageFileName, PCSTR SymbolPath, PSTR DebugFilePath,
00365   PIMAGE_NT_HEADERS32 NtHeaders, DWORD OldChecksum)
00366 {
00367   FIXME("(%s, %s, %s, %p, %d): stub\n",
00368     debugstr_a(ImageFileName), debugstr_a(SymbolPath),
00369     debugstr_a(DebugFilePath), NtHeaders, OldChecksum
00370   );
00371   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00372   return FALSE;
00373 }

Generated on Fri May 25 2012 04:22:06 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.