mirror of https://github.com/lianthony/NT4.0
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
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);
|
|
}
|
|
};
|