📄 modify.c
字号:
OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;
/* Check if we have enough space */
DPRINT("Calculating Space\n");
FirstFreeByte = GetImageUnusedHeaderBytes(File, &VirtBytesFree);
HeaderBytesFree = File->Sections->VirtualAddress -
OptionalHeader->SizeOfHeaders + VirtBytesFree;
PhysBytesFree = File->Sections->PointerToRawData -
OptionalHeader->SizeOfHeaders + VirtBytesFree;
/* Check if we overflowed */
if (BoundImportTableSize > VirtBytesFree)
{
/* Check if we have no space a tall */
if (BoundImportTableSize > HeaderBytesFree)
{
DPRINT1("Not enough Space\n");
return; /* Fail...not enough space */
}
/* Check if we have space on disk to enlarge it */
if (BoundImportTableSize <= PhysBytesFree)
{
/* We have enough NULLs to add it, simply enlarge header data */
DPRINT("Header Recalculation\n");
OptionalHeader->SizeOfHeaders = OptionalHeader->SizeOfHeaders -
VirtBytesFree +
BoundImportTableSize +
((OptionalHeader->FileAlignment - 1) &
~(OptionalHeader->FileAlignment - 1));
}
else
{
/* Resize the Headers */
DPRINT1("UNIMPLEMENTED: Header Resizing\n");
/* Recalculate Headers */
FileHeader = &File->FileHeader->FileHeader;
OptionalHeader = &File->FileHeader->OptionalHeader;
}
}
/* Set Bound Import Table Data */
OptionalHeader->DataDirectory
[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = FirstFreeByte;
OptionalHeader->DataDirectory
[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = BoundImportTableSize;
/* Copy the Bound Import Table */
DPRINT("Copying Bound Import Table\n");
RtlCopyMemory(File->MappedAddress + FirstFreeByte,
BoundImportTable,
BoundImportTableSize);
/* Free the data */
HeapFree(IMAGEHLP_hHeap, 0, BoundImportTable);
}
}
/***********************************************************************
* BindImageEx (IMAGEHLP.@)
*/
BOOL IMAGEAPI BindImageEx(
DWORD Flags, LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath,
PIMAGEHLP_STATUS_ROUTINE StatusRoutine)
{
LOADED_IMAGE FileData;
PLOADED_IMAGE File;
PIMAGE_FILE_HEADER FileHeader;
PIMAGE_OPTIONAL_HEADER32 OptionalHeader;
ULONG CheckSum, HeaderCheckSum, OldChecksum;
SYSTEMTIME SystemTime;
FILETIME LastWriteTime;
BOOLEAN UpdateImage;
DWORD DataSize;
DPRINT("BindImageEx Called for: %s \n", ImageName);
/* Set and Clear Buffer */
File = &FileData;
RtlZeroMemory(File, sizeof(*File));
/* Request Image Data */
if (MapAndLoad(ImageName, DllPath, File, TRUE, FALSE))
{
/* Write the image's name */
DPRINT("Image Mapped and Loaded\n");
File->ModuleName = ImageName;
/* Check if the image is valid and if it should be bound */
if ((File->FileHeader) &&
((Flags & BIND_ALL_IMAGES) || (!File->fSystemImage)))
{
/* Get the optional header */
FileHeader = &File->FileHeader->FileHeader;
OptionalHeader = &File->FileHeader->OptionalHeader;
/* Check if this image should be bound */
if (OptionalHeader->DllCharacteristics &
IMAGE_DLLCHARACTERISTICS_NO_BIND)
{
/* Don't bind it */
goto Skip;
}
/* Check if the image has security data */
if ((ImageDirectoryEntryToData(File->MappedAddress,
FALSE,
IMAGE_DIRECTORY_ENTRY_SECURITY,
&DataSize)) || DataSize)
{
/* It does, skip it */
goto Skip;
}
/* Read Import Table */
BindpWalkAndProcessImports(File, DllPath, &UpdateImage);
/* Check if we need to update the image */
if ((UpdateImage) && (File->hFile != INVALID_HANDLE_VALUE))
{
/* FIXME: Update symbols */
/* Update Checksum */
DPRINT("Binding Completed, getting Checksum\n");
OldChecksum = File->FileHeader->OptionalHeader.CheckSum;
CheckSumMappedFile(File->MappedAddress,
GetFileSize(File->hFile, NULL),
&HeaderCheckSum,
&CheckSum);
File->FileHeader->OptionalHeader.CheckSum = CheckSum;
/* Save Changes */
DPRINT("Saving Changes to file\n");
FlushViewOfFile(File->MappedAddress, File->SizeOfImage);
/* Save new Modified Time */
DPRINT("Setting time\n");
GetSystemTime(&SystemTime);
SystemTimeToFileTime(&SystemTime, &LastWriteTime);
SetFileTime(File->hFile, NULL, NULL, &LastWriteTime);
}
}
}
Skip:
/* Unmap the image */
UnmapViewOfFile(File->MappedAddress);
/* Close the handle if it's valid */
if (File->hFile != INVALID_HANDLE_VALUE) CloseHandle(File->hFile);
/* Unload all the images if we're not supposed to cache them */
if (!(Flags & BIND_CACHE_IMPORT_DLLS)) UnloadAllImages();
/* Return success */
DPRINT("Done\n");
return TRUE;
}
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
BOOL
IMAGEAPI
TouchFileTimes(HANDLE FileHandle,
LPSYSTEMTIME lpSystemTime)
{
FILETIME FileTime;
SYSTEMTIME SystemTime;
if(lpSystemTime == NULL)
{
GetSystemTime(&SystemTime);
lpSystemTime = &SystemTime;
}
return (SystemTimeToFileTime(lpSystemTime,
&FileTime) &&
SetFileTime(FileHandle,
NULL,
NULL,
&FileTime));
}
/***********************************************************************
* MapFileAndCheckSumA (IMAGEHLP.@)
*/
DWORD IMAGEAPI 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 IMAGEAPI 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 IMAGEAPI 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 IMAGEAPI 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 IMAGEAPI RemoveRelocations(PCHAR ImageName)
{
FIXME("(%p): stub\n", ImageName);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
}
/***********************************************************************
* SplitSymbols (IMAGEHLP.@)
*/
BOOL IMAGEAPI 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 IMAGEAPI 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 IMAGEAPI 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -