Annotation of mstools/samples/sdktools/image/symedit/symtocv.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: 
                      4: Copyright (c) 1992  Microsoft Corporation
                      5: 
                      6: Module Name:
                      7: 
                      8:     symtocv.c
                      9: 
                     10: Abstract:
                     11: 
                     12:     This module handles the conversion activities requires for converting
                     13:     C7/C8 SYM files to CODEVIEW debug data.
                     14: 
                     15: Author:
                     16: 
                     17:     Wesley A. Witt (wesw) 13-April-1993
                     18: 
                     19: Environment:
                     20: 
                     21:     Win32, User Mode
                     22: 
                     23: --*/
                     24: 
                     25: #include <windows.h>
                     26: #include <stdlib.h>
                     27: #include <stdio.h>
                     28: #include <string.h>
                     29: 
                     30: #include "cv.h"
                     31: #include "symcvt.h"
                     32: #include "cvcommon.h"
                     33: 
                     34: typedef struct tagSYMNAME {
                     35:     BYTE        length;
                     36:     char        name[1];
                     37: } SYMNAME, *PSYMNAME;
                     38: 
                     39: typedef struct tagSYMSYMBOL {
                     40:     WORD        offset;
                     41:     SYMNAME     symName;
                     42: } SYMSYMBOL, *PSYMSYMBOL;
                     43: 
                     44: typedef struct tagSYMFILEHEADER {
                     45:     DWORD       fileSize;
                     46:     WORD        reserved1;
                     47:     WORD        numSyms;
                     48:     DWORD       reserved2;
                     49:     WORD        nextOffset;
                     50:     BYTE        reserved3;
                     51:     SYMNAME     symName;
                     52: } SYMFILEHEADER, *PSYMFILEHEADER;
                     53: 
                     54: typedef struct tagSYMHEADER {
                     55:     WORD        nextOffset;
                     56:     WORD        numSyms;
                     57:     WORD        reserved1;
                     58:     WORD        segment;
                     59:     BYTE        reserved2[12];
                     60:     SYMNAME     symName;
                     61: } SYMHEADER, *PSYMHEADER;
                     62: 
                     63: #define SIZEOFSYMFILEHEADER   16
                     64: #define SIZEOFSYMHEADER       21
                     65: #define SIZEOFSYMBOL           3
                     66: 
                     67: #define SYM_SEGMENT_NAME       0
                     68: #define SYM_SYMBOL_NAME        1
                     69: #define SYM_SEGMENT_ABS        2
                     70: #define SYM_SYMBOL_ABS         3
                     71: 
                     72: typedef struct tagENUMINFO {
                     73:     DATASYM16           *dataSym;
                     74:     DATASYM16           *dataSym2;
                     75:     DWORD               numsyms;
                     76:     SGI                 *sgi;
                     77: } ENUMINFO, *PENUMINFO;
                     78: 
                     79: typedef BOOL (CALLBACK* SYMBOLENUMPROC)(PSYMNAME pSymName, int symType,
                     80:                                         SEGMENT segment, UOFF16 offset,
                     81:                                         PENUMINFO pEnumInfo);
                     82: 
                     83: 
                     84: static VOID   GetSymName( PIMAGE_SYMBOL Symbol, PUCHAR StringTable,
                     85:                           char * s );
                     86: DWORD  CreateModulesFromSyms( PPOINTERS p );
                     87: DWORD  CreatePublicsFromSyms( PPOINTERS p );
                     88: DWORD  CreateSegMapFromSyms( PPOINTERS p );
                     89: static BOOL   EnumSymbols( PPOINTERS p, SYMBOLENUMPROC lpEnumProc,
                     90:                            PENUMINFO pEnumInfo  );
                     91: 
                     92: int             CSymSegs;
                     93: 
                     94: BOOL CALLBACK
                     95: SymbolCount(PSYMNAME pSymName, int symType, SEGMENT segment,
                     96:             UOFF16 offset, PENUMINFO pEnumInfo )
                     97: {
                     98:     if ((symType == SYM_SEGMENT_NAME) && (segment > 0)) {
                     99:         CSymSegs += 1;
                    100:     }
                    101:     pEnumInfo->numsyms++;
                    102:     return TRUE;
                    103: }
                    104: 
                    105: BOOL
                    106: ConvertSymToCv( PPOINTERS p )
                    107: 
                    108: /*++
                    109: 
                    110: Routine Description:
                    111: 
                    112:     This is the control function for the conversion of COFF to CODEVIEW
                    113:     debug data.  It calls individual functions for the conversion of
                    114:     specific types of debug data.
                    115: 
                    116: 
                    117: Arguments:
                    118: 
                    119:     p        - pointer to a POINTERS structure (see cofftocv.h)
                    120: 
                    121: 
                    122: Return Value:
                    123: 
                    124:     TRUE     - conversion succeded
                    125:     FALSE    - conversion failed
                    126: 
                    127: --*/
                    128: 
                    129: {
                    130:     ENUMINFO            enumInfo;
                    131:     DWORD               dwSize;
                    132: 
                    133:     CSymSegs = 0;
                    134:     enumInfo.numsyms = 0;
                    135:     EnumSymbols( p, SymbolCount, &enumInfo );
                    136:     dwSize = (enumInfo.numsyms * (sizeof(DATASYM16) + 10)) + 256000;
                    137:     p->pCvCurr = p->pCvStart.ptr = malloc( dwSize );
                    138:     if (p->pCvStart.ptr == NULL) {
                    139:         return FALSE;
                    140:     }
                    141:     memset( p->pCvStart.ptr, 0, dwSize );
                    142: 
                    143:     try {
                    144: 
                    145:         CreateSignature( p );
                    146:         CreatePublicsFromSyms( p );
                    147:         CreateSymbolHashTable( p );
                    148:         CreateAddressSortTable( p );
                    149:         CreateSegMapFromSyms( p );
                    150:         CreateModulesFromSyms( p );
                    151:         CreateDirectories( p );
                    152:         p->pCvStart.ptr = realloc( p->pCvStart.ptr, p->pCvStart.size );
                    153:         return TRUE;
                    154: 
                    155:     } except (EXCEPTION_EXECUTE_HANDLER) {
                    156: 
                    157:         free( p->pCvStart.ptr );
                    158:         p->pCvStart.ptr = NULL;
                    159:         return FALSE;
                    160: 
                    161:     }
                    162: }
                    163: 
                    164: 
                    165: DWORD
                    166: CreateModulesFromSyms( PPOINTERS p )
                    167: 
                    168: /*++
                    169: 
                    170: Routine Description:
                    171: 
                    172:     Creates the individual CV module records.  There is one CV module
                    173:     record for each .FILE record in the COFF debug data.  This is true
                    174:     even if the COFF size is zero.
                    175: 
                    176: 
                    177: Arguments:
                    178: 
                    179:     p        - pointer to a POINTERS structure (see cofftocv.h)
                    180: 
                    181: 
                    182: Return Value:
                    183: 
                    184:     The number of modules that were created.
                    185: 
                    186: --*/
                    187: 
                    188: {
                    189:     char                szDrive    [_MAX_DRIVE];
                    190:     char                szDir      [_MAX_DIR];
                    191:     char                szFname    [_MAX_FNAME];
                    192:     char                szExt      [_MAX_EXT];
                    193:     OMFModule           *m;
                    194:     int                 i;
                    195:     char *              pb;
                    196: 
                    197:     _splitpath( p->iptrs.szName, szDrive, szDir, szFname, szExt );
                    198: 
                    199:     m = (OMFModule *) p->pCvCurr;
                    200: 
                    201:     m->ovlNumber        = 0;
                    202:     m->iLib             = 0;
                    203:     m->cSeg             = CSymSegs;
                    204:     m->Style[0]         = 'C';
                    205:     m->Style[1]         = 'V';
                    206:     for (i=0; i<CSymSegs; i++) {
                    207:         m->SegInfo[i].Seg   = i+1;
                    208:         m->SegInfo[i].pad   = 0;
                    209:         m->SegInfo[i].Off   = 0;
                    210:         m->SegInfo[i].cbSeg = 0xffff;
                    211:     }
                    212:     pb = (char *) &m->SegInfo[CSymSegs];
                    213:     sprintf( &pb[1], "%s.c", szFname );
                    214:     pb[0] = strlen( &pb[1] );
                    215: 
                    216:     pb = (char *) NextMod(m);
                    217: 
                    218:     UpdatePtrs( p, &p->pCvModules, (LPVOID)pb, 1 );
                    219: 
                    220:     return 1;
                    221: }
                    222: 
                    223: BOOL CALLBACK
                    224: ConvertASymtoPublic(PSYMNAME pSymName, int symType, SEGMENT segment,
                    225:                     UOFF16 offset, PENUMINFO pEnumInfo )
                    226: {
                    227:     if (symType != SYM_SYMBOL_NAME) {
                    228:         return TRUE;
                    229:     }
                    230: 
                    231:     pEnumInfo->dataSym->rectyp     = S_PUB16;
                    232:     pEnumInfo->dataSym->seg        = segment;
                    233:     pEnumInfo->dataSym->off        = offset;
                    234:     pEnumInfo->dataSym->typind     = 0;
                    235:     pEnumInfo->dataSym->name[0]    = pSymName->length;
                    236:     strncpy( &pEnumInfo->dataSym->name[1], pSymName->name, pSymName->length );
                    237:     pEnumInfo->dataSym2 = NextSym16( pEnumInfo->dataSym );
                    238:     pEnumInfo->dataSym->reclen = (USHORT) ((DWORD)pEnumInfo->dataSym2 -
                    239:                                   (DWORD)pEnumInfo->dataSym) - 2;
                    240:     pEnumInfo->dataSym = pEnumInfo->dataSym2;
                    241:     pEnumInfo->numsyms++;
                    242: 
                    243:     return TRUE;
                    244: }
                    245: 
                    246: DWORD
                    247: CreatePublicsFromSyms( PPOINTERS p )
                    248: 
                    249: /*++
                    250: 
                    251: Routine Description:
                    252: 
                    253:     Creates the individual CV public symbol records.  There is one CV
                    254:     public record created for each COFF symbol that is marked as EXTERNAL
                    255:     and has a section number greater than zero.  The resulting CV publics
                    256:     are sorted by section and offset.
                    257: 
                    258: 
                    259: Arguments:
                    260: 
                    261:     p        - pointer to a POINTERS structure (see cofftocv.h)
                    262: 
                    263: 
                    264: Return Value:
                    265: 
                    266:     The number of publics created.
                    267: 
                    268: --*/
                    269: 
                    270: {
                    271:     OMFSymHash          *omfSymHash;
                    272:     ENUMINFO            enumInfo;
                    273: 
                    274: 
                    275:     enumInfo.dataSym = (DATASYM16 *)
                    276:                  (PUCHAR)((DWORD)p->pCvCurr + sizeof(OMFSymHash));
                    277:     enumInfo.numsyms = 0;
                    278: 
                    279:     EnumSymbols( p, ConvertASymtoPublic, &enumInfo );
                    280: 
                    281:     omfSymHash = (OMFSymHash *) p->pCvCurr;
                    282:     UpdatePtrs(p, &p->pCvPublics, (LPVOID)enumInfo.dataSym,
                    283:                enumInfo.numsyms );
                    284: 
                    285:     omfSymHash->cbSymbol = p->pCvPublics.size - sizeof(OMFSymHash);
                    286:     omfSymHash->symhash  = 0;
                    287:     omfSymHash->addrhash = 0;
                    288:     omfSymHash->cbHSym   = 0;
                    289:     omfSymHash->cbHAddr  = 0;
                    290: 
                    291:     return enumInfo.numsyms;
                    292: }
                    293: 
                    294: 
                    295: BOOL CALLBACK
                    296: ConvertASegment( PSYMNAME pSymName, int symType, SEGMENT segment,
                    297:             UOFF16 offset, PENUMINFO pEnumInfo )
                    298: {
                    299:     if (symType != SYM_SEGMENT_NAME) {
                    300:         return TRUE;
                    301:     }
                    302: 
                    303:     if (segment == 0) {
                    304:         return TRUE;
                    305:     }
                    306: 
                    307:     pEnumInfo->numsyms++;
                    308: 
                    309:     pEnumInfo->sgi->sgf.fRead        = TRUE;
                    310:     pEnumInfo->sgi->sgf.fWrite       = TRUE;
                    311:     pEnumInfo->sgi->sgf.fExecute     = TRUE;
                    312:     pEnumInfo->sgi->sgf.f32Bit       = 0;
                    313:     pEnumInfo->sgi->sgf.fSel         = 0;
                    314:     pEnumInfo->sgi->sgf.fAbs         = 0;
                    315:     pEnumInfo->sgi->sgf.fGroup       = 1;
                    316:     pEnumInfo->sgi->iovl             = 0;
                    317:     pEnumInfo->sgi->igr              = 0;
                    318:     pEnumInfo->sgi->isgPhy           = (USHORT) pEnumInfo->numsyms;
                    319:     pEnumInfo->sgi->isegName         = 0;
                    320:     pEnumInfo->sgi->iclassName       = 0;
                    321:     pEnumInfo->sgi->doffseg          = 0;
                    322:     pEnumInfo->sgi->cbSeg            = 0xFFFF;
                    323:     pEnumInfo->sgi++;
                    324: 
                    325:     return TRUE;
                    326: }
                    327: 
                    328: 
                    329: DWORD
                    330: CreateSegMapFromSyms( PPOINTERS p )
                    331: 
                    332: /*++
                    333: 
                    334: Routine Description:
                    335: 
                    336:     Creates the CV segment map.  The segment map is used by debuggers
                    337:     to aid in address lookups.  One segment is created for each COFF
                    338:     section in the image.
                    339: 
                    340: Arguments:
                    341: 
                    342:     p        - pointer to a POINTERS structure (see cofftocv.h)
                    343: 
                    344: 
                    345: Return Value:
                    346: 
                    347:     The number of segments in the map.
                    348: 
                    349: --*/
                    350: 
                    351: {
                    352:     SGM          *sgm;
                    353:     ENUMINFO     enumInfo;
                    354: 
                    355: 
                    356:     sgm = (SGM *) p->pCvCurr;
                    357:     enumInfo.sgi = (SGI *) ((DWORD)p->pCvCurr + sizeof(SGM));
                    358:     enumInfo.numsyms = 0;
                    359: 
                    360:     EnumSymbols( p, ConvertASegment, &enumInfo );
                    361: 
                    362:     sgm->cSeg = (USHORT)enumInfo.numsyms;
                    363:     sgm->cSegLog = (USHORT)enumInfo.numsyms;
                    364: 
                    365:     UpdatePtrs( p, &p->pCvSegMap, (LPVOID)enumInfo.sgi, enumInfo.numsyms );
                    366: 
                    367:     return enumInfo.numsyms;
                    368: }
                    369: 
                    370: BOOL
                    371: EnumSymbols( PPOINTERS p, SYMBOLENUMPROC lpEnumProc, PENUMINFO pEnumInfo )
                    372: 
                    373: /*++
                    374: 
                    375: Routine Description:
                    376: 
                    377:     This function enumerates all symbols ine the mapped SYM file
                    378: 
                    379: 
                    380: Arguments:
                    381: 
                    382:     p             -  pointer to a POINTERS structure
                    383:     lpEnumProc    -  function to be called once for each function
                    384:     pEnumInfo     -  data to be passed between the caller and the enum func
                    385: 
                    386: Return Value:
                    387: 
                    388:     TRUE     - success
                    389:     FALSE    - failure
                    390: 
                    391: --*/
                    392: 
                    393: {
                    394:     PSYMFILEHEADER      pSymFileHead;
                    395:     PSYMHEADER          pSymHead;
                    396:     PSYMSYMBOL          pSymSymbol;
                    397:     DWORD               i;
                    398:     DWORD               startPosition;
                    399:     DWORD               position;
                    400: 
                    401: 
                    402:     pSymFileHead = (PSYMFILEHEADER) p->iptrs.fptr;
                    403:     pSymSymbol = (PSYMSYMBOL) ((DWORD)pSymFileHead + SIZEOFSYMFILEHEADER +
                    404:                                pSymFileHead->symName.length + 1);
                    405: 
                    406:     if (!lpEnumProc(&pSymFileHead->symName, SYM_SEGMENT_ABS, 
                    407:                     0, 0, pEnumInfo )) {
                    408:         return FALSE;
                    409:     }
                    410: 
                    411:     for (i=0; i<pSymFileHead->numSyms; i++) {
                    412:         if (!lpEnumProc(&pSymSymbol->symName, SYM_SYMBOL_ABS,
                    413:                         0, pSymSymbol->offset, pEnumInfo )) {
                    414:             return FALSE;
                    415:         }
                    416:         pSymSymbol = (PSYMSYMBOL) ((DWORD)pSymSymbol + SIZEOFSYMBOL +
                    417:                                    pSymSymbol->symName.length);
                    418:     }
                    419: 
                    420:     position = startPosition = ((LONG)pSymFileHead->nextOffset) << 4;
                    421: 
                    422:     do {
                    423:         pSymHead = (PSYMHEADER) ((DWORD)p->iptrs.fptr + position);
                    424:         pSymSymbol = (PSYMSYMBOL) ((DWORD)pSymHead + SIZEOFSYMHEADER +
                    425:                                    pSymHead->symName.length);
                    426: 
                    427:         position = ((LONG)pSymHead->nextOffset) << 4;
                    428: 
                    429:         if (!lpEnumProc( &pSymHead->symName, SYM_SEGMENT_NAME,
                    430:                         pSymHead->segment, 0, pEnumInfo )) {
                    431:             return FALSE;
                    432:         }
                    433: 
                    434:         for (i=0; i<pSymHead->numSyms; i++) {
                    435:             if (!lpEnumProc(&pSymSymbol->symName, SYM_SYMBOL_NAME,
                    436:                             pSymHead->segment, pSymSymbol->offset,
                    437:                             pEnumInfo )) {
                    438:                 return FALSE;
                    439:             }
                    440:             pSymSymbol = (PSYMSYMBOL) ((DWORD)pSymSymbol + SIZEOFSYMBOL +
                    441:                                        pSymSymbol->symName.length);
                    442:         }
                    443:     } while ( position != startPosition && position != 0 );
                    444: 
                    445:     return 0;
                    446: }

unix.superglobalmegacorp.com

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