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

4 years ago
  1. //////////////////////////////////////////////////////////////////////////////
  2. // GSI implementation declarations
  3. struct HRFile {
  4. PSYM psym;
  5. int cRef;
  6. };
  7. struct HR {
  8. HR* pnext;
  9. PSYM psym;
  10. int cRef;
  11. HR(HR* pNext, PSYM psym_) : pnext(pNext), psym(psym_), cRef(1)
  12. { expect(fAlign(this)); }
  13. void* operator new (size_t size, GSI1* pgsi1);
  14. };
  15. struct GSI1 : public GSI {
  16. public:
  17. enum { iphrHash = 4096, iphrFree = iphrHash, iphrMax };
  18. INTV QueryInterfaceVersion();
  19. IMPV QueryImplementationVersion();
  20. PSYM psymForPhr (HR *);
  21. PB NextSym (PB pbSym);
  22. PB HashSym (SZ_CONST szName, PB pbSym);
  23. PB NearestSym (ISECT, OFF, OFF*) {
  24. return NULL; //only supported for publics gsi
  25. }
  26. BOOL Close();
  27. BOOL fSave(SN* psn);
  28. void fixHashIn(PB pb, int nEntries);
  29. BOOL fWriteHash(SN sn, CB* pcb);
  30. void fixSymRecs (void* pOld, void* pNew);
  31. BOOL packProcRef(PSYM psym, IMOD imod, OFF off, OFF *poff);
  32. BOOL packSym (PSYM psym, OFF *poff);
  33. BOOL decRefCnt(OFF off);
  34. protected:
  35. struct Last {
  36. Last() : phr(0), iphr(0) { }
  37. HR* phr;
  38. int iphr;
  39. } last;
  40. PDB1* ppdb1;
  41. DBI1* pdbi1;
  42. HR* rgphrBuckets[iphrMax];
  43. POOL poolSymHash;
  44. BOOL fInit(SN sn_);
  45. GSI1(PDB1* ppdb1_, DBI1* pdbi1_, TPI* ptpi_);
  46. ~GSI1();
  47. BOOL readHash(SN sn, OFF offPoolInStream, CB cb);
  48. BOOL fFindRec(ST st, HR*** pphr);
  49. BOOL fInsertNewSym(HR** pphr, PSYM psym, OFF *poff = 0);
  50. BOOL fUnlinkHR(HR** pphr);
  51. BOOL fEnsureSn(SN* psn)
  52. {
  53. return ppdb1->fEnsureSn(psn);
  54. }
  55. BOOL fEnsureNoSn(SN* psn)
  56. {
  57. return ppdb1->fEnsureNoSn(psn);
  58. }
  59. private:
  60. enum {impv = (IMPV) 930803};
  61. TPI* ptpi;
  62. inline BOOL readStream(SN sn_);
  63. inline BOOL writeStream(SN* psn);
  64. inline void incRefCnt(HR** pphr);
  65. BOOL fGetFreeHR(HR** pphr);
  66. virtual BOOL delFromAddrMap(PSYM psym);
  67. virtual BOOL addToAddrMap(PSYM psym);
  68. HASH hashSt(ST st);
  69. HASH hashSz(SZ_CONST sz);
  70. OFF offForSym(PSYM psym)
  71. {
  72. return pdbi1->offForSym(psym);
  73. }
  74. friend BOOL DBI1::OpenGlobals(OUT GSI** ppgsi);
  75. friend void* HR::operator new(size_t, GSI1*);
  76. };
  77. struct PSGSIHDR {
  78. CB cbSymHash;
  79. CB cbAddrMap;
  80. UINT nThunks;
  81. CB cbSizeOfThunk;
  82. ISECT isectThunkTable;
  83. OFF offThunkTable;
  84. UINT nSects;
  85. PSGSIHDR() : cbSymHash(0), cbAddrMap(0), nThunks(0), cbSizeOfThunk(0),
  86. isectThunkTable(0), offThunkTable(0) {}
  87. };
  88. struct PSGSI1: public GSI1 {
  89. public:
  90. PB NearestSym (ISECT isect, OFF off, OUT OFF* disp);
  91. BOOL Close();
  92. BOOL fSave(SN* psn);
  93. BOOL packSym(PSYM psym);
  94. private:
  95. PSGSI1 (PDB1* ppdb1_, DBI1* pdbi1_, TPI* ptpi_, BOOL fWrite_)
  96. : GSI1(ppdb1_, pdbi1_, ptpi_), fCreate(FALSE), fWrite(fWrite_) {}
  97. ~PSGSI1();
  98. BOOL fInit(SN sn_);
  99. inline BOOL readStream();
  100. BOOL readAddrMap();
  101. BOOL delFromAddrMap(PSYM psym);
  102. BOOL addToAddrMap(PSYM psym);
  103. BOOL writeStream(SN* psn, Buffer& bufAddrMap);
  104. inline void fixupAddrMap(Buffer& buf, OFF disp);
  105. BOOL readSymsInAddrMap (Buffer& buf);
  106. BOOL mergeAddrMap();
  107. inline void sortBuf(Buffer& buf);
  108. inline BOOL appendResult(PSYM** pppsym, Buffer& buf, BOOL* pValid);
  109. BOOL fCreate;
  110. BOOL fWrite;
  111. PSGSIHDR psgsihdr;
  112. Buffer bufCurAddrMap;
  113. Buffer bufNewAddrMap;
  114. Buffer bufDelAddrMap;
  115. Buffer bufResultAddrMap;
  116. SN sn; // need to remember stream for incremental merge
  117. friend BOOL DBI1::OpenPublics(OUT GSI** ppgsi);
  118. Buffer bufThunkMap;
  119. Buffer bufSectMap;
  120. BOOL readThunkMap();
  121. BOOL addThunkMap(OFF* poffThunkMap, UINT nThunks, CB cbSizeOfThunk,
  122. SO* psoSectMap, UINT nSects, ISECT isectThunkTable, OFF offThunkTable);
  123. friend BOOL DBI1::AddThunkMap(OFF* poffThunkMap, UINT nThunks, CB cbSizeOfThunk,
  124. SO* psoSectMap, UINT nSects, ISECT isectThunkTable, OFF offThunkTable);
  125. static BYTE rgbThunkSym[sizeof(PUBSYM32) + 356];
  126. PB pbInThunkTable (ISECT isect, OFF off, OUT OFF* pdisp);
  127. BOOL fInThunkTable(ISECT isect, OFF off);
  128. OFF offThunkMap(OFF off);
  129. void mapOff(OFF off, OUT ISECT * pisect, OUT OFF* poff);
  130. PB pbFakePubdef(PB pb, ISECT isectThunk, OFF offThunk, OFF disp);
  131. CB cbSizeOfThunkMap()
  132. {
  133. return (CB) (sizeof(OFF) * psgsihdr.nThunks);
  134. }
  135. CB cbSizeOfThunkTable()
  136. {
  137. return (CB) (psgsihdr.cbSizeOfThunk * psgsihdr.nThunks);
  138. }
  139. CB cbSizeOfSectMap()
  140. {
  141. return (CB) (sizeof(SO) * psgsihdr.nSects);
  142. }
  143. };