home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 9.2 KB | 369 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: FWSymFil.cpp
- // Release Version: $ ODF 2 $
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "FWFound.hpp"
-
- #ifdef FW_BUILDWIN
-
- #include <Windows.h>
- #include <ToolHelp.h>
-
- #ifndef FWSYMFIL_H
- #include "FWSymFil.h"
- #endif
-
- #ifdef FW_DEBUG
-
- #ifdef __ZTC__
- #include <HugePtr.h>
- #endif
-
- #ifndef FWPRISTR_H
- #include "FWPriStr.h"
- #endif
-
- #ifndef FWPRIMEM_H
- #include "FWPriMem.h"
- #endif
-
- #ifdef FW_BUILD_MAC
- #pragma segment FWDebug
- #endif
-
- //========================================================================================
- // Local utility functions
- //========================================================================================
-
- // Private data structures: correspond to Windows format .SYM files
-
- struct MAPDEF
- {
- WORD ppNextMap;
- BYTE bFlags;
- BYTE bReserved1;
- WORD pSegEntry;
- WORD cConsts;
- WORD pConstDef;
- WORD cSegs;
- WORD ppSegDef;
- BYTE cbMaxSym;
- BYTE cbModName;
- char achModName[1];
- };
-
- struct SEGDEF
- {
- WORD ppNextSeg;
- WORD cSymbols;
- WORD pSymDef;
- WORD wSeg; // Segment paragraph
- WORD wReserved2;
- WORD wReserved3;
- WORD wReserved4;
- BYTE bFlags;
- BYTE bReserved1;
- WORD ppLineDef;
- BYTE bReserved2;
- BYTE bReserved3;
- BYTE cbSegName;
- char achSegName[1];
- };
-
- struct SYMDEF
- {
- WORD wSymVal;
- BYTE cbSymName;
- char achSymName[1];
- };
-
- #define STACK_PROLOGUE_THRESHOLD 20
-
-
- //----------------------------------------------------------------------------------------
- // SymFindSegment
- //----------------------------------------------------------------------------------------
-
- static SEGDEF* SymFindSegment(void* pData,
- WORD wSeg)
- {
- #ifdef FW_BUILD_WIN16
-
- MAPDEF * pMapDef = (MAPDEF *)pData;
- SEGDEF * pSegDef = (SEGDEF *)((LPSTR)pData + (pMapDef->ppSegDef * 16));
- WORD cSegs = pMapDef->cSegs;
-
- while (cSegs-- > 0)
- {
- if (pSegDef->cbSegName > 50)
- return NULL;
-
- if (pSegDef->wSeg == wSeg)
- return pSegDef;
- #ifdef __ZTC__
- pSegDef = hugeptr_add((char*)pData, ((long)pSegDef->ppNextSeg) * 16L);
- #else
- pSegDef = (SEGDEF *) ((char huge*)pData + ((DWORD)pSegDef->ppNextSeg * 16));
- #endif
-
- }
- #endif
- return NULL;
- }
-
-
- //----------------------------------------------------------------------------------------
- // SymFindSymbol
- //----------------------------------------------------------------------------------------
-
- static SYMDEF* SymFindSymbol(SEGDEF* pSegDef,
- WORD fOffset)
- {
- #ifdef FW_BUILD_WIN16
- WORD * aSymPtr = (WORD *) ((BYTE *)pSegDef + pSegDef->pSymDef);
- SYMDEF * pSymDef;
- WORD wSymVal;
- WORD i;
-
- for (i = 0; i < pSegDef->cSymbols; i++)
- {
- pSymDef = (SYMDEF *)((BYTE *)pSegDef + aSymPtr[i]);
-
- wSymVal = pSymDef->wSymVal;
-
- if (wSymVal > fOffset)
- return NULL;
- else if (wSymVal + STACK_PROLOGUE_THRESHOLD > fOffset)
- return pSymDef;
- }
- #endif
- return NULL;
- }
-
-
- //----------------------------------------------------------------------------------------
- // SymFindAddress
- //----------------------------------------------------------------------------------------
-
- static FW_Boolean SymFindAddress(void* pSymData,
- WORD wSeg,
- WORD fOffset,
- BYTE cbMaxLen,
- char* pzName)
- {
- #ifdef FW_BUILD_WIN16
- SEGDEF * pSegDef = SymFindSegment(pSymData, wSeg);
- SYMDEF * pSymDef = NULL;
- WORD cbCopy;
-
- if (pSegDef != NULL)
- pSymDef = SymFindSymbol(pSegDef, fOffset);
-
- if (pSymDef != NULL)
- {
- cbCopy = FW_Minimum((BYTE)(cbMaxLen - 1), pSymDef->cbSymName);
- FW_PrimitiveCopyMemory(pzName, pSymDef->achSymName, cbCopy);
- pzName[cbCopy] = 0;
- }
-
- return pSymDef != NULL;
- #else
- return FALSE;
- #endif
- }
-
-
- //========================================================================================
- // Class FW_CPrivWinSymFile
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinSymFile::FW_CPrivWinSymFile
- //----------------------------------------------------------------------------------------
-
- FW_CPrivWinSymFile::FW_CPrivWinSymFile(const char* pzFileName) :
- fSymData(NULL)
- {
- #ifdef FW_BUILD_WIN16
- HFILE hFile = ::_lopen(pzFileName, READ);
- if (hFile != HFILE_ERROR)
- {
- long cbFileSize = ::_llseek(hFile, 0l, SEEK_END);
- ::_llseek(hFile, 0l, SEEK_SET);
-
- // FW_ASSERT(cbFileSize < 0x10000L);
- fSymData = new char[(unsigned short) cbFileSize];
- if (fSymData != NULL)
- ::_hread(hFile, fSymData, cbFileSize);
-
- ::_lclose(hFile);
- }
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinSymFile::~FW_CPrivWinSymFile
- //----------------------------------------------------------------------------------------
-
- FW_CPrivWinSymFile::~FW_CPrivWinSymFile(void)
- {
- #ifdef FW_BUILD_WIN16
- delete[] fSymData;
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinSymFile::FindSymbol
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CPrivWinSymFile::FindSymbol(unsigned short wSeg,
- unsigned short fOffset,
- unsigned short cbMaxLen,
- char* pzName)
- {
- #ifdef FW_BUILD_WIN16
-
- if (fSymData != NULL)
- return SymFindAddress(fSymData, wSeg, fOffset, cbMaxLen, pzName);
- #endif
-
- return NULL;
- }
-
-
- //========================================================================================
- // CLASS FW_CPrivWinDebugModuleList
- //========================================================================================
-
- FW_CPrivWinDebugModuleList::sOneModule FW_CPrivWinDebugModuleList::fModules[FW_CPrivWinDebugModuleList::kMaxModules];
- unsigned short FW_CPrivWinDebugModuleList::fNumberOfModules = 0;
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::Initialize
- //----------------------------------------------------------------------------------------
-
- void FW_CPrivWinDebugModuleList::Initialize(void)
- {
- fNumberOfModules = 0;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::Terminate
- //----------------------------------------------------------------------------------------
-
- void FW_CPrivWinDebugModuleList::Terminate(void)
- {
- #ifdef FW_BUILD_WIN16
-
- for (unsigned short i = 0; i < fNumberOfModules; i++)
- {
- delete fModules[i].fSymFile;
-
- fModules[i].fSymFile = NULL;
- fModules[i].fModule = 0;
- }
-
- fNumberOfModules = 0;
- #endif
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::FindSymbol
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CPrivWinDebugModuleList::FindSymbol(HANDLE fModule,
- unsigned short wSeg,
- unsigned short fOffset,
- unsigned short cbMaxLen,
- char* pzName)
- {
- #ifdef FW_BUILD_WIN16
-
- unsigned short i = FindModule(fModule);
- if (i != kModuleNotFound)
- return fModules[i].fSymFile->FindSymbol(wSeg, fOffset, cbMaxLen, pzName);
-
- #endif
- return FALSE;
- }
-
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::GetModuleName
- //----------------------------------------------------------------------------------------
-
- FW_Boolean FW_CPrivWinDebugModuleList::GetModuleName(HANDLE fModule,
- char* pzName)
- {
- #ifdef FW_BUILD_WIN16
- unsigned short i = FindModule(fModule);
- if (i != kModuleNotFound)
- {
- FW_PrimitiveStringCopy(fModules[i].fModuleName, pzName);
- return TRUE;
- }
- #endif
- return FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::FindModule
- //----------------------------------------------------------------------------------------
-
-
- unsigned short FW_CPrivWinDebugModuleList::FindModule(HANDLE fModule)
- {
- #ifdef FW_BUILD_WIN16
- for (unsigned short i = 0; i < fNumberOfModules; i++)
- if (fModules[i].fModule == fModule)
- return i;
-
- return AddModule(fModule);
- #else
- return 0;
- #endif
- }
-
-
- //----------------------------------------------------------------------------------------
- // FW_CPrivWinDebugModuleList::AddModule
- //----------------------------------------------------------------------------------------
-
- unsigned short FW_CPrivWinDebugModuleList::AddModule(HANDLE fModule)
- {
- #ifdef FW_BUILD_WIN16
- if (fNumberOfModules < kMaxModules)
- {
- // Get the module info from Windows
- MODULEENTRY ModuleEntry;
- ModuleEntry.dwSize = sizeof(MODULEENTRY);
-
- #ifndef FW_BUILD_DOS
- if (ModuleFindHandle(&ModuleEntry, fModule))
- {
- char zSymFileName[MAX_PATH + 1];
-
- FW_PrimitiveStringCopy(ModuleEntry.szExePath, zSymFileName);
- FW_PrimitiveStringCopy(".SYM", FW_PrimitiveStringFindCharacter(zSymFileName, '.'));
-
- fModules[fNumberOfModules].fSymFile = new FW_CPrivWinSymFile(zSymFileName);
- fModules[fNumberOfModules].fModule = fModule;
- FW_PrimitiveStringCopy(ModuleEntry.szModule, fModules[fNumberOfModules].fModuleName);
-
- return fNumberOfModules++;
- }
- #endif
- }
- #endif
- return kModuleNotFound;
- }
-
- #endif // FW_DEBUG
- #endif // FW_BUILD_WIN
-
-