|
|
//----------------------------------------------------------------------------
//
// Image information.
//
// Copyright (C) Microsoft Corporation, 2001-2002.
//
//----------------------------------------------------------------------------
#ifndef __IMAGE_HPP__
#define __IMAGE_HPP__
#define UNKNOWN_IMAGE_NAME "Unknown_Module"
enum IMAGE_SYM_STATE { ISS_UNKNOWN, ISS_MATCHED, ISS_MISMATCHED_SYMBOLS, ISS_UNKNOWN_TIMESTAMP, ISS_UNKNOWN_CHECKSUM, ISS_BAD_CHECKSUM };
enum INAME { INAME_IMAGE_PATH, INAME_IMAGE_PATH_TAIL, INAME_MODULE, };
// Special value meaning all images for some functions which
// accept image base qualifiers.
#define IMAGE_BASE_ALL ((ULONG64)-1)
struct MODULE_ALIAS_LIST { ULONG Length; PCSTR* Aliases; PCSTR BaseModule; };
enum { MODALIAS_KERNEL, MODALIAS_HAL, MODALIAS_KDCOM, MODALIAS_COUNT };
extern MODULE_ALIAS_LIST g_AliasLists[];
MODULE_ALIAS_LIST* FindModuleAliasList(PCSTR ImageName, PBOOL NameInList);
//----------------------------------------------------------------------------
//
// ImageInfo.
//
//----------------------------------------------------------------------------
#define MAX_MODULE 64
class ImageInfo { public: ImageInfo(ProcessInfo* Process, PSTR ImagePath, ULONG64 Base, BOOL Link); ~ImageInfo(void);
ProcessInfo* m_Process; ImageInfo* m_Next; ULONG m_Linked:1; ULONG m_Unloaded:1; ULONG m_FileIsDemandMapped:1; ULONG m_MapAlreadyFailed:1; ULONG m_CorImage:1; ULONG m_UserMode:1; HANDLE m_File; DWORD64 m_BaseOfImage; DWORD m_SizeOfImage; DWORD m_CheckSum; DWORD m_TimeDateStamp; IMAGE_SYM_STATE m_SymState; CHAR m_ModuleName[MAX_MODULE]; CHAR m_OriginalModuleName[MAX_MODULE]; CHAR m_ImagePath[MAX_IMAGE_PATH]; // Executable image mapping information for images
// mapped with minidumps.
CHAR m_MappedImagePath[MAX_IMAGE_PATH]; PVOID m_MappedImageBase; class MappedMemoryMap* m_MemMap; ULONG m_TlsIndex; ULONG m_MachineType; void DeleteResources(BOOL FullDelete); BOOL LoadExecutableImageMemory(MappedMemoryMap* MemMap, BOOL Verbose); void UnloadExecutableImageMemory(void); BOOL DemandLoadImageMemory(BOOL CheckIncomplete, BOOL Verbose);
HRESULT GetTlsIndex(void); ULONG GetMachineTypeFromHeader(void); ULONG CvRegToMachine(CV_HREG_e CvReg);
void OutputVersionInformation(void);
void ValidateSymbolLoad(PIMAGEHLP_DEFERRED_SYMBOL_LOAD64 DefLoad);
HRESULT FindSysAssert(ULONG64 Offset, PSTR FileName, ULONG FileNameChars, PULONG Line, PSTR AssertText, ULONG AssertTextChars); ULONG GetMachineType(void) { if (m_MachineType != IMAGE_FILE_MACHINE_UNKNOWN) { return m_MachineType; } else { return GetMachineTypeFromHeader(); } }
void ReloadSymbols(void); void FillModuleParameters(PDEBUG_MODULE_PARAMETERS Params);
private: BOOL MapImageRegion(MappedMemoryMap* MemMap, PVOID FileMapping, ULONG Rva, ULONG Size, ULONG RawDataOffset, BOOL AllowOverlap); };
PSTR UnknownImageName(ULONG64 ImageBase, PSTR Buffer, ULONG BufferChars); PSTR ValidateImagePath(PSTR ImagePath, ULONG ImagePathChars, ULONG64 ImageBase, PSTR AnsiBuffer, ULONG AnsiBufferChars); PSTR ConvertAndValidateImagePathW(PWSTR ImagePath, ULONG ImagePathChars, ULONG64 ImageBase, PSTR AnsiBuffer, ULONG AnsiBufferChars); PSTR PrepareImagePath(PSTR ImagePath);
PVOID FindImageFile(IN ProcessInfo* Process, IN PCSTR ImagePath, IN ULONG SizeOfImage, IN ULONG CheckSum, IN ULONG TimeDateStamp, OUT HANDLE* FileHandle, OUT PSTR MappedImagePath);
BOOL DemandLoadReferencedImageMemory(ProcessInfo* Process, ULONG64 Addr, ULONG Size);
BOOL GetModnameFromImage(ProcessInfo* Process, ULONG64 BaseOfDll, HANDLE File, LPSTR Name, ULONG NameSize, BOOL SearchExportFirst);
BOOL GetHeaderInfo(IN ProcessInfo* Process, IN ULONG64 BaseOfDll, OUT LPDWORD CheckSum, OUT LPDWORD TimeDateStamp, OUT LPDWORD SizeOfImage);
#endif // #ifndef __IMAGE_HPP__
|