Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
4.1 KiB

//////////////////////////////////////////////////////////////////////////////
// GSI implementation declarations
struct HRFile {
PSYM psym;
int cRef;
};
struct HR {
HR* pnext;
PSYM psym;
int cRef;
HR(HR* pNext, PSYM psym_) : pnext(pNext), psym(psym_), cRef(1)
{ expect(fAlign(this)); }
void* operator new (size_t size, GSI1* pgsi1);
};
struct GSI1 : public GSI {
public:
enum { iphrHash = 4096, iphrFree = iphrHash, iphrMax };
INTV QueryInterfaceVersion();
IMPV QueryImplementationVersion();
PSYM psymForPhr (HR *);
PB NextSym (PB pbSym);
PB HashSym (SZ_CONST szName, PB pbSym);
PB NearestSym (ISECT, OFF, OFF*) {
return NULL; //only supported for publics gsi
}
BOOL Close();
BOOL fSave(SN* psn);
void fixHashIn(PB pb, int nEntries);
BOOL fWriteHash(SN sn, CB* pcb);
void fixSymRecs (void* pOld, void* pNew);
BOOL packProcRef(PSYM psym, IMOD imod, OFF off, OFF *poff);
BOOL packSym (PSYM psym, OFF *poff);
BOOL decRefCnt(OFF off);
protected:
struct Last {
Last() : phr(0), iphr(0) { }
HR* phr;
int iphr;
} last;
PDB1* ppdb1;
DBI1* pdbi1;
HR* rgphrBuckets[iphrMax];
POOL poolSymHash;
BOOL fInit(SN sn_);
GSI1(PDB1* ppdb1_, DBI1* pdbi1_, TPI* ptpi_);
~GSI1();
BOOL readHash(SN sn, OFF offPoolInStream, CB cb);
BOOL fFindRec(ST st, HR*** pphr);
BOOL fInsertNewSym(HR** pphr, PSYM psym, OFF *poff = 0);
BOOL fUnlinkHR(HR** pphr);
BOOL fEnsureSn(SN* psn)
{
return ppdb1->fEnsureSn(psn);
}
BOOL fEnsureNoSn(SN* psn)
{
return ppdb1->fEnsureNoSn(psn);
}
private:
enum {impv = (IMPV) 930803};
TPI* ptpi;
inline BOOL readStream(SN sn_);
inline BOOL writeStream(SN* psn);
inline void incRefCnt(HR** pphr);
BOOL fGetFreeHR(HR** pphr);
virtual BOOL delFromAddrMap(PSYM psym);
virtual BOOL addToAddrMap(PSYM psym);
HASH hashSt(ST st);
HASH hashSz(SZ_CONST sz);
OFF offForSym(PSYM psym)
{
return pdbi1->offForSym(psym);
}
friend BOOL DBI1::OpenGlobals(OUT GSI** ppgsi);
friend void* HR::operator new(size_t, GSI1*);
};
struct PSGSIHDR {
CB cbSymHash;
CB cbAddrMap;
UINT nThunks;
CB cbSizeOfThunk;
ISECT isectThunkTable;
OFF offThunkTable;
UINT nSects;
PSGSIHDR() : cbSymHash(0), cbAddrMap(0), nThunks(0), cbSizeOfThunk(0),
isectThunkTable(0), offThunkTable(0) {}
};
struct PSGSI1: public GSI1 {
public:
PB NearestSym (ISECT isect, OFF off, OUT OFF* disp);
BOOL Close();
BOOL fSave(SN* psn);
BOOL packSym(PSYM psym);
private:
PSGSI1 (PDB1* ppdb1_, DBI1* pdbi1_, TPI* ptpi_, BOOL fWrite_)
: GSI1(ppdb1_, pdbi1_, ptpi_), fCreate(FALSE), fWrite(fWrite_) {}
~PSGSI1();
BOOL fInit(SN sn_);
inline BOOL readStream();
BOOL readAddrMap();
BOOL delFromAddrMap(PSYM psym);
BOOL addToAddrMap(PSYM psym);
BOOL writeStream(SN* psn, Buffer& bufAddrMap);
inline void fixupAddrMap(Buffer& buf, OFF disp);
BOOL readSymsInAddrMap (Buffer& buf);
BOOL mergeAddrMap();
inline void sortBuf(Buffer& buf);
inline BOOL appendResult(PSYM** pppsym, Buffer& buf, BOOL* pValid);
BOOL fCreate;
BOOL fWrite;
PSGSIHDR psgsihdr;
Buffer bufCurAddrMap;
Buffer bufNewAddrMap;
Buffer bufDelAddrMap;
Buffer bufResultAddrMap;
SN sn; // need to remember stream for incremental merge
friend BOOL DBI1::OpenPublics(OUT GSI** ppgsi);
Buffer bufThunkMap;
Buffer bufSectMap;
BOOL readThunkMap();
BOOL addThunkMap(OFF* poffThunkMap, UINT nThunks, CB cbSizeOfThunk,
SO* psoSectMap, UINT nSects, ISECT isectThunkTable, OFF offThunkTable);
friend BOOL DBI1::AddThunkMap(OFF* poffThunkMap, UINT nThunks, CB cbSizeOfThunk,
SO* psoSectMap, UINT nSects, ISECT isectThunkTable, OFF offThunkTable);
static BYTE rgbThunkSym[sizeof(PUBSYM32) + 356];
PB pbInThunkTable (ISECT isect, OFF off, OUT OFF* pdisp);
BOOL fInThunkTable(ISECT isect, OFF off);
OFF offThunkMap(OFF off);
void mapOff(OFF off, OUT ISECT * pisect, OUT OFF* poff);
PB pbFakePubdef(PB pb, ISECT isectThunk, OFF offThunk, OFF disp);
CB cbSizeOfThunkMap()
{
return (CB) (sizeof(OFF) * psgsihdr.nThunks);
}
CB cbSizeOfThunkTable()
{
return (CB) (psgsihdr.cbSizeOfThunk * psgsihdr.nThunks);
}
CB cbSizeOfSectMap()
{
return (CB) (sizeof(SO) * psgsihdr.nSects);
}
};