| /* |
| * IMAGEHLP library |
| * |
| * Copyright 1998 Patrik Stridvall |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include "winbase.h" |
| #include "winerror.h" |
| #include "windef.h" |
| #include "wine/debug.h" |
| #include "imagehlp.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(imagehlp); |
| |
| static WORD CalcCheckSum(DWORD StartValue, LPVOID BaseAddress, DWORD WordCount); |
| |
| |
| /*********************************************************************** |
| * BindImage (IMAGEHLP.@) |
| */ |
| BOOL WINAPI BindImage( |
| LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath) |
| { |
| return BindImageEx(0, ImageName, DllPath, SymbolPath, NULL); |
| } |
| |
| /*********************************************************************** |
| * BindImageEx (IMAGEHLP.@) |
| */ |
| BOOL WINAPI BindImageEx( |
| DWORD Flags, LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath, |
| PIMAGEHLP_STATUS_ROUTINE StatusRoutine) |
| { |
| FIXME("(%ld, %s, %s, %s, %p): stub\n", |
| Flags, debugstr_a(ImageName), debugstr_a(DllPath), |
| debugstr_a(SymbolPath), StatusRoutine |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| |
| /*********************************************************************** |
| * CheckSum (internal) |
| */ |
| static WORD CalcCheckSum( |
| DWORD StartValue, LPVOID BaseAddress, DWORD WordCount) |
| { |
| LPWORD Ptr; |
| DWORD Sum; |
| DWORD i; |
| |
| Sum = StartValue; |
| Ptr = (LPWORD)BaseAddress; |
| for (i = 0; i < WordCount; i++) |
| { |
| Sum += *Ptr; |
| if (HIWORD(Sum) != 0) |
| { |
| Sum = LOWORD(Sum) + HIWORD(Sum); |
| } |
| Ptr++; |
| } |
| |
| return (WORD)(LOWORD(Sum) + HIWORD(Sum)); |
| } |
| |
| |
| /*********************************************************************** |
| * CheckSumMappedFile (IMAGEHLP.@) |
| */ |
| PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile( |
| LPVOID BaseAddress, DWORD FileLength, |
| LPDWORD HeaderSum, LPDWORD CheckSum) |
| { |
| PIMAGE_NT_HEADERS Header; |
| DWORD CalcSum; |
| DWORD HdrSum; |
| |
| FIXME("(%p, %ld, %p, %p): stub\n", |
| BaseAddress, FileLength, HeaderSum, CheckSum |
| ); |
| |
| CalcSum = (DWORD)CalcCheckSum(0, |
| BaseAddress, |
| (FileLength + 1) / sizeof(WORD)); |
| |
| Header = ImageNtHeader(BaseAddress); |
| HdrSum = Header->OptionalHeader.CheckSum; |
| |
| /* Subtract image checksum from calculated checksum. */ |
| /* fix low word of checksum */ |
| if (LOWORD(CalcSum) >= LOWORD(HdrSum)) |
| { |
| CalcSum -= LOWORD(HdrSum); |
| } |
| else |
| { |
| CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1; |
| } |
| |
| /* fix high word of checksum */ |
| if (LOWORD(CalcSum) >= HIWORD(HdrSum)) |
| { |
| CalcSum -= HIWORD(HdrSum); |
| } |
| else |
| { |
| CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1; |
| } |
| |
| /* add file length */ |
| CalcSum += FileLength; |
| |
| *CheckSum = CalcSum; |
| *HeaderSum = Header->OptionalHeader.CheckSum; |
| |
| return Header; |
| } |
| |
| /*********************************************************************** |
| * MapFileAndCheckSumA (IMAGEHLP.@) |
| */ |
| DWORD WINAPI MapFileAndCheckSumA( |
| LPSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum) |
| { |
| HANDLE hFile; |
| HANDLE hMapping; |
| LPVOID BaseAddress; |
| DWORD FileLength; |
| |
| TRACE("(%s, %p, %p): stub\n", |
| debugstr_a(Filename), HeaderSum, CheckSum |
| ); |
| |
| hFile = CreateFileA(Filename, |
| GENERIC_READ, |
| FILE_SHARE_READ | FILE_SHARE_WRITE, |
| NULL, |
| OPEN_EXISTING, |
| FILE_ATTRIBUTE_NORMAL, |
| 0); |
| if (hFile == INVALID_HANDLE_VALUE) |
| { |
| return CHECKSUM_OPEN_FAILURE; |
| } |
| |
| hMapping = CreateFileMappingW(hFile, |
| NULL, |
| PAGE_READONLY, |
| 0, |
| 0, |
| NULL); |
| if (hMapping == 0) |
| { |
| CloseHandle(hFile); |
| return CHECKSUM_MAP_FAILURE; |
| } |
| |
| BaseAddress = MapViewOfFile(hMapping, |
| FILE_MAP_READ, |
| 0, |
| 0, |
| 0); |
| if (hMapping == 0) |
| { |
| CloseHandle(hMapping); |
| CloseHandle(hFile); |
| return CHECKSUM_MAPVIEW_FAILURE; |
| } |
| |
| FileLength = GetFileSize(hFile, |
| NULL); |
| |
| CheckSumMappedFile(BaseAddress, |
| FileLength, |
| HeaderSum, |
| CheckSum); |
| |
| UnmapViewOfFile(BaseAddress); |
| CloseHandle(hMapping); |
| CloseHandle(hFile); |
| |
| return 0; |
| } |
| |
| /*********************************************************************** |
| * MapFileAndCheckSumW (IMAGEHLP.@) |
| */ |
| DWORD WINAPI MapFileAndCheckSumW( |
| LPWSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum) |
| { |
| HANDLE hFile; |
| HANDLE hMapping; |
| LPVOID BaseAddress; |
| DWORD FileLength; |
| |
| TRACE("(%s, %p, %p): stub\n", |
| debugstr_w(Filename), HeaderSum, CheckSum |
| ); |
| |
| hFile = CreateFileW(Filename, |
| GENERIC_READ, |
| FILE_SHARE_READ | FILE_SHARE_WRITE, |
| NULL, |
| OPEN_EXISTING, |
| FILE_ATTRIBUTE_NORMAL, |
| 0); |
| if (hFile == INVALID_HANDLE_VALUE) |
| { |
| return CHECKSUM_OPEN_FAILURE; |
| } |
| |
| hMapping = CreateFileMappingW(hFile, |
| NULL, |
| PAGE_READONLY, |
| 0, |
| 0, |
| NULL); |
| if (hMapping == 0) |
| { |
| CloseHandle(hFile); |
| return CHECKSUM_MAP_FAILURE; |
| } |
| |
| BaseAddress = MapViewOfFile(hMapping, |
| FILE_MAP_READ, |
| 0, |
| 0, |
| 0); |
| if (hMapping == 0) |
| { |
| CloseHandle(hMapping); |
| CloseHandle(hFile); |
| return CHECKSUM_MAPVIEW_FAILURE; |
| } |
| |
| FileLength = GetFileSize(hFile, |
| NULL); |
| |
| CheckSumMappedFile(BaseAddress, |
| FileLength, |
| HeaderSum, |
| CheckSum); |
| |
| UnmapViewOfFile(BaseAddress); |
| CloseHandle(hMapping); |
| CloseHandle(hFile); |
| |
| return 0; |
| } |
| |
| /*********************************************************************** |
| * ReBaseImage (IMAGEHLP.@) |
| */ |
| BOOL WINAPI ReBaseImage( |
| LPSTR CurrentImageName, LPSTR SymbolPath, BOOL fReBase, |
| BOOL fRebaseSysfileOk, BOOL fGoingDown, ULONG CheckImageSize, |
| ULONG *OldImageSize, ULONG *OldImageBase, ULONG *NewImageSize, |
| ULONG *NewImageBase, ULONG TimeStamp) |
| { |
| FIXME( |
| "(%s, %s, %d, %d, %d, %ld, %p, %p, %p, %p, %ld): stub\n", |
| debugstr_a(CurrentImageName),debugstr_a(SymbolPath), fReBase, |
| fRebaseSysfileOk, fGoingDown, CheckImageSize, OldImageSize, |
| OldImageBase, NewImageSize, NewImageBase, TimeStamp |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * RemovePrivateCvSymbolic (IMAGEHLP.@) |
| */ |
| BOOL WINAPI RemovePrivateCvSymbolic( |
| PCHAR DebugData, PCHAR *NewDebugData, ULONG *NewDebugSize) |
| { |
| FIXME("(%p, %p, %p): stub\n", |
| DebugData, NewDebugData, NewDebugSize |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * RemoveRelocations (IMAGEHLP.@) |
| */ |
| VOID WINAPI RemoveRelocations(PCHAR ImageName) |
| { |
| FIXME("(%p): stub\n", ImageName); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| } |
| |
| /*********************************************************************** |
| * SplitSymbols (IMAGEHLP.@) |
| */ |
| BOOL WINAPI SplitSymbols( |
| LPSTR ImageName, LPSTR SymbolsPath, |
| LPSTR SymbolFilePath, DWORD Flags) |
| { |
| FIXME("(%s, %s, %s, %ld): stub\n", |
| debugstr_a(ImageName), debugstr_a(SymbolsPath), |
| debugstr_a(SymbolFilePath), Flags |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * UpdateDebugInfoFile (IMAGEHLP.@) |
| */ |
| BOOL WINAPI UpdateDebugInfoFile( |
| LPSTR ImageFileName, LPSTR SymbolPath, |
| LPSTR DebugFilePath, PIMAGE_NT_HEADERS NtHeaders) |
| { |
| FIXME("(%s, %s, %s, %p): stub\n", |
| debugstr_a(ImageFileName), debugstr_a(SymbolPath), |
| debugstr_a(DebugFilePath), NtHeaders |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * UpdateDebugInfoFileEx (IMAGEHLP.@) |
| */ |
| BOOL WINAPI UpdateDebugInfoFileEx( |
| LPSTR ImageFileName, LPSTR SymbolPath, LPSTR DebugFilePath, |
| PIMAGE_NT_HEADERS NtHeaders, DWORD OldChecksum) |
| { |
| FIXME("(%s, %s, %s, %p, %ld): stub\n", |
| debugstr_a(ImageFileName), debugstr_a(SymbolPath), |
| debugstr_a(DebugFilePath), NtHeaders, OldChecksum |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |