|
|
//+-------------------------------------------------------------------------
//
// 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_)
|