home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Found / FWDebug / FWSymFil.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  9.2 KB  |  369 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWSymFil.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFound.hpp"
  11.  
  12. #ifdef FW_BUILDWIN
  13.  
  14. #include <Windows.h>
  15. #include <ToolHelp.h>
  16.  
  17. #ifndef FWSYMFIL_H
  18. #include "FWSymFil.h"
  19. #endif
  20.  
  21. #ifdef FW_DEBUG
  22.  
  23. #ifdef __ZTC__
  24. #include <HugePtr.h>
  25. #endif
  26.  
  27. #ifndef FWPRISTR_H
  28. #include "FWPriStr.h"
  29. #endif
  30.  
  31. #ifndef FWPRIMEM_H
  32. #include "FWPriMem.h"
  33. #endif
  34.  
  35. #ifdef FW_BUILD_MAC
  36. #pragma segment FWDebug
  37. #endif
  38.  
  39. //========================================================================================
  40. // Local utility functions
  41. //========================================================================================
  42.  
  43. // Private data structures: correspond to Windows format .SYM files
  44.  
  45. struct MAPDEF
  46. {
  47.     WORD ppNextMap;
  48.     BYTE bFlags;
  49.     BYTE bReserved1;
  50.     WORD pSegEntry;
  51.     WORD cConsts;
  52.     WORD pConstDef;
  53.     WORD cSegs;
  54.     WORD ppSegDef;
  55.     BYTE cbMaxSym;
  56.     BYTE cbModName;
  57.     char achModName[1];
  58. };
  59.  
  60. struct SEGDEF
  61. {
  62.     WORD ppNextSeg;
  63.     WORD cSymbols;
  64.     WORD pSymDef;
  65.     WORD wSeg;          // Segment paragraph
  66.     WORD wReserved2;
  67.     WORD wReserved3;
  68.     WORD wReserved4;
  69.     BYTE bFlags;
  70.     BYTE bReserved1;
  71.     WORD ppLineDef;
  72.     BYTE bReserved2;
  73.     BYTE bReserved3;
  74.     BYTE cbSegName;
  75.     char achSegName[1];
  76. };
  77.  
  78. struct SYMDEF
  79. {
  80.     WORD wSymVal;
  81.     BYTE cbSymName;
  82.     char achSymName[1];
  83. };
  84.  
  85. #define STACK_PROLOGUE_THRESHOLD 20
  86.  
  87.  
  88. //----------------------------------------------------------------------------------------
  89. // SymFindSegment
  90. //----------------------------------------------------------------------------------------
  91.  
  92. static SEGDEF* SymFindSegment(void* pData,
  93.                               WORD wSeg)
  94. {
  95. #ifdef FW_BUILD_WIN16
  96.  
  97.     MAPDEF * pMapDef = (MAPDEF *)pData;
  98.     SEGDEF * pSegDef = (SEGDEF *)((LPSTR)pData + (pMapDef->ppSegDef * 16));
  99.     WORD cSegs = pMapDef->cSegs;
  100.  
  101.     while (cSegs-- > 0)
  102.     {
  103.         if (pSegDef->cbSegName > 50)
  104.             return NULL;
  105.  
  106.         if (pSegDef->wSeg == wSeg)
  107.             return pSegDef;
  108. #ifdef __ZTC__
  109.         pSegDef = hugeptr_add((char*)pData, ((long)pSegDef->ppNextSeg) * 16L);
  110. #else
  111.         pSegDef = (SEGDEF *) ((char huge*)pData + ((DWORD)pSegDef->ppNextSeg * 16));
  112. #endif
  113.  
  114.     }
  115. #endif
  116.     return NULL;
  117. }
  118.  
  119.  
  120. //----------------------------------------------------------------------------------------
  121. // SymFindSymbol
  122. //----------------------------------------------------------------------------------------
  123.  
  124. static SYMDEF* SymFindSymbol(SEGDEF* pSegDef,
  125.                              WORD fOffset)
  126. {
  127. #ifdef FW_BUILD_WIN16
  128.     WORD * aSymPtr = (WORD *) ((BYTE *)pSegDef + pSegDef->pSymDef);
  129.     SYMDEF * pSymDef;
  130.     WORD wSymVal;
  131.     WORD i;
  132.  
  133.     for (i = 0; i < pSegDef->cSymbols; i++)
  134.     {
  135.         pSymDef = (SYMDEF *)((BYTE *)pSegDef + aSymPtr[i]);
  136.  
  137.         wSymVal = pSymDef->wSymVal;
  138.  
  139.         if (wSymVal > fOffset)
  140.             return NULL;
  141.         else if (wSymVal + STACK_PROLOGUE_THRESHOLD > fOffset)
  142.             return pSymDef;
  143.     }
  144. #endif
  145.     return NULL;
  146. }
  147.  
  148.  
  149. //----------------------------------------------------------------------------------------
  150. // SymFindAddress
  151. //----------------------------------------------------------------------------------------
  152.  
  153. static FW_Boolean SymFindAddress(void* pSymData,
  154.                                  WORD wSeg,
  155.                                  WORD fOffset,
  156.                                  BYTE cbMaxLen,
  157.                                  char* pzName)
  158. {
  159. #ifdef FW_BUILD_WIN16
  160.     SEGDEF * pSegDef = SymFindSegment(pSymData, wSeg);
  161.     SYMDEF * pSymDef = NULL;
  162.     WORD cbCopy;
  163.  
  164.     if (pSegDef != NULL)
  165.         pSymDef = SymFindSymbol(pSegDef, fOffset);
  166.  
  167.     if (pSymDef != NULL)
  168.     {
  169.         cbCopy = FW_Minimum((BYTE)(cbMaxLen - 1), pSymDef->cbSymName);
  170.         FW_PrimitiveCopyMemory(pzName, pSymDef->achSymName, cbCopy);
  171.         pzName[cbCopy] = 0;
  172.     }
  173.  
  174.     return pSymDef != NULL;
  175. #else
  176.     return FALSE;
  177. #endif
  178. }
  179.  
  180.  
  181. //========================================================================================
  182. // Class FW_CPrivWinSymFile
  183. //========================================================================================
  184.  
  185. //----------------------------------------------------------------------------------------
  186. // FW_CPrivWinSymFile::FW_CPrivWinSymFile
  187. //----------------------------------------------------------------------------------------
  188.  
  189. FW_CPrivWinSymFile::FW_CPrivWinSymFile(const char* pzFileName) :
  190.     fSymData(NULL)
  191. {
  192. #ifdef FW_BUILD_WIN16
  193.     HFILE hFile = ::_lopen(pzFileName, READ);
  194.     if (hFile != HFILE_ERROR)
  195.     {
  196.         long cbFileSize = ::_llseek(hFile, 0l, SEEK_END);
  197.         ::_llseek(hFile, 0l, SEEK_SET);
  198.  
  199. //        FW_ASSERT(cbFileSize < 0x10000L);
  200.         fSymData = new char[(unsigned short) cbFileSize];
  201.         if (fSymData != NULL)
  202.             ::_hread(hFile, fSymData, cbFileSize);
  203.  
  204.         ::_lclose(hFile);
  205.     }
  206. #endif
  207. }
  208.  
  209. //----------------------------------------------------------------------------------------
  210. // FW_CPrivWinSymFile::~FW_CPrivWinSymFile
  211. //----------------------------------------------------------------------------------------
  212.  
  213. FW_CPrivWinSymFile::~FW_CPrivWinSymFile(void)
  214. {
  215. #ifdef FW_BUILD_WIN16
  216.     delete[] fSymData;
  217. #endif
  218. }
  219.  
  220. //----------------------------------------------------------------------------------------
  221. // FW_CPrivWinSymFile::FindSymbol
  222. //----------------------------------------------------------------------------------------
  223.  
  224. FW_Boolean FW_CPrivWinSymFile::FindSymbol(unsigned short wSeg,
  225.                                          unsigned short fOffset,
  226.                                          unsigned short cbMaxLen,
  227.                                          char* pzName)
  228. {
  229. #ifdef FW_BUILD_WIN16
  230.  
  231.     if (fSymData != NULL)
  232.         return SymFindAddress(fSymData, wSeg, fOffset, cbMaxLen, pzName);
  233. #endif
  234.  
  235.     return NULL;
  236. }
  237.  
  238.  
  239. //========================================================================================
  240. // CLASS FW_CPrivWinDebugModuleList
  241. //========================================================================================
  242.  
  243. FW_CPrivWinDebugModuleList::sOneModule FW_CPrivWinDebugModuleList::fModules[FW_CPrivWinDebugModuleList::kMaxModules];
  244. unsigned short FW_CPrivWinDebugModuleList::fNumberOfModules = 0;
  245.  
  246. //----------------------------------------------------------------------------------------
  247. // FW_CPrivWinDebugModuleList::Initialize
  248. //----------------------------------------------------------------------------------------
  249.  
  250. void FW_CPrivWinDebugModuleList::Initialize(void)
  251. {
  252.     fNumberOfModules = 0;
  253. }
  254.  
  255. //----------------------------------------------------------------------------------------
  256. // FW_CPrivWinDebugModuleList::Terminate
  257. //----------------------------------------------------------------------------------------
  258.  
  259. void FW_CPrivWinDebugModuleList::Terminate(void)
  260. {
  261. #ifdef FW_BUILD_WIN16
  262.  
  263.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  264.     {
  265.         delete fModules[i].fSymFile;
  266.         
  267.         fModules[i].fSymFile = NULL;
  268.         fModules[i].fModule = 0;
  269.     }
  270.     
  271.     fNumberOfModules = 0;
  272. #endif
  273. }
  274.  
  275. //----------------------------------------------------------------------------------------
  276. // FW_CPrivWinDebugModuleList::FindSymbol
  277. //----------------------------------------------------------------------------------------
  278.  
  279. FW_Boolean FW_CPrivWinDebugModuleList::FindSymbol(HANDLE fModule,
  280.                                                  unsigned short wSeg,
  281.                                                  unsigned short fOffset,
  282.                                                  unsigned short cbMaxLen,
  283.                                                  char* pzName)
  284. {
  285. #ifdef FW_BUILD_WIN16
  286.  
  287.     unsigned short i = FindModule(fModule);
  288.     if (i != kModuleNotFound)
  289.         return fModules[i].fSymFile->FindSymbol(wSeg, fOffset, cbMaxLen, pzName);
  290.  
  291. #endif
  292.     return FALSE;
  293. }
  294.  
  295.  
  296. //----------------------------------------------------------------------------------------
  297. // FW_CPrivWinDebugModuleList::GetModuleName
  298. //----------------------------------------------------------------------------------------
  299.  
  300. FW_Boolean FW_CPrivWinDebugModuleList::GetModuleName(HANDLE fModule,
  301.                                      char* pzName)
  302. {
  303. #ifdef FW_BUILD_WIN16
  304.     unsigned short i = FindModule(fModule);
  305.     if (i != kModuleNotFound)
  306.     {
  307.         FW_PrimitiveStringCopy(fModules[i].fModuleName, pzName);
  308.         return TRUE;
  309.     }
  310. #endif
  311.     return FALSE;
  312. }
  313.  
  314. //----------------------------------------------------------------------------------------
  315. // FW_CPrivWinDebugModuleList::FindModule
  316. //----------------------------------------------------------------------------------------
  317.  
  318.  
  319. unsigned short FW_CPrivWinDebugModuleList::FindModule(HANDLE fModule)
  320. {
  321. #ifdef FW_BUILD_WIN16
  322.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  323.         if (fModules[i].fModule == fModule)
  324.             return i;
  325.  
  326.     return AddModule(fModule);
  327. #else
  328.     return 0;
  329. #endif
  330. }
  331.  
  332.  
  333. //----------------------------------------------------------------------------------------
  334. // FW_CPrivWinDebugModuleList::AddModule
  335. //----------------------------------------------------------------------------------------
  336.  
  337. unsigned short FW_CPrivWinDebugModuleList::AddModule(HANDLE fModule)
  338. {
  339. #ifdef FW_BUILD_WIN16
  340.     if (fNumberOfModules < kMaxModules)
  341.     {
  342.         // Get the module info from Windows
  343.         MODULEENTRY ModuleEntry;
  344.         ModuleEntry.dwSize = sizeof(MODULEENTRY);
  345.  
  346. #ifndef FW_BUILD_DOS
  347.         if (ModuleFindHandle(&ModuleEntry, fModule))
  348.         {
  349.             char zSymFileName[MAX_PATH + 1];
  350.  
  351.             FW_PrimitiveStringCopy(ModuleEntry.szExePath, zSymFileName);
  352.             FW_PrimitiveStringCopy(".SYM", FW_PrimitiveStringFindCharacter(zSymFileName, '.'));
  353.  
  354.             fModules[fNumberOfModules].fSymFile = new FW_CPrivWinSymFile(zSymFileName);
  355.             fModules[fNumberOfModules].fModule = fModule;
  356.             FW_PrimitiveStringCopy(ModuleEntry.szModule, fModules[fNumberOfModules].fModuleName);
  357.  
  358.             return fNumberOfModules++;
  359.         }
  360. #endif
  361.     }
  362. #endif
  363.     return kModuleNotFound;
  364. }
  365.  
  366. #endif // FW_DEBUG
  367. #endif // FW_BUILD_WIN
  368.  
  369.