2020-09-30 17:12:32 +02:00

155 lines
3.3 KiB
C++

// shinit
// Copyright <C> 1990-94, Microsoft Corporation
// [00] 31-dec-91 DavidGra
// Add SHFindSymbol API for assembler symbol handling.
// 10-Nov-94 BryanT
// Merge in NT changes.
// Remove SHF ifdef's, remove non-Win32 hosting, remove FAR/NEAR/PASCAL.
// Replace SHCritxxx calls with native CritSec calls.
// Initialize the SymCvt pointers.
// Use the DBG version macros if NT_BUILD
// Add the background symbol support, but leave it under if 0 for now.
#include "shinc.hpp"
#pragma hdrstop
#include "version.h"
CRITICAL_SECTION csSh; // Global CritSec used for MT safe.
KNF knf; // Kernel functions (init to zero by the loader)
HMODULE hLib; // Handle returned from LoadLibrary on symcvt
CONVERTPROC pfConvertSymbolsForImage; // Symcvt ptr.
static SHF shf = {
sizeof(SHF),
SHCreateProcess,
SHSetHpid,
SHDeleteProcess,
SHChangeProcess,
SHAddDll,
SHAddDllsToProcess,
SHLoadDll,
SHUnloadDll,
SHGetDebugStart,
SHGetSymName,
SHAddrFromHsym,
SHHmodGetNextGlobal,
SHModelFromAddr,
SHPublicNameToAddr,
SHGetSymbol,
PHGetAddr,
SHIsLabel,
SHSetDebuggeeDir,
SHAddrToLabel,
SHGetSymLoc,
SHFIsAddrNonVirtual,
SHIsFarProc,
SHGetNextExe,
SHHexeFromHmod,
SHGetNextMod,
SHGetCxtFromHmod,
SHSetCxt,
SHSetCxtMod,
SHFindNameInGlobal,
SHFindNameInContext,
SHGoToParent,
SHHsymFromPcxt,
SHNextHsym,
NULL, // SHGetFuncCXF
SHGetModName,
SHGetExeName,
SHGethExeFromName,
SHGetNearestHsym,
SHIsInProlog,
SHIsAddrInCxt,
SHCompareRE, // SHCompareRE
SHFindSymbol,
PHGetNearestHsym,
PHFindNameInPublics,
THGetTypeFromIndex,
THGetNextType,
SHLpGSNGetTable,
SHCanDisplay,
// Source Line Handler API
SLLineFromAddr,
SLFLineToAddr,
SLNameFromHsf,
SLNameFromHmod,
SLFQueryModSrc,
NULL,
SLHsfFromPcxt,
SLHsfFromFile,
SLCAddrFromLine,
SHFree,
SHUnloadSymbolHandler,
SHGetExeTimeStamp,
SHPdbNameFromExe,
SHGetDebugData,
SHIsThunk,
SHFindSymInExe,
SHFindSLink32,
SHIsEmiLoaded,
// Entries added for NT work.
SHGetModule,
SHGetCxtFromHexe,
SHGetModNameFromHexe,
SHGetSymFName,
SHGethExeFromModuleName,
SHLszGetErrorText,
SHWantSymbols,
SHFindNameInTypes,
#if CC_LAZYTYPES
THAreTypesEqual,
#endif
SHSymbolsLoaded,
SHSymbolsLoadError,
SHUnloadSymbols,
};
VOID SHFree(LPV lpv)
{
MHFree (lpv);
}
BOOL SHInit(LPSHF *lplpshf, LPKNF lpknf)
{
// Make a copy of the comming support routines and give back the
// symbol handler routines we are supplying
knf = *lpknf;
*lplpshf = &shf;
// Initialize symbol convert pointers.
hLib = (HMODULE) LoadLibrary( "symcvt.dll" );
if (hLib != NULL) {
pfConvertSymbolsForImage = (CONVERTPROC) GetProcAddress( hLib, "ConvertSymbolsForImage" );
}
InitializeCriticalSection(&csSh);
if (!StartLazyLoader()) {
return FALSE;
}
return FInitLists();
}
#if defined(DEBUGVER)
DEBUG_VERSION('S','H',"Debug Symbolics handler")
#else
RELEASE_VERSION('S','H',"Debug Symbolics handler")
#endif
DBGVERSIONCHECK();