Annotation of mstools/samples/sdktools/image/drwatson/symbols.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     symbols.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file contains all support for the symbol table.
        !            12: 
        !            13: Author:
        !            14: 
        !            15:     Wesley Witt (wesw) 1-May-1993
        !            16: 
        !            17: Environment:
        !            18: 
        !            19:     User Mode
        !            20: 
        !            21: --*/
        !            22: 
        !            23: #include <windows.h>
        !            24: #include <stdlib.h>
        !            25: #include <stdio.h>
        !            26: #include <string.h>
        !            27: #include <imagehlp.h>
        !            28: 
        !            29: #include "drwatson.h"
        !            30: #include "proto.h"
        !            31: #include "cv.h"
        !            32: #include "messages.h"
        !            33: 
        !            34: 
        !            35: #define n_name          N.ShortName
        !            36: #define n_zeroes        N.Name.Short
        !            37: #define n_nptr          N.LongName[1]
        !            38: #define n_offset        N.Name.Long
        !            39: 
        !            40: void GetSymName( PIMAGE_SYMBOL Symbol, PUCHAR StringTable, char *s );
        !            41: PSYMBOL AllocSym( DWORD symSize, PSYMBOL *symHead, PSYMBOL *symTail );
        !            42: int _CRTAPI1 SymbolCompare( const void *arg1, const void *arg2 );
        !            43: 
        !            44: 
        !            45: PSYMBOL
        !            46: SymbolSearch( DWORD key, PSYMBOL *base, DWORD num )
        !            47: {
        !            48:     PSYMBOL    *lo   = base;
        !            49:     PSYMBOL    *hi   = base + (num - 1);
        !            50:     PSYMBOL    *mid  = NULL;
        !            51:     DWORD      half  = 0;
        !            52: 
        !            53:     while (lo <= hi) {
        !            54:         if (half = num / 2) {
        !            55:             mid = lo + (num & 1 ? half : (half - 1));
        !            56:             if ((key >= (*mid)->addr) &&
        !            57:                 (key < ((*mid)->addr + (*mid)->size))) {
        !            58:                 return *mid;
        !            59:             }
        !            60:             if (key < (*mid)->addr) {
        !            61:                 hi = mid - 1;
        !            62:                 num = num & 1 ? half : half-1;
        !            63:             }
        !            64:             else {
        !            65:                 lo = mid + 1;
        !            66:                 num = half;
        !            67:             }
        !            68:         }
        !            69:         else
        !            70:         if (num) {
        !            71:             if ((key >= (*lo)->addr) &&
        !            72:                 (key < ((*lo)->addr + (*lo)->size))) {
        !            73:                 return *lo;
        !            74:             }
        !            75:             else {
        !            76:                 break;
        !            77:             }
        !            78:         }
        !            79:         else {
        !            80:                 break;
        !            81:         }
        !            82:     }
        !            83:     return NULL;
        !            84: }
        !            85: 
        !            86: PSYMBOL
        !            87: GetSymFromAddr( DWORD dwAddr, PDWORD pdwDisplacement, PMODULEINFO mi )
        !            88: {
        !            89:     PSYMBOL sym = NULL;
        !            90: 
        !            91:     if (mi == NULL) {
        !            92:         return sym;
        !            93:     }
        !            94: 
        !            95:     sym = SymbolSearch( dwAddr, mi->symbolTable, mi->numsyms );
        !            96:     if (sym !=NULL) {
        !            97:         *pdwDisplacement = dwAddr - sym->addr;
        !            98:     }
        !            99: 
        !           100:     return sym;
        !           101: }
        !           102: 
        !           103: PMODULEINFO
        !           104: GetModuleForPC( PDEBUGPACKET dp, DWORD dwPcAddr )
        !           105: {
        !           106:     PMODULEINFO mi = dp->miHead;
        !           107: 
        !           108:     Assert( mi != NULL );
        !           109:     while (mi) {
        !           110:         if ((dwPcAddr >= mi->dwLoadAddress) &&
        !           111:             (dwPcAddr <= mi->dwLoadAddress + mi->dwImageSize)) {
        !           112:                return mi;
        !           113:         }
        !           114:         mi = mi->next;
        !           115:     }
        !           116: 
        !           117:     return NULL;
        !           118: }
        !           119: 
        !           120: PSYMBOL
        !           121: GetSymFromAddrAllContexts( DWORD dwAddr, PDWORD pdwDisplacement, PDEBUGPACKET dp )
        !           122: {
        !           123:     PMODULEINFO mi = GetModuleForPC( dp, dwAddr );
        !           124:     if (mi == NULL) {
        !           125:         return NULL;
        !           126:     }
        !           127:     return GetSymFromAddr( dwAddr, pdwDisplacement, mi );
        !           128: }
        !           129: 
        !           130: void
        !           131: DumpSymbols( PDEBUGPACKET dp )
        !           132: {
        !           133:     DWORD         i;
        !           134:     PSYMBOL       *sym;
        !           135:     char          *szSymName;
        !           136:     PMODULEINFO   mi;
        !           137: 
        !           138: 
        !           139:     lprintf( MSG_SYMBOL_TABLE );
        !           140: 
        !           141:     mi = dp->miHead;
        !           142:     while (mi) {
        !           143:         lprintfs( "%s\r\n", mi->szName );
        !           144:         for (i=0,sym=mi->symbolTable; i<mi->numsyms; i++,sym++) {
        !           145:             szSymName = UnDName( &(*sym)->szName[1] );
        !           146:             lprintfs( "%08x    %s\r\n", (*sym)->addr, szSymName );
        !           147:         }
        !           148:         lprintfs( "\r\n" );
        !           149:         mi = mi->next;
        !           150:     }
        !           151: 
        !           152:     return;
        !           153: }
        !           154: 
        !           155: PSYMBOL
        !           156: AllocSym( DWORD symSize, PSYMBOL *symHead, PSYMBOL *symTail )
        !           157: {
        !           158:     PSYMBOL sym;
        !           159: 
        !           160:     sym = (PSYMBOL) malloc( sizeof(SYMBOL)+symSize );
        !           161:     if (sym == NULL) {
        !           162:         return NULL;
        !           163:     }
        !           164:     memset( sym, 0, sizeof(SYMBOL)+symSize );
        !           165: 
        !           166:     if (*symHead == NULL) {
        !           167:         *symTail = *symHead = sym;
        !           168:         return sym;
        !           169:     }
        !           170:     else {
        !           171:         (*symTail)->next = sym;
        !           172:         *symTail = sym;
        !           173:         return sym;
        !           174:     }
        !           175:     return NULL;
        !           176: }
        !           177: 
        !           178: BOOL
        !           179: LoadFpoData( PMODULEINFO mi, PFPO_DATA start, DWORD size )
        !           180: {
        !           181:     mi->pFpoData = (PFPO_DATA) malloc( size );
        !           182: 
        !           183:     if (mi->pFpoData == NULL) {
        !           184:         return FALSE;
        !           185:     }
        !           186: 
        !           187:     memcpy( mi->pFpoData, start, size );
        !           188: 
        !           189:     mi->dwEntries = size / sizeof(FPO_DATA);
        !           190: 
        !           191:     return TRUE;
        !           192: }
        !           193: 
        !           194: BOOL
        !           195: LoadExceptionData( PMODULEINFO mi, PRUNTIME_FUNCTION start, DWORD size )
        !           196: {
        !           197:     DWORD               cFunc;
        !           198:     DWORD               index;
        !           199:     PRUNTIME_FUNCTION   rf;
        !           200:     PRUNTIME_FUNCTION   tf;
        !           201: 
        !           202: 
        !           203:     if (size == 0) {
        !           204:         return FALSE;
        !           205:     }
        !           206: 
        !           207:     cFunc = size / sizeof(RUNTIME_FUNCTION);
        !           208: 
        !           209:     //
        !           210:     // Find the start of the padded page (end of the real data)
        !           211:     //
        !           212:     rf = tf = start;
        !           213:     for(index=0; index<cFunc && tf->BeginAddress; tf++,index++) {
        !           214:         ;
        !           215:     }
        !           216: 
        !           217:     if (index<cFunc) {
        !           218:         cFunc = index;
        !           219:         size  = index * sizeof(RUNTIME_FUNCTION);
        !           220:     }
        !           221: 
        !           222:     mi->pExceptionData = (PRUNTIME_FUNCTION) malloc( size );
        !           223:     if (mi->pExceptionData == NULL) {
        !           224:         return FALSE;
        !           225:     }
        !           226: 
        !           227:     memcpy( mi->pExceptionData, rf, size );
        !           228: 
        !           229:     //
        !           230:     // if the image has been relocated then the addresses must be fixed up
        !           231:     //
        !           232:     if (mi->dwLoadAddress != mi->dwBaseOfImage) {
        !           233:         long diff = (LONG)mi->dwLoadAddress - mi->dwBaseOfImage;
        !           234: 
        !           235:         for (index=0; index<cFunc; index++) {
        !           236:             mi->pExceptionData[index].BeginAddress += diff;
        !           237:             mi->pExceptionData[index].EndAddress += diff;
        !           238:             mi->pExceptionData[index].PrologEndAddress += diff;
        !           239:         }
        !           240:     }
        !           241: 
        !           242:     mi->dwEntries = cFunc;
        !           243: 
        !           244:     return TRUE;
        !           245: }
        !           246: 
        !           247: BOOL
        !           248: LoadCoffSymbols( PMODULEINFO     mi,
        !           249:                  PUCHAR          stringTable,
        !           250:                  PIMAGE_SYMBOL   allSymbols,
        !           251:                  DWORD           numberOfSymbols
        !           252:                )
        !           253: {
        !           254:     PIMAGE_SYMBOL       NextSymbol;
        !           255:     PIMAGE_SYMBOL       Symbol;
        !           256:     PIMAGE_AUX_SYMBOL   AuxSymbol;
        !           257:     SYMBOL              *sym;
        !           258:     char                szSymName[256];
        !           259:     DWORD               len;
        !           260:     DWORD               numaux;
        !           261:     DWORD               i;
        !           262:     DWORD               j;
        !           263:     DWORD               addr;
        !           264:     PSYMBOL             *symbolTable;
        !           265:     PSYMBOL             *symbolTable2;
        !           266:     PSYMBOL             symHead = NULL;
        !           267:     PSYMBOL             symTail = NULL;
        !           268: 
        !           269:     Assert( mi != NULL );
        !           270:     NextSymbol = allSymbols;
        !           271:     for (i= 0; i < numberOfSymbols; i++) {
        !           272:         Symbol = NextSymbol++;
        !           273:         if (Symbol->StorageClass == IMAGE_SYM_CLASS_EXTERNAL && Symbol->SectionNumber > 0) {
        !           274:             GetSymName( Symbol, stringTable, szSymName );
        !           275:             addr = Symbol->Value + mi->dwLoadAddress;
        !           276:             len = strlen( szSymName );
        !           277:             sym = AllocSym ( len+1, &symHead, &symTail );
        !           278:             sym->szName[0] = (UCHAR) len;
        !           279:             strcpy( &sym->szName[1], szSymName );
        !           280:             sym->addr = addr;
        !           281:             mi->numsyms++;
        !           282:         }
        !           283:         if (numaux = Symbol->NumberOfAuxSymbols) {
        !           284:             for (j=numaux; j; --j) {
        !           285:                 AuxSymbol = (PIMAGE_AUX_SYMBOL) NextSymbol;
        !           286:                 NextSymbol++;
        !           287:                 ++i;
        !           288:             }
        !           289:         }
        !           290:     }
        !           291: 
        !           292:     mi->symbolTable = (PSYMBOL*) malloc( mi->numsyms * sizeof(PSYMBOL) );
        !           293:     Assert( mi->symbolTable != NULL );
        !           294: 
        !           295:     sym = symHead;
        !           296:     symbolTable = mi->symbolTable;
        !           297:     while (sym) {
        !           298:         *symbolTable = sym;
        !           299:         symbolTable++;
        !           300:         sym = sym->next;
        !           301:     }
        !           302: 
        !           303:     qsort( (void*)mi->symbolTable, mi->numsyms, sizeof(PSYMBOL), SymbolCompare );
        !           304: 
        !           305:     for (i=0,symbolTable=mi->symbolTable; i<mi->numsyms; i++,symbolTable++) {
        !           306:         if (i+1 < mi->numsyms) {
        !           307:             symbolTable2 = symbolTable+1;
        !           308:             (*symbolTable)->size = (*symbolTable2)->addr - (*symbolTable)->addr;
        !           309:         }
        !           310:     }
        !           311: 
        !           312:     return TRUE;
        !           313: }
        !           314: 
        !           315: BOOL
        !           316: LoadCodeViewSymbols( PMODULEINFO            mi,
        !           317:                      PUCHAR                 pCvData,
        !           318:                      PIMAGE_SECTION_HEADER  sectionHdrs,
        !           319:                      DWORD                  numSections
        !           320:                    )
        !           321: {
        !           322:     OMFSignature           *omfSig;
        !           323:     OMFDirHeader           *omfDirHdr;
        !           324:     OMFDirEntry            *omfDirEntry;
        !           325:     DATASYM32              *dataSym;
        !           326:     OMFSymHash             *omfSymHash;
        !           327:     SYMBOL                 *sym;
        !           328:     DWORD                  i;
        !           329:     DWORD                  j;
        !           330:     DWORD                  k;
        !           331:     DWORD                  addr;
        !           332:     PSYMBOL                *symbolTable;
        !           333:     PSYMBOL                *symbolTable2;
        !           334:     PIMAGE_SECTION_HEADER  sh;
        !           335:     PSYMBOL                symHead = NULL;
        !           336:     PSYMBOL                symTail = NULL;
        !           337: 
        !           338: 
        !           339:     Assert( mi != NULL );
        !           340:     omfSig = (OMFSignature*) pCvData;
        !           341:     if ((strncmp( omfSig->Signature, "NB08", 4 ) != 0) &&
        !           342:         (strncmp( omfSig->Signature, "NB09", 4 ) != 0)) {
        !           343:         return FALSE;
        !           344:     }
        !           345: 
        !           346:     omfDirHdr = (OMFDirHeader*) ((DWORD)omfSig + (DWORD)omfSig->filepos);
        !           347:     omfDirEntry = (OMFDirEntry*) ((DWORD)omfDirHdr + sizeof(OMFDirHeader));
        !           348: 
        !           349:     for (i=0; i<omfDirHdr->cDir; i++,omfDirEntry++) {
        !           350:         if (omfDirEntry->SubSection == sstGlobalPub) {
        !           351:             omfSymHash = (OMFSymHash*) ((DWORD)omfSig + omfDirEntry->lfo);
        !           352:             dataSym = (DATASYM32*) ((DWORD)omfSig + omfDirEntry->lfo + sizeof(OMFSymHash));
        !           353:             for (j=sizeof(OMFSymHash); j<=omfSymHash->cbSymbol; ) {
        !           354:                 sym = AllocSym ( dataSym->name[0]+1, &symHead, &symTail );
        !           355:                 if (sym != NULL) {
        !           356:                     for (k=0,addr=0,sh=sectionHdrs; k<numSections; k++, sh++) {
        !           357:                         if (k+1 == dataSym->seg) {
        !           358:                             addr = sh->VirtualAddress;
        !           359:                         }
        !           360:                     }
        !           361:                     addr += (dataSym->off + mi->dwLoadAddress);
        !           362:                     memcpy( sym->szName, dataSym->name, dataSym->name[0]+1 );
        !           363:                     sym->addr = addr;
        !           364:                     j += dataSym->reclen + 2;
        !           365:                     dataSym = (DATASYM32*) ((DWORD)dataSym + dataSym->reclen + 2);
        !           366:                     mi->numsyms++;
        !           367:                 }
        !           368:             }
        !           369:             break;
        !           370:         }
        !           371:     }
        !           372: 
        !           373: 
        !           374:     mi->symbolTable = (PSYMBOL*) malloc( mi->numsyms * sizeof(PSYMBOL) );
        !           375:     if (mi->symbolTable == NULL) {
        !           376:         return FALSE;
        !           377:     }
        !           378: 
        !           379:     sym = symHead;
        !           380:     symbolTable = mi->symbolTable;
        !           381:     i = 0;
        !           382:     while (sym) {
        !           383:         i++;
        !           384:         *symbolTable = sym;
        !           385:         symbolTable++;
        !           386:         sym = sym->next;
        !           387:     }
        !           388: 
        !           389:     qsort( (void*)mi->symbolTable, mi->numsyms, sizeof(PSYMBOL), SymbolCompare );
        !           390: 
        !           391:     for (i=0,symbolTable=mi->symbolTable; i<mi->numsyms; i++,symbolTable++) {
        !           392:         if (i+1 < mi->numsyms) {
        !           393:             symbolTable2 = symbolTable+1;
        !           394:             (*symbolTable)->size = (*symbolTable2)->addr - (*symbolTable)->addr;
        !           395:         }
        !           396:     }
        !           397: 
        !           398:     return TRUE;
        !           399: }
        !           400: 
        !           401: void
        !           402: GetSymName( PIMAGE_SYMBOL Symbol, PUCHAR StringTable, char *s )
        !           403: {
        !           404:     DWORD i;
        !           405: 
        !           406:     if (Symbol->n_zeroes) {
        !           407:         for (i=0; i<8; i++) {
        !           408:             if ((Symbol->n_name[i]>0x1f) && (Symbol->n_name[i]<0x7f)) {
        !           409:                 *s++ = Symbol->n_name[i];
        !           410:             }
        !           411:         }
        !           412:         *s = 0;
        !           413:     }
        !           414:     else {
        !           415:         strcpy( s, &StringTable[Symbol->n_offset] );
        !           416:     }
        !           417: }
        !           418: 
        !           419: int
        !           420: _CRTAPI1
        !           421: SymbolCompare( const void *arg1, const void *arg2 )
        !           422: {
        !           423:     if ((*(PSYMBOL*)arg1)->addr < (*(PSYMBOL*)arg2)->addr) {
        !           424:         return -1;
        !           425:     }
        !           426:     if ((*(PSYMBOL*)arg1)->addr > (*(PSYMBOL*)arg2)->addr) {
        !           427:         return 1;
        !           428:     }
        !           429:     return 0;
        !           430: }
        !           431: 
        !           432: char *
        !           433: UnDName (char * dName)
        !           434: {
        !           435:     static char outBuf[512];
        !           436:     char *p;
        !           437: 
        !           438:     if (*dName == '_') {
        !           439:         ++dName;
        !           440:         strcpy(outBuf, dName);
        !           441:         p = strchr(outBuf, '@');
        !           442:         if (p) {
        !           443:             *p = '\0';
        !           444:         }
        !           445:     }
        !           446:     else
        !           447:     if(UnDecorateSymbolName( dName,
        !           448:                              outBuf,
        !           449:                              sizeof(outBuf),
        !           450:                              UNDNAME_COMPLETE ) == 0 ) {
        !           451:         return NULL;
        !           452:     }
        !           453: 
        !           454:     return  outBuf;
        !           455: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.