windows-nt/Source/XPSP1/NT/sdktools/checksym/moduleinfo.h
2020-09-26 16:20:57 +08:00

275 lines
12 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 2000
//
// File: moduleinfo.h
//
//--------------------------------------------------------------------------
// ModuleInfo.h: interface for the CModuleInfo class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MODULEINFO_H__0D2E8509_A01A_11D2_83A8_000000000000__INCLUDED_)
#define AFX_MODULEINFO_H__0D2E8509_A01A_11D2_83A8_000000000000__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef NO_STRICT
#ifndef STRICT
#define STRICT 1
#endif
#endif /* NO_STRICT */
#include <windows.h>
#include <tchar.h>
#include <time.h>
#include <stdlib.h>
#include "globals.h"
//
//#include "oemdbi.h"
//
// Bug MSINFO V4.1:655
#define PDB_LIBRARY
#pragma warning( push )
#pragma warning( disable : 4201 ) // Disable "nonstandard extension used : nameless struct/union" warning
#include "PDB.H"
#pragma warning( pop ) // Enable
const ULONG sigRSDS = 'SDSR';
const ULONG sigNB09 = '90BN';
const ULONG sigNB10 = '01BN';
const ULONG sigNB11 = '11BN';
// Forward declarations
//class CProgramOptions;
class CSymbolVerification;
class CFileData;
class CDmpFile;
class CModuleInfo
{
// Definition of Class Constants
enum { MAX_SEARCH_PATH_LEN=512 };
// CodeView Debug OMF signature. The signature at the end of the file is
// a negative offset from the end of the file to another signature. At
// the negative offset (base address) is another signature whose filepos
// field points to the first OMFDirHeader in a chain of directories.
// The NB05 signature is used by the link utility to indicated a completely
// unpacked file. The NB06 signature is used by ilink to indicate that the
// executable has had CodeView information from an incremental link appended
// to the executable. The NB08 signature is used by cvpack to indicate that
// the CodeView Debug OMF has been packed. CodeView will only process
// executables with the NB08 signature.
typedef struct OMFSignature
{
char Signature[4]; // "NBxx"
long filepos; // offset in file
};
typedef struct PDB_INFO
{
unsigned long sig;
unsigned long age;
char sz[_MAX_PATH];
};
//
// These types are likely to be defined in a header file I include later for the latest
// OEMDBI toolkit...
//
struct NB10I // NB10 debug info
{
DWORD nb10; // NB10
DWORD off; // offset, always 0
DWORD sig;
DWORD age;
};
struct RSDSI // RSDS debug info
{
DWORD rsds; // RSDS
GUID guidSig;
DWORD age;
};
public:
CModuleInfo();
virtual ~CModuleInfo();
bool GoodSymbolNotFound();
bool SetPEImageModuleName(LPTSTR tszNewModuleName);
bool SetPEImageModulePath(LPTSTR tszNewPEImageModulePath);
bool SetDebugDirectoryDBGPath(LPTSTR tszNewDebugDirectoryDBGPath);
bool SetPEDebugDirectoryPDBPath(LPTSTR tszNewDebugDirectoryPDBPath);
bool Initialize(CFileData * lpInputFile, CFileData * lpOutputFile, CDmpFile * lpDmpFile);
bool SetModulePath(LPTSTR tszModulePath);
bool VerifySymbols(CSymbolVerification * lpSymbolVerification);
static BOOL VerifyDBGFile(HANDLE hFileHandle, LPTSTR tszFileName, PVOID CallerData);
static BOOL VerifyPDBFile(HANDLE hFileHandle, LPTSTR tszFileName, PVOID CallerData);
bool OutputData(LPTSTR tszProcessName, DWORD iProcessID, unsigned int dwModuleNumber);
bool GetModuleInfo(LPTSTR tszModulePath, bool fDmpFile = false, DWORD64 dw64ModAddress = 0, bool fGetDataFromCSVFile = false);
LPTSTR GetModulePath();
enum SymbolModuleStatus { SYMBOL_NOT_FOUND, SYMBOL_MATCH, SYMBOL_POSSIBLE_MISMATCH, SYMBOL_INVALID_FORMAT, SYMBOL_NO_HELPER_DLL };
enum SymbolInformationForPEImage {SYMBOL_INFORMATION_UNKNOWN, SYMBOLS_NO, SYMBOLS_LOCAL, SYMBOLS_DBG, SYMBOLS_DBG_AND_PDB, SYMBOLS_PDB};
// INLINE Methods!
inline enum SymbolInformationForPEImage GetPESymbolInformation() { return m_enumPEImageSymbolStatus; };
inline enum SymbolModuleStatus GetDBGSymbolModuleStatus() { return m_enumDBGModuleStatus; };
inline enum SymbolModuleStatus GetPDBSymbolModuleStatus() { return m_enumPDBModuleStatus; };
inline DWORD GetRefCount() { return m_dwRefCount; };
inline DWORD AddRef() { return InterlockedIncrement((long *)&m_dwRefCount); };
inline bool IsDLL() { return (m_wCharacteristics & IMAGE_FILE_DLL) == IMAGE_FILE_DLL; };
inline DWORD GetPEImageTimeDateStamp() { return m_dwPEImageTimeDateStamp; };
inline DWORD GetPEImageSizeOfImage() { return m_dwPEImageSizeOfImage; };
inline LPTSTR GetPDBModulePath() { return m_tszPDBModuleFileSystemPath; };
inline LPTSTR GetDebugDirectoryPDBPath() { return (m_tszPEImageDebugDirectoryPDBPath == NULL) ? m_tszDBGDebugDirectoryPDBPath : m_tszPEImageDebugDirectoryPDBPath; };
inline DWORD GetReadPointer() { return m_dwCurrentReadPosition; };
inline LPTSTR SourceEnabledPEImage() { return ( (m_dwPEImageDebugDirectoryPDBFormatSpecifier == sigNB09) || (m_dwPEImageDebugDirectoryPDBFormatSpecifier == sigNB11) ) ? TEXT("(Source Enabled)") : TEXT(""); };
inline LPTSTR SourceEnabledDBGImage() { return ( (m_dwDBGDebugDirectoryPDBFormatSpecifier == sigNB09) || (m_dwDBGDebugDirectoryPDBFormatSpecifier == sigNB11) ) ? TEXT("(Source Enabled)") : TEXT(""); };
// return (m_dwPEImageDebugDirectoryOMAPtoSRCSize && m_dwPEImageDebugDirectoryOMAPfromSRCSize) || (m_dwDBGImageDebugDirectoryOMAPtoSRCSize && m_dwDBGImageDebugDirectoryOMAPfromSRCSize) ? TEXT("(Source Enabled)") : TEXT("");
inline LPTSTR SourceEnabledPDB() { return (m_dwPDBTotalBytesOfLineInformation && m_dwPDBTotalBytesOfSymbolInformation && m_dwPDBTotalSymbolTypesRange) ? TEXT("(Source Enabled)") : TEXT("");};
protected:
bool FSourceEnabledPdb(void);
enum VerificationLevels {IGNORE_BAD_CHECKSUM, IGNORE_NOTHING};
enum PEImageType {PEImageTypeUnknown, PE32, PE64};
DWORD m_dwCurrentReadPosition;
DWORD m_dwRefCount;
CFileData * m_lpInputFile;
CFileData * m_lpOutputFile;
CDmpFile * m_lpDmpFile;
// PE Image File Version Information
bool m_fPEImageFileVersionInfo;
LPTSTR m_tszPEImageFileVersionDescription;
LPTSTR m_tszPEImageFileVersionCompanyName;
LPTSTR m_tszPEImageFileVersionString;
DWORD m_dwPEImageFileVersionMS;
DWORD m_dwPEImageFileVersionLS;
LPTSTR m_tszPEImageProductVersionString;
DWORD m_dwPEImageProductVersionMS;
DWORD m_dwPEImageProductVersionLS;
// PE Image Properties
LPTSTR m_tszPEImageModuleName;
LPTSTR m_tszPEImageModuleFileSystemPath;
DWORD m_dwPEImageFileSize;
FILETIME m_ftPEImageFileTimeDateStamp;
DWORD m_dwPEImageCheckSum;
DWORD m_dwPEImageTimeDateStamp;
DWORD m_dwPEImageSizeOfImage; // New for SYMSRV support
PEImageType m_enumPEImageType;
DWORD64 m_dw64BaseAddress;
WORD m_wPEImageMachineArchitecture;
WORD m_wCharacteristics;
// PE Image has a reference to DBG file
SymbolInformationForPEImage m_enumPEImageSymbolStatus;
LPTSTR m_tszPEImageDebugDirectoryDBGPath;
// PE Image has internal symbols
DWORD m_dwPEImageDebugDirectoryCoffSize;
DWORD m_dwPEImageDebugDirectoryFPOSize;
DWORD m_dwPEImageDebugDirectoryCVSize;
DWORD m_dwPEImageDebugDirectoryOMAPtoSRCSize;
DWORD m_dwPEImageDebugDirectoryOMAPfromSRCSize;
// PE Image has a reference to PDB file...
LPTSTR m_tszPEImageDebugDirectoryPDBPath;
DWORD m_dwPEImageDebugDirectoryPDBFormatSpecifier; // NB10, RSDS, etc...
DWORD m_dwPEImageDebugDirectoryPDBAge;
DWORD m_dwPEImageDebugDirectoryPDBSignature;
LPTSTR m_tszPEImageDebugDirectoryPDBGuid;
// DBG File Information
SymbolModuleStatus m_enumDBGModuleStatus;
LPTSTR m_tszDBGModuleFileSystemPath; // Actual path
DWORD m_dwDBGTimeDateStamp;
DWORD m_dwDBGCheckSum;
DWORD m_dwDBGSizeOfImage;
DWORD m_dwDBGImageDebugDirectoryCoffSize;
DWORD m_dwDBGImageDebugDirectoryFPOSize;
DWORD m_dwDBGImageDebugDirectoryCVSize;
DWORD m_dwDBGImageDebugDirectoryOMAPtoSRCSize;
DWORD m_dwDBGImageDebugDirectoryOMAPfromSRCSize;
// DBG File has a reference to a PDB file...
LPTSTR m_tszDBGDebugDirectoryPDBPath;
DWORD m_dwDBGDebugDirectoryPDBFormatSpecifier; // NB10, RSDS, etc...
DWORD m_dwDBGDebugDirectoryPDBAge;
DWORD m_dwDBGDebugDirectoryPDBSignature;
LPTSTR m_tszDBGDebugDirectoryPDBGuid;
// PDB File Information
SymbolModuleStatus m_enumPDBModuleStatus;
LPTSTR m_tszPDBModuleFileSystemPath;
DWORD m_dwPDBFormatSpecifier;
DWORD m_dwPDBSignature;
DWORD m_dwPDBAge;
LPTSTR m_tszPDBGuid;
DWORD m_dwPDBTotalBytesOfLineInformation;
DWORD m_dwPDBTotalBytesOfSymbolInformation;
DWORD m_dwPDBTotalSymbolTypesRange;
// Conversion routines...
LPTSTR SymbolInformationString(enum SymbolInformationForPEImage enumSymbolInformationForPEImage);
LPTSTR SymbolModuleStatusString(enum SymbolModuleStatus enumModuleStatus);
SymbolInformationForPEImage SymbolInformation(LPSTR szSymbolInformationString);
bool DoRead(bool fDmpFile, HANDLE hModuleHandle, LPVOID lpBuffer, DWORD cNumberOfBytesToRead);
ULONG SetReadPointer(bool fDmpFile, HANDLE hModuleHandle, LONG cbOffset, int iFrom);
bool GetModuleInfoFromCSVFile(LPTSTR tszModulePath);
bool GetModuleInfoFromPEImage(LPTSTR tszModulePath, const bool fDmpFile, const DWORD64 dw64ModAddress);
//
// Output Methods
//
bool OutputDataToStdout(DWORD dwModuleNumber);
bool OutputDataToStdoutThisModule();
bool OutputDataToStdoutModuleInfo(DWORD dwModuleNumber);
bool OutputDataToStdoutInternalSymbolInfo(DWORD dwCoffSize, DWORD dwFPOSize, DWORD dwCVSize, DWORD dwOMAPtoSRC, DWORD dwOMAPfromSRC);
bool OutputDataToStdoutDbgSymbolInfo(LPCTSTR tszModulePointerToDbg, DWORD dwTimeDateStamp, DWORD dwChecksum, DWORD dwSizeOfImage, LPCTSTR tszDbgComment = NULL, DWORD dwExpectedTimeDateStamp = 0, DWORD dwExpectedChecksum = 0, DWORD dwExpectedSizeOfImage = 0);
bool OutputDataToStdoutPdbSymbolInfo(DWORD dwPDBFormatSpecifier, LPTSTR tszModulePointerToPDB, DWORD dwPDBSignature, LPTSTR tszPDBGuid, DWORD dwPDBAge, LPCTSTR tszPdbComment = NULL);
bool OutputDataToFile(LPTSTR tszProcessName, DWORD iProcessID);
bool OutputFileTime(FILETIME ftFileTime, LPTSTR tszFileTime, int iFileTimeBufferSize);
bool fCheckPDBSignature(bool fDmpFile, HANDLE hModuleHandle, OMFSignature *pSig, PDB_INFO *ppdb);
bool LocatePdb(LPTSTR tszPDB, ULONG PdbAge, ULONG PdbSignature, LPTSTR tszSymbolPath, LPTSTR tszImageExt, bool fImagePathPassed);
bool GetPDBModuleFileUsingSymbolPath();
bool HandlePDBOpenValidateReturn(PDB * lpPdb, LPTSTR tszPDBLocal, EC ec);
bool ProcessDebugDirectory(const bool fPEImage, const bool fDmpFile, const HANDLE hModuleHandle, unsigned int iDebugDirectorySize, ULONG OffsetImageDebugDirectory);
bool ProcessDebugTypeCVDirectoryEntry(const bool fPEImage, const bool fDmpFile, const HANDLE hModuleHandle, const PIMAGE_DEBUG_DIRECTORY lpImageDebugDirectory);
bool ProcessDebugTypeFPODirectoryEntry(const bool fPEImage, const PIMAGE_DEBUG_DIRECTORY lpImageDebugDirectory);
bool ProcessDebugTypeCoffDirectoryEntry(const bool fPEImage, const PIMAGE_DEBUG_DIRECTORY lpImageDebugDirectory);
bool ProcessDebugTypeMiscDirectoryEntry(const bool fPEImage, const bool fDmpFile, const HANDLE hModuleHandle, const PIMAGE_DEBUG_DIRECTORY lpImageDebugDirectory);
bool ProcessDebugTypeOMAPDirectoryEntry(const bool fPEImage, const PIMAGE_DEBUG_DIRECTORY lpImageDebugDirectory);
bool ProcessPDBSourceInfo(PDB *lpPdb);
bool fValidDBGTimeDateStamp();
bool fValidDBGCheckSum();
bool GetDBGModuleFileUsingSymbolPath(LPTSTR tszSymbolPath);
bool GetDBGModuleFileUsingSQLServer(CSymbolVerification * lpSymbolVerification);
// SQL2 - mjl 12/14/99
bool GetDBGModuleFileUsingSQLServer2(CSymbolVerification * lpSymbolVerification);
bool GetPDBModuleFileUsingSQLServer2(CSymbolVerification * lpSymbolVerification);
};
#endif // !defined(AFX_MODULEINFO_H__0D2E8509_A01A_11D2_83A8_000000000000__INCLUDED_)