Annotation of mstools/samples/sdktools/image/symedit/cvcommon.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1992  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     cvcommon.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file contians a set of common routines which are used in
        !            12:     doing symbol conversions from one type of symbols to CodeView
        !            13:     symbols.
        !            14: 
        !            15: Author:
        !            16: 
        !            17:     Jim Schaad (jimsch) 22 May 1993
        !            18: 
        !            19: --*/
        !            20: 
        !            21: #include        <windows.h>
        !            22: #include        <stdlib.h>
        !            23: #include        "cv.h"
        !            24: #include        "symcvt.h"
        !            25: #include        "cvcommon.h"
        !            26: 
        !            27: typedef struct tagSYMHASH {
        !            28:     DWORD       dwHashVal;         // hash value for the symbol
        !            29:     DWORD       dwHashBucket;      // hash bucket number
        !            30:     DATASYM16 * dataSym;           // pointer to the symbol info
        !            31: } SYMHASH;
        !            32: 
        !            33: typedef struct tagOFFSETSORT {
        !            34:     DWORD       dwOffset;          // offset for the symbol
        !            35:     DWORD       dwSection;         // section number of the symbol
        !            36:     DATASYM16 * dataSym;           // pointer to the symbol info
        !            37: } OFFSETSORT;
        !            38: 
        !            39: 
        !            40: int _CRTAPI1 SymHashCompare( const void *arg1, const void *arg2 );
        !            41: int _CRTAPI1 OffsetSortCompare( const void *arg1, const void *arg2 );
        !            42: 
        !            43: 
        !            44: DWORD
        !            45: CreateSignature( PPOINTERS p )
        !            46: 
        !            47: /*++
        !            48: 
        !            49: Routine Description:
        !            50: 
        !            51:     Creates the CODEVIEW signature record.  Currently this converter only
        !            52:     generates NB08 data (MS C/C++ 7.0).
        !            53: 
        !            54: 
        !            55: Arguments:
        !            56: 
        !            57:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !            58: 
        !            59: 
        !            60: Return Value:
        !            61: 
        !            62:     number of records generates, this is always 1.
        !            63: 
        !            64: --*/
        !            65: 
        !            66: {
        !            67:     OMFSignature        *omfSig;
        !            68: 
        !            69:     omfSig = (OMFSignature *) p->pCvCurr;
        !            70:     strcpy( omfSig->Signature, "NB08" );
        !            71:     omfSig->filepos = 0;
        !            72:     p->pCvStart.size += sizeof(OMFSignature);
        !            73:     p->pCvCurr = (PUCHAR) p->pCvCurr + sizeof(OMFSignature);
        !            74:     return 1;
        !            75: }                               /* CreateSignature() */
        !            76: 
        !            77: 
        !            78: DWORD
        !            79: CreateDirectories( PPOINTERS p )
        !            80: 
        !            81: /*++
        !            82: 
        !            83: Routine Description:
        !            84: 
        !            85:     This is the control function for the generation of the CV directories.
        !            86:     It calls individual functions for the generation of specific types of
        !            87:     debug directories.
        !            88: 
        !            89: 
        !            90: Arguments:
        !            91: 
        !            92:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !            93: 
        !            94: 
        !            95: Return Value:
        !            96: 
        !            97:     the number of directories created.
        !            98: 
        !            99: --*/
        !           100: 
        !           101: {
        !           102:     OMFDirHeader        *omfDir = (OMFDirHeader *)p->pCvCurr;
        !           103:     OMFSignature        *omfSig = (OMFSignature *)p->pCvStart.ptr;
        !           104:     OMFDirEntry         *omfDirEntry = NULL;
        !           105: 
        !           106:     omfSig->filepos = (DWORD)p->pCvCurr - (DWORD)p->pCvStart.ptr;
        !           107: 
        !           108:     omfDir->cbDirHeader = sizeof(OMFDirHeader);
        !           109:     omfDir->cbDirEntry  = sizeof(OMFDirEntry);
        !           110:     omfDir->cDir        = 0;
        !           111:     omfDir->lfoNextDir  = 0;
        !           112:     omfDir->flags       = 0;
        !           113: 
        !           114:     p->pCvStart.size += sizeof(OMFDirHeader);
        !           115:     p->pCvCurr = (PUCHAR) p->pCvCurr + sizeof(OMFDirHeader);
        !           116: 
        !           117:     omfDir->cDir += CreateModuleDirectoryEntries( p );
        !           118:     omfDir->cDir += CreatePublicDirectoryEntries( p );
        !           119:     omfDir->cDir += CreateSegMapDirectoryEntries( p );
        !           120: 
        !           121:     strcpy(p->pCvCurr, "NB080000");
        !           122:     p->pCvStart.size += 8;
        !           123:     p->pCvCurr += 8;
        !           124:     *((DWORD *) (p->pCvCurr-4)) = p->pCvStart.size;
        !           125: 
        !           126:     return omfDir->cDir;
        !           127: }                               /* CreateDirectories() */
        !           128: 
        !           129: 
        !           130: DWORD
        !           131: CreateModuleDirectoryEntries( PPOINTERS p )
        !           132: 
        !           133: /*++
        !           134: 
        !           135: Routine Description:
        !           136: 
        !           137:     Creates directory entries for each module in the image.
        !           138: 
        !           139: 
        !           140: Arguments:
        !           141: 
        !           142:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           143: 
        !           144: 
        !           145: Return Value:
        !           146: 
        !           147:     the number of directory entries created.
        !           148: 
        !           149: --*/
        !           150: 
        !           151: {
        !           152:     OMFDirEntry   *omfDirEntry = NULL;
        !           153:     OMFModule     *m = NULL;
        !           154:     OMFModule     *mNext = NULL;
        !           155:     DWORD         i = 0;
        !           156:     DWORD         mSize = 0;
        !           157:     DWORD         lfo = (DWORD)p->pCvModules.ptr - (DWORD)p->pCvStart.ptr;
        !           158: 
        !           159:     m = (OMFModule *) p->pCvModules.ptr;
        !           160:     for (i=0; i<p->pCvModules.count; i++) {
        !           161:         mNext = NextMod(m);
        !           162: 
        !           163:         omfDirEntry = (OMFDirEntry *) p->pCvCurr;
        !           164: 
        !           165:         mSize = (DWORD)mNext - (DWORD)m;
        !           166:         omfDirEntry->SubSection = sstModule;
        !           167:         omfDirEntry->iMod       = (USHORT) i + 1;
        !           168:         omfDirEntry->lfo        = lfo;
        !           169:         omfDirEntry->cb         = mSize;
        !           170: 
        !           171:         lfo += mSize;
        !           172: 
        !           173:         p->pCvStart.size += sizeof(OMFDirEntry);
        !           174:         p->pCvCurr = (PUCHAR) p->pCvCurr + sizeof(OMFDirEntry);
        !           175: 
        !           176:         m = mNext;
        !           177:     }
        !           178: 
        !           179:     return p->pCvModules.count;
        !           180: }                               /* CreateModuleDirectoryEntries() */
        !           181: 
        !           182: 
        !           183: DWORD
        !           184: CreatePublicDirectoryEntries( PPOINTERS p )
        !           185: 
        !           186: /*++
        !           187: 
        !           188: Routine Description:
        !           189: 
        !           190:     Creates the directory entry for the global publics.
        !           191: 
        !           192: Arguments:
        !           193: 
        !           194:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           195: 
        !           196: 
        !           197: Return Value:
        !           198: 
        !           199:     the number of directory entries created, always 1.
        !           200: 
        !           201: --*/
        !           202: 
        !           203: {
        !           204:     OMFDirEntry   *omfDirEntry = (OMFDirEntry *) p->pCvCurr;
        !           205: 
        !           206:     omfDirEntry->SubSection = sstGlobalPub;
        !           207:     omfDirEntry->iMod       = 0xffff;
        !           208:     omfDirEntry->lfo        = (DWORD)p->pCvPublics.ptr - (DWORD)p->pCvStart.ptr;
        !           209:     omfDirEntry->cb         = p->pCvPublics.size;
        !           210: 
        !           211:     p->pCvStart.size += sizeof(OMFDirEntry);
        !           212:     p->pCvCurr = (PUCHAR) p->pCvCurr + sizeof(OMFDirEntry);
        !           213: 
        !           214:     return 1;
        !           215: }                               /* CreatePublicDirectoryEntries() */
        !           216: 
        !           217: 
        !           218: DWORD
        !           219: CreateSegMapDirectoryEntries( PPOINTERS p )
        !           220: 
        !           221: /*++
        !           222: 
        !           223: Routine Description:
        !           224: 
        !           225:     Creates the directory entry for the segment map.
        !           226: 
        !           227: 
        !           228: Arguments:
        !           229: 
        !           230:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           231: 
        !           232: 
        !           233: Return Value:
        !           234: 
        !           235:     the number of directory entries created, always 1.
        !           236: 
        !           237: --*/
        !           238: 
        !           239: {
        !           240:     OMFDirEntry   *omfDirEntry = (OMFDirEntry *) p->pCvCurr;
        !           241: 
        !           242:     omfDirEntry->SubSection = sstSegMap;
        !           243:     omfDirEntry->iMod       = 0xffff;
        !           244:     omfDirEntry->lfo        = (DWORD)p->pCvSegMap.ptr - (DWORD)p->pCvStart.ptr;
        !           245:     omfDirEntry->cb         = p->pCvSegMap.size;
        !           246: 
        !           247:     p->pCvStart.size += sizeof(OMFDirEntry);
        !           248:     p->pCvCurr = (PUCHAR) p->pCvCurr + sizeof(OMFDirEntry);
        !           249: 
        !           250:     return 1;
        !           251: }                               /* CreateSegMapDirectoryEntries() */
        !           252: 
        !           253: 
        !           254: DWORD
        !           255: DWordXorLrl( char *szSym )
        !           256: 
        !           257: /*++
        !           258: 
        !           259: Routine Description:
        !           260: 
        !           261:     This function will take an ascii character string and generate
        !           262:     a hash for that string.  The hash algorithm is the CV NB08 hash
        !           263:     algorithm.
        !           264: 
        !           265: 
        !           266: Arguments:
        !           267: 
        !           268:     szSym    - a character pointer, the first char is the string length
        !           269: 
        !           270: 
        !           271: Return Value:
        !           272: 
        !           273:     The generated hash value.
        !           274: 
        !           275: --*/
        !           276: 
        !           277: {
        !           278:     char                *pName = szSym+1;
        !           279:     int                 cb =  *szSym;
        !           280:     char                *pch;
        !           281:     DWORD               hash = 0;
        !           282:     DWORD UNALIGNED     *pul = (DWORD *) pName;
        !           283:     static              rgMask[] = {0, 0xff, 0xffff, 0xffffff};
        !           284: 
        !           285:     pch = pName + cb - 1;
        !           286:     while (isdigit(*pch)) {
        !           287:         pch--;
        !           288:     }
        !           289: 
        !           290:     if (*pch == '@') {
        !           291:         cb = pch - pName;
        !           292:     }
        !           293: 
        !           294:     for (; cb > 3; cb-=4, pul++) {
        !           295:         hash = _lrotl(hash, 4);
        !           296:         hash ^= (*pul & 0xdfdfdfdf);
        !           297:     }
        !           298: 
        !           299:     if (cb > 0) {
        !           300:         hash = _lrotl(hash,4);
        !           301:         hash ^= ((*pul & rgMask[cb]) & 0xdfdfdfdf);
        !           302:     }
        !           303: 
        !           304:     return hash;
        !           305: }                               /* DWordXorLrl() */
        !           306: 
        !           307: 
        !           308: 
        !           309: OMFModule *
        !           310: NextMod(
        !           311:         OMFModule *             pMod
        !           312:         )
        !           313: /*++
        !           314: 
        !           315: Routine Description:
        !           316: 
        !           317:     description-of-function.
        !           318: 
        !           319: Arguments:
        !           320: 
        !           321:     argument-name - Supplies | Returns description of argument.
        !           322:     .
        !           323:     .
        !           324: 
        !           325: Return Value:
        !           326: 
        !           327:     return-value - Description of conditions needed to return value. - or -
        !           328:     None.
        !           329: 
        !           330: --*/
        !           331: 
        !           332: {
        !           333:     char *      pb;
        !           334:     
        !           335:     pb = (char *) &(pMod->SegInfo[pMod->cSeg]);
        !           336:     pb += *pb + 1;
        !           337:     pb = (char *) (((unsigned long) pb + 3) & ~3);
        !           338: 
        !           339:     return (OMFModule *) pb;
        !           340: }                               /* NextMod() */
        !           341: 
        !           342: 
        !           343: 
        !           344: int
        !           345: _CRTAPI1
        !           346: SymHashCompare(
        !           347:                const void *     arg1,
        !           348:                const void *     arg2
        !           349:                )
        !           350: /*++
        !           351: 
        !           352: Routine Description:
        !           353: 
        !           354:     Sort compare function for sorting SYMHASH records by hashed
        !           355:     bucket number.
        !           356: 
        !           357: 
        !           358: Arguments:
        !           359: 
        !           360:     arg1     - record #1
        !           361:     arg2     - record #2
        !           362: 
        !           363: 
        !           364: Return Value:
        !           365: 
        !           366:    -1        - record #1 is < record #2
        !           367:     0        - records are equal
        !           368:     1        - record #1 is > record #2
        !           369: 
        !           370: --*/
        !           371: 
        !           372: {
        !           373:     if (((SYMHASH*)arg1)->dwHashBucket < ((SYMHASH*)arg2)->dwHashBucket) {
        !           374:         return -1;
        !           375:     }
        !           376:     if (((SYMHASH*)arg1)->dwHashBucket > ((SYMHASH*)arg2)->dwHashBucket) {
        !           377:         return 1;
        !           378:     }
        !           379:     return 0;
        !           380: }                               /* SymHashCompare() */
        !           381: 
        !           382: 
        !           383: DWORD
        !           384: CreateSymbolHashTable(
        !           385:                       PPOINTERS p
        !           386:                       )
        !           387: /*++
        !           388: 
        !           389: Routine Description:
        !           390: 
        !           391: 
        !           392:     Creates the CV symbol hash table.  This hash table is used
        !           393:     primarily by debuggers to access symbols in a quick manner.
        !           394: 
        !           395: 
        !           396: Arguments:
        !           397: 
        !           398:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           399: 
        !           400: 
        !           401: Return Value:
        !           402: 
        !           403:     The number of buckets is the hash table.
        !           404: 
        !           405: --*/
        !           406: 
        !           407: {
        !           408:     DWORD               i;
        !           409:     DWORD               j;
        !           410:     int                 k;
        !           411:     DWORD               numsyms;
        !           412:     DWORD               numbuckets;
        !           413:     OMFSymHash          *omfSymHash;
        !           414:     DATASYM16           *dataSymStart;
        !           415:     DATASYM16           *dataSym;
        !           416:     LPVOID              pHashData;
        !           417:     USHORT              *pCHash;
        !           418:     DWORD               *pHashTable;
        !           419:     USHORT              *pBucketCounts;
        !           420:     DWORD               *pChainTable;
        !           421:     SYMHASH             *symHashStart;
        !           422:     SYMHASH             *symHash;
        !           423:     DWORD               dwHashVal;
        !           424:     char *              sz;
        !           425: 
        !           426:     numsyms = p->pCvPublics.count;
        !           427:     numbuckets = (numsyms+9) / 10;
        !           428:     numbuckets = (1 + numbuckets) & ~1;
        !           429: 
        !           430:     symHashStart =
        !           431:     symHash = (SYMHASH *) malloc( numsyms * sizeof(SYMHASH) );
        !           432:     if (symHashStart == NULL) {
        !           433:         return 0;
        !           434:     }
        !           435: 
        !           436:     memset( symHashStart, 0, numsyms * sizeof(SYMHASH) );
        !           437: 
        !           438:     pHashData = (LPVOID) p->pCvCurr;
        !           439:     pCHash = (USHORT *) pHashData;
        !           440:     pHashTable = (DWORD *) ((DWORD)pHashData + sizeof(DWORD));
        !           441:     pBucketCounts = (USHORT *) ((DWORD)pHashTable +
        !           442:                                   (sizeof(DWORD) * numbuckets));
        !           443:     pChainTable = (DWORD *) ((DWORD)pBucketCounts +
        !           444:                                  ((sizeof(USHORT) * numbuckets)));
        !           445: 
        !           446:     omfSymHash = (OMFSymHash *) p->pCvPublics.ptr;
        !           447:     dataSymStart =
        !           448:     dataSym = (DATASYM16 *) ((DWORD)omfSymHash + sizeof(OMFSymHash));
        !           449: 
        !           450:     *pCHash = (USHORT)numbuckets;
        !           451: 
        !           452:     /*
        !           453:      *  cruise thru the symbols and calculate the hash values
        !           454:      *  and the hash bucket numbers; save the info away for later use
        !           455:      */
        !           456:     for (i=0; i<numsyms; i++, symHash++) {
        !           457:         switch( dataSym->rectyp ) {
        !           458:         case S_PUB16:
        !           459:             sz = dataSym->name;
        !           460:             break;
        !           461: 
        !           462:         case S_PUB32:
        !           463:             sz = ((DATASYM32 *) dataSym)->name;
        !           464:             break;
        !           465: 
        !           466:         default:
        !           467:             continue;
        !           468:             exit(1);
        !           469:         }
        !           470:         
        !           471:         dwHashVal = DWordXorLrl( sz );
        !           472:         symHash->dwHashBucket = dwHashVal % numbuckets;
        !           473:         pBucketCounts[symHash->dwHashBucket] += 1;
        !           474:         symHash->dataSym = dataSym;
        !           475:         dataSym = ((DATASYM16 *) ((char *) dataSym + dataSym->reclen + 2));
        !           476:     }
        !           477: 
        !           478:     qsort( (void*)symHashStart, numsyms, sizeof(SYMHASH), SymHashCompare );
        !           479: 
        !           480:     j = (char *)pChainTable - (char *)pHashData;
        !           481:     for (i=0, k = 0; i<numbuckets;
        !           482:          k += pBucketCounts[i], i += 1, pHashTable++ ) {
        !           483:         *pHashTable = (DWORD) j + (k * 4);
        !           484:     }
        !           485: 
        !           486:     dataSymStart = (DATASYM16 *) (PUCHAR)((DWORD)omfSymHash);
        !           487:     for (i=0,symHash=symHashStart; i<numsyms; i++,symHash++,pChainTable++) {
        !           488:         *pChainTable = (DWORD) (DWORD)symHash->dataSym - (DWORD)dataSymStart;
        !           489:     }
        !           490: 
        !           491:     UpdatePtrs( p, &p->pCvSymHash, (LPVOID)pChainTable, numsyms );
        !           492: 
        !           493:     omfSymHash->symhash = 6;
        !           494:     omfSymHash->cbHSym = p->pCvSymHash.size;
        !           495: 
        !           496:     free( symHashStart );
        !           497: 
        !           498:     return numbuckets;
        !           499: }                               /* CreateSymbolHashTable() */
        !           500: 
        !           501: 
        !           502: VOID
        !           503: UpdatePtrs( PPOINTERS p, PPTRINFO pi, LPVOID lpv, DWORD count )
        !           504: 
        !           505: /*++
        !           506: 
        !           507: Routine Description:
        !           508: 
        !           509:     This function is called by ALL functions that put data into the
        !           510:     CV data area.  After putting the data into the CV memory this function
        !           511:     must be called.  It will adjust all of the necessary pointers so the
        !           512:     the next guy doesn't get hosed.
        !           513: 
        !           514: 
        !           515: Arguments:
        !           516: 
        !           517:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           518:     pi       - the CV pointer that is to be updated
        !           519:     lpv      - current pointer into the CV data
        !           520:     count    - the number of items that were placed into the CV data
        !           521: 
        !           522: 
        !           523: Return Value:
        !           524: 
        !           525:     void
        !           526: 
        !           527: --*/
        !           528: 
        !           529: {
        !           530:     pi->ptr = p->pCvCurr;
        !           531:     pi->size = (DWORD) ((DWORD)lpv - (DWORD)p->pCvCurr);
        !           532:     pi->count = count;
        !           533: 
        !           534:     p->pCvStart.size += pi->size;
        !           535:     p->pCvCurr = (PUCHAR) lpv;
        !           536: 
        !           537:     return;
        !           538: }                               /* UpdatePtrs() */
        !           539: 
        !           540: 
        !           541: int
        !           542: _CRTAPI1
        !           543: OffsetSortCompare( const void *arg1, const void *arg2 )
        !           544: 
        !           545: /*++
        !           546: 
        !           547: Routine Description:
        !           548: 
        !           549:     Sort compare function for sorting OFFETSORT records by section number.
        !           550: 
        !           551: 
        !           552: Arguments:
        !           553: 
        !           554:     arg1     - record #1
        !           555:     arg2     - record #2
        !           556: 
        !           557: 
        !           558: Return Value:
        !           559: 
        !           560:    -1        - record #1 is < record #2
        !           561:     0        - records are equal
        !           562:     1        - record #1 is > record #2
        !           563: 
        !           564: --*/
        !           565: 
        !           566: {
        !           567:     if (((OFFSETSORT*)arg1)->dwSection < ((OFFSETSORT*)arg2)->dwSection) {
        !           568:         return -1;
        !           569:     }
        !           570:     if (((OFFSETSORT*)arg1)->dwSection > ((OFFSETSORT*)arg2)->dwSection) {
        !           571:         return 1;
        !           572:     }
        !           573:     if (((OFFSETSORT*)arg1)->dwOffset < ((OFFSETSORT*)arg2)->dwOffset) {
        !           574:         return -1;
        !           575:     }
        !           576:     if (((OFFSETSORT*)arg1)->dwOffset > ((OFFSETSORT*)arg2)->dwOffset) {
        !           577:         return 1;
        !           578:     }
        !           579:     return 0;
        !           580: }                               /* OffsetSortCompare() */
        !           581: 
        !           582: 
        !           583: DWORD
        !           584: CreateAddressSortTable( PPOINTERS p )
        !           585: 
        !           586: /*++
        !           587: 
        !           588: Routine Description:
        !           589: 
        !           590: 
        !           591:     Creates the CV address sort table. This hash table is used
        !           592:     primarily by debuggers to access symbols in a quick manner when
        !           593:     all you have is an address.
        !           594: 
        !           595: Arguments:
        !           596: 
        !           597:     p        - pointer to a POINTERS structure (see cofftocv.h)
        !           598: 
        !           599: 
        !           600: Return Value:
        !           601: 
        !           602:     The number of sections in the table.
        !           603: 
        !           604: --*/
        !           605: 
        !           606: {
        !           607:     DWORD               i;
        !           608:     DWORD               j;
        !           609:     int                 k;
        !           610:     DWORD               numsyms = p->pCvPublics.count;
        !           611:     DWORD               numsections;
        !           612:     OMFSymHash          *omfSymHash;
        !           613:     DATASYM16           *dataSymStart;
        !           614:     DATASYM16           *dataSym;
        !           615:     LPVOID              pAddressData;
        !           616:     USHORT              *pCSeg;
        !           617:     DWORD               *pSegTable;
        !           618:     USHORT              *pOffsetCounts;
        !           619:     DWORD               *pOffsetTable;
        !           620:     OFFSETSORT          *pOffsetSortStart;
        !           621:     OFFSETSORT          *pOffsetSort;
        !           622: 
        !           623:     extern int          CSymSegs;
        !           624: 
        !           625:     if (p->iptrs.fileHdr) {
        !           626:         numsections = p->iptrs.fileHdr->NumberOfSections;
        !           627:     } else if (p->iptrs.sepHdr) {
        !           628:         numsections = p->iptrs.sepHdr->NumberOfSections;
        !           629:     } else {
        !           630:         numsections = CSymSegs;
        !           631:     }
        !           632: 
        !           633:     pOffsetSortStart =
        !           634:       pOffsetSort = (OFFSETSORT *) malloc( numsyms * sizeof(OFFSETSORT) );
        !           635: 
        !           636:     if (pOffsetSort == NULL) {
        !           637:         return 0;
        !           638:     }
        !           639: 
        !           640:     memset( pOffsetSortStart, 0, numsyms * sizeof(OFFSETSORT) );
        !           641: 
        !           642:     pAddressData = (LPVOID) p->pCvCurr;
        !           643:     pCSeg = (USHORT *) pAddressData;
        !           644:     pSegTable = (DWORD *) ((DWORD)pAddressData + sizeof(DWORD));
        !           645:     pOffsetCounts = (USHORT *) ((DWORD)pSegTable +
        !           646:                                 (sizeof(DWORD) * numsections));
        !           647:     pOffsetTable = (DWORD *) ((DWORD)pOffsetCounts +
        !           648:                               ((sizeof(USHORT) * numsections)));
        !           649:     if (numsections & 1) {
        !           650:         pOffsetTable = (DWORD *) ((DWORD)pOffsetTable + 2);
        !           651:     }
        !           652: 
        !           653:     omfSymHash = (OMFSymHash *) p->pCvPublics.ptr;
        !           654:     dataSymStart =
        !           655:       dataSym = (DATASYM16 *) ((DWORD)omfSymHash + sizeof(OMFSymHash));
        !           656: 
        !           657:     *pCSeg = (USHORT)numsections;
        !           658: 
        !           659:     for (i=0;
        !           660:          i<numsyms;
        !           661:          i++, pOffsetSort++)
        !           662:     {
        !           663:         switch(dataSym->rectyp) {
        !           664:         case S_PUB16:
        !           665:             pOffsetSort->dwOffset = dataSym->off;
        !           666:             pOffsetSort->dwSection = dataSym->seg;
        !           667:             break;
        !           668: 
        !           669:         case S_PUB32:
        !           670:             pOffsetSort->dwOffset = ((DATASYM32 *) dataSym)->off;
        !           671:             pOffsetSort->dwSection = ((DATASYM32 *) dataSym)->seg;
        !           672:         }
        !           673:         
        !           674:         pOffsetSort->dataSym = dataSym;
        !           675:         pOffsetCounts[pOffsetSort->dwSection - 1] += 1;
        !           676:         dataSym = ((DATASYM16 *) ((char *) dataSym + dataSym->reclen + 2));    }
        !           677: 
        !           678: //#if 0
        !           679:     qsort((void*)pOffsetSortStart, numsyms, sizeof(OFFSETSORT),
        !           680:           OffsetSortCompare );
        !           681: //#endif
        !           682: 
        !           683:     j = (DWORD) (DWORD)pOffsetTable - (DWORD)pAddressData;
        !           684:     for (i=0, k=0; i<numsections;
        !           685:          k += pOffsetCounts[i], i += 1, pSegTable++) {
        !           686:         *pSegTable = (DWORD) j + (k * 4);
        !           687:     }
        !           688: 
        !           689:     dataSymStart = (DATASYM16 *) (PUCHAR)((DWORD)omfSymHash);
        !           690:     for (i=0, pOffsetSort=pOffsetSortStart;
        !           691:          i < numsyms;
        !           692:          i++, pOffsetSort++, pOffsetTable++) {
        !           693:         *pOffsetTable = (DWORD)pOffsetSort->dataSym - (DWORD)dataSymStart;
        !           694:     }
        !           695: 
        !           696:     UpdatePtrs( p, &p->pCvAddrSort, (LPVOID)pOffsetTable, numsyms );
        !           697: 
        !           698:     omfSymHash->addrhash = 5;
        !           699:     omfSymHash->cbHAddr = p->pCvAddrSort.size;
        !           700: 
        !           701:     free( pOffsetSortStart );
        !           702: 
        !           703:     return numsections;
        !           704: }                               /* CreateAddressSort() */
        !           705: 

unix.superglobalmegacorp.com

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