Source code of Windows XP (NT5)
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.

1550 lines
46 KiB

  1. #include <wmiexts.h>
  2. #include <utilfun.h>
  3. #include <wbemint.h>
  4. #include <tchar.h>
  5. #include <sync.h>
  6. #include <flexq.h>
  7. #include <arrtempl.h>
  8. #include <newnew.h>
  9. #include <malloc.h>
  10. #ifndef POLARITY
  11. #define POLARITY
  12. #endif
  13. #ifndef RELEASE_ME
  14. #define RELEASE_ME
  15. #endif
  16. #ifndef DELETE_ME
  17. #define DELETE_ME
  18. #endif
  19. #ifndef INTERNAL
  20. #define INTERNAL
  21. #endif
  22. #include <wstring.h>
  23. #include <filecach.h>
  24. #include <flexq.h>
  25. #include <arrtempl.h>
  26. #include <hiecache.h>
  27. #include <creposit.h>
  28. void
  29. DumpMemManager(ULONG_PTR pByte)
  30. {
  31. DEFINE_CPP_VAR( CTempMemoryManager, varCTempMemoryManager);
  32. CTempMemoryManager * pTmpAll = GET_CPP_VAR_PTR( CTempMemoryManager , varCTempMemoryManager );
  33. ReadMemory(pByte,pTmpAll,sizeof(CTempMemoryManager),0);
  34. dprintf(" m_dwTotalUsed %08x\n",pTmpAll->m_dwTotalUsed);
  35. dprintf(" m_dwTotalAllocated %08x\n",pTmpAll->m_dwTotalAllocated);
  36. dprintf(" m_dwNumAllocations %08x\n",pTmpAll->m_dwNumAllocations);
  37. dprintf(" m_dwNumMisses %08x\n",pTmpAll->m_dwNumMisses);
  38. DEFINE_CPP_VAR( CFlexArray, varArr);
  39. CFlexArray * pArr = GET_CPP_VAR_PTR(CFlexArray,varArr);
  40. DWORD i;
  41. ReadMemory((ULONG_PTR)pTmpAll->m_pAllocations,pArr,sizeof(CFlexArray),0);
  42. CTempMemoryManager::CAllocation ** pAllocs = (CTempMemoryManager::CAllocation **)_alloca(pArr->m_nSize*sizeof(void*));
  43. ReadMemory((ULONG_PTR)pArr->m_pArray,pAllocs,pArr->m_nSize*sizeof(void*),0);
  44. dprintf(" m_pArray %p %d\n",pArr->m_pArray,pArr->m_nSize);
  45. DWORD dwTotal = 0;
  46. for (i=0;i<pArr->m_nSize;i++)
  47. {
  48. dprintf(" CAllocation %d - %p\n",i,pAllocs[i]);
  49. DEFINE_CPP_VAR( CTempMemoryManager::CAllocation, varCAllocation );
  50. CTempMemoryManager::CAllocation * pCAll = GET_CPP_VAR_PTR( CTempMemoryManager::CAllocation, varCAllocation );
  51. ReadMemory((ULONG_PTR)pAllocs[i],pCAll,sizeof(CTempMemoryManager::CAllocation),0);
  52. dprintf(" m_dwAllocationSize %p\n",pCAll->m_dwAllocationSize);
  53. dprintf(" m_dwUsed %p\n",pCAll->m_dwUsed);
  54. dprintf(" m_dwFirstFree %p\n",pCAll->m_dwFirstFree);
  55. dwTotal += pCAll->m_dwAllocationSize;
  56. }
  57. dprintf(" TOT %p\n",dwTotal);
  58. }
  59. //
  60. //
  61. // dumps the CTempMemoryManagers in repdrvfs
  62. //
  63. //////////////////////////////////////////////////////
  64. DECLARE_API(tmpall)
  65. {
  66. INIT_API();
  67. ULONG_PTR pByte = GetExpression(args);
  68. if (pByte)
  69. {
  70. DumpMemManager(pByte);
  71. return;
  72. }
  73. pByte = GetExpression("repdrvfs!g_Manager");
  74. dprintf("repdrvfs!g_Manager @ %p\n",pByte);
  75. if (pByte)
  76. {
  77. DumpMemManager(pByte);
  78. }
  79. }
  80. //
  81. //
  82. // this enum is copyed from btr.h
  83. //
  84. //
  85. enum { const_DefaultPageSize = 0x2000, const_CurrentVersion = 0x101 };
  86. enum {
  87. PAGE_TYPE_IMPOSSIBLE = 0x0, // Not supposed to happen
  88. PAGE_TYPE_ACTIVE = 0xACCC, // Page is active with data
  89. PAGE_TYPE_DELETED = 0xBADD, // A deleted page on free list
  90. PAGE_TYPE_ADMIN = 0xADDD, // Page zero only
  91. // All pages
  92. OFFSET_PAGE_TYPE = 0, // True for all pages
  93. OFFSET_PAGE_ID = 1, // True for all pages
  94. OFFSET_NEXT_PAGE = 2, // True for all pages (Page continuator)
  95. // Admin Page (page zero) only
  96. OFFSET_LOGICAL_ROOT = 3, // Root of database
  97. };
  98. #define PS_PAGE_SIZE (8192)
  99. #define MIN_ARRAY_KEYS (256)
  100. /*
  101. void
  102. DumpFile(HANDLE hFile,DWORD * pPage)
  103. {
  104. // read the AdminPage
  105. BOOL bRet;
  106. DWORD nRead;
  107. bRet = ReadFile(hFile,pPage,PS_PAGE_SIZE,&nRead,0);
  108. if (bRet && (PS_PAGE_SIZE == nRead))
  109. {
  110. dprintf(" A %08x %08x %08x R %08x F %08x T %08x %08x %08x\n",
  111. pPage[OFFSET_PAGE_TYPE],
  112. pPage[OFFSET_PAGE_ID],
  113. pPage[OFFSET_NEXT_PAGE],
  114. pPage[OFFSET_LOGICAL_ROOT],
  115. pPage[OFFSET_FREE_LIST_ROOT],
  116. pPage[OFFSET_TOTAL_PAGES],
  117. pPage[OFFSET_PAGE_SIZE],
  118. pPage[OFFSET_IMPL_VERSION ]);
  119. }
  120. else
  121. {
  122. dprintf(" ReadFile %d\n",GetLastError());
  123. }
  124. // read the other pages
  125. DWORD i;
  126. DWORD dwTotPages = pPage[OFFSET_TOTAL_PAGES];
  127. for (i=1;i<dwTotPages;i++)
  128. {
  129. bRet = ReadFile(hFile,pPage,PS_PAGE_SIZE,&nRead,0);
  130. if (bRet && (PS_PAGE_SIZE == nRead))
  131. {
  132. dprintf(" %02x %08x %08x %08x - P %08x %08x %08x %08x\n",
  133. i,
  134. pPage[OFFSET_PAGE_TYPE],
  135. pPage[OFFSET_PAGE_ID],
  136. pPage[OFFSET_NEXT_PAGE],
  137. pPage[OFFSET_NEXT_PAGE+1], // Parent
  138. pPage[OFFSET_NEXT_PAGE+2], // NumKey
  139. pPage[OFFSET_NEXT_PAGE+2+pPage[OFFSET_NEXT_PAGE+2]], // UserData
  140. pPage[OFFSET_NEXT_PAGE+2+pPage[OFFSET_NEXT_PAGE+2]+1]); //ChildPageMap
  141. }
  142. }
  143. DWORD dwFileSize = GetFileSize(hFile,NULL);
  144. if (dwFileSize != (dwTotPages)*PS_PAGE_SIZE)
  145. {
  146. dprintf(" filesize %d expected %d\n",dwFileSize,((1+dwTotPages)*PS_PAGE_SIZE));
  147. }
  148. }
  149. */
  150. void PrintDWORDS(DWORD * pDW,DWORD nSize)
  151. {
  152. DWORD i;
  153. for (i=0;i<(nSize/4);i++)
  154. {
  155. dprintf(" %08x %08x %08x %08x %08x\n",i,
  156. pDW[0+i*4],pDW[1+i*4],pDW[2+i*4],pDW[3+i*4]);
  157. }
  158. if (nSize%4)
  159. {
  160. DWORD dwPAD[4];
  161. memset(dwPAD,0xff,sizeof(dwPAD));
  162. memcpy(dwPAD,pDW+i*4,(nSize%4)*sizeof(DWORD));
  163. dprintf(" %08x %08x %08x %08x %08x\n",i,
  164. dwPAD[0],dwPAD[1],dwPAD[2],dwPAD[3]);
  165. }
  166. }
  167. void PrintWORDS(WORD * pDW,DWORD nSize)
  168. {
  169. DWORD i;
  170. for (i=0;i<(nSize/8);i++)
  171. {
  172. dprintf(" %08x %04x %04x %04x %04x %04x %04x %04x %04x\n",i,
  173. pDW[0+i*8],pDW[1+i*8],pDW[2+i*8],pDW[3+i*8],
  174. pDW[4+i*8],pDW[5+i*8],pDW[6+i*8],pDW[7+i*8]);
  175. }
  176. if (nSize%8)
  177. {
  178. WORD dwPAD[8];
  179. memset(dwPAD,0xff,sizeof(dwPAD));
  180. memcpy(dwPAD,pDW+i*8,(nSize%8)*sizeof(WORD));
  181. dprintf(" %08x %04x %04x %04x %04x %04x %04x %04x %04x\n",i,
  182. dwPAD[0],dwPAD[1],dwPAD[2],dwPAD[3],
  183. dwPAD[4],dwPAD[5],dwPAD[6],dwPAD[7]);
  184. }
  185. }
  186. void
  187. DumpPage(DWORD * pPage)
  188. {
  189. if (TRUE)
  190. {
  191. // here we've read the page
  192. if (0xACCC != pPage[OFFSET_PAGE_TYPE])
  193. {
  194. return;
  195. }
  196. dprintf(" SIGN %08x PAGE %08x NEXT %08x\n",
  197. pPage[OFFSET_PAGE_TYPE],pPage[OFFSET_PAGE_ID],pPage[OFFSET_NEXT_PAGE]);
  198. pPage+=3;
  199. dprintf(" PAR %08x NUM %08x\n",pPage[0],pPage[1]);
  200. DWORD dwParent = pPage[0];
  201. DWORD dwNumKey = pPage[1];
  202. pPage+=2;
  203. //DWORD dwAlloc = (dwNumKey<=MIN_ARRAY_KEYS)?MIN_ARRAY_KEYS:dwNumKey;
  204. //DWORD * m_pdwUserData = HeapAlloc(GetProcessHeap(),0,sizeof(DWORD) *());
  205. //DWORD * m_pdwChildPageMap = HeapAlloc(GetProcessHeap(),0,sizeof(DWORD) *(1+));
  206. //WORD * m_pwKeyLookup = HeapAlloc(GetProcessHeap(),0,sizeof(WORD) * ());
  207. // dwNumKey DWORD USER_DATA
  208. // dwNumKey+1 DWORD CHILD_PAGE_MAP
  209. // dwNumKey WORD KEY_LOOKUP
  210. dprintf(" User Data\n");
  211. PrintDWORDS(pPage,dwNumKey);
  212. pPage+=dwNumKey;
  213. dprintf(" Child PageMap\n");
  214. PrintDWORDS(pPage,dwNumKey+1);
  215. pPage+=(dwNumKey+1);
  216. WORD * pKeyLookup = (WORD *)pPage;
  217. dprintf(" Key Lookup\n");
  218. PrintWORDS((WORD *)pPage,dwNumKey);
  219. WORD * pWPage = ((WORD *)pPage + dwNumKey);
  220. dprintf(" KEY CODE %08x\n",*pWPage);
  221. DWORD dwKeyUsed = *pWPage;
  222. pWPage++;
  223. WORD * pKeyCodes = pWPage;
  224. dprintf(" Key Codes\n");
  225. PrintWORDS((WORD *)pWPage,dwKeyUsed);
  226. pWPage += dwKeyUsed;
  227. DWORD dwNumStrings = *pWPage++;
  228. dprintf(" NUM STRINGS %08x\n",dwNumStrings);
  229. WORD * ArrayOffsets = pWPage;
  230. dprintf(" Strings Offsets\n");
  231. PrintWORDS((WORD *)pWPage,dwNumStrings);
  232. pWPage += dwNumStrings;
  233. DWORD dwPoolUsed = *pWPage++;
  234. dprintf(" POOL USED %08x\n",dwPoolUsed);
  235. //
  236. DWORD i;
  237. LPSTR pStrings = (LPSTR)pWPage;
  238. for (i=0;i<dwNumStrings;i++)
  239. {
  240. dprintf(" %08x %04x %s\n",i,ArrayOffsets[i],pStrings+ArrayOffsets[i]);
  241. }
  242. //
  243. // better view
  244. //
  245. for (i=0;i<dwNumKey;i++)
  246. {
  247. DWORD j;
  248. WORD NumToken = pKeyCodes[pKeyLookup[i]];
  249. dprintf(" ( ");
  250. for (j=0;j<NumToken;j++)
  251. {
  252. dprintf("%04x ",pKeyCodes[pKeyLookup[i]+1+j]);
  253. }
  254. dprintf(")\n");
  255. dprintf(" - ");
  256. for (j=0;j<NumToken;j++)
  257. {
  258. //pStrings+ArrayOffsets[i]
  259. dprintf("%s\\",pStrings+ArrayOffsets[pKeyCodes[pKeyLookup[i]+1+j]]);
  260. }
  261. dprintf("\n");
  262. }
  263. }
  264. }
  265. /*
  266. void
  267. DumpAllPages(HANDLE hFile,DWORD * pPage)
  268. {
  269. // read the AdminPage
  270. BOOL bRet;
  271. DWORD nRead;
  272. bRet = ReadFile(hFile,pPage,PS_PAGE_SIZE,&nRead,0);
  273. if (bRet && (PS_PAGE_SIZE == nRead))
  274. {
  275. dprintf(" A %08x %08x %08x R %08x F %08x T %08x %08x %08x\n",
  276. pPage[OFFSET_PAGE_TYPE],
  277. pPage[OFFSET_PAGE_ID],
  278. pPage[OFFSET_NEXT_PAGE],
  279. pPage[OFFSET_LOGICAL_ROOT],
  280. pPage[OFFSET_FREE_LIST_ROOT],
  281. pPage[OFFSET_TOTAL_PAGES],
  282. pPage[OFFSET_PAGE_SIZE],
  283. pPage[OFFSET_IMPL_VERSION ]);
  284. }
  285. else
  286. {
  287. dprintf(" ReadFile %d\n",GetLastError());
  288. return;
  289. }
  290. // read the other pages
  291. DWORD i;
  292. DWORD dwTotPages = pPage[OFFSET_TOTAL_PAGES];
  293. for (i=1;i<dwTotPages;i++)
  294. {
  295. DumpPage(hFile,i,pPage);
  296. }
  297. DWORD dwFileSize = GetFileSize(hFile,NULL);
  298. if (dwFileSize != (dwTotPages)*PS_PAGE_SIZE)
  299. {
  300. dprintf(" filesize %d expected %d\n",dwFileSize,((1+dwTotPages)*PS_PAGE_SIZE));
  301. }
  302. }
  303. */
  304. //
  305. // performs the same operations of CPageFile::ReadMap with a buffer
  306. //
  307. struct debugCPageFile
  308. {
  309. DWORD dwSign;
  310. DWORD dwTrans;
  311. DWORD dwPhysical;
  312. DWORD dwNumPagesA;
  313. DWORD * pPagesA;
  314. DWORD dwPagesFreeList;
  315. DWORD * pFreePages;
  316. DWORD dwSignTail;
  317. debugCPageFile(BYTE * pMap)
  318. {
  319. DWORD * pCurrent = (DWORD *)pMap;
  320. dwSign = *pCurrent++;
  321. dwTrans = *pCurrent++;
  322. dwPhysical = *pCurrent++;
  323. dwNumPagesA = *pCurrent++;
  324. pPagesA = pCurrent;
  325. pCurrent+=dwNumPagesA;
  326. dwPagesFreeList = *pCurrent++;
  327. pFreePages = pCurrent;
  328. pCurrent += dwPagesFreeList;
  329. dwSignTail = *pCurrent;
  330. };
  331. };
  332. struct debugBtrPage
  333. {
  334. DWORD dwPageType;
  335. DWORD dwPageId;
  336. DWORD dwNextPage;
  337. DWORD dwLogicalRoot;
  338. debugBtrPage(BYTE * pBtr)
  339. {
  340. DWORD * pdwCurrent = (DWORD *)pBtr;
  341. dwPageType = *pdwCurrent++;
  342. dwPageId = *pdwCurrent++;
  343. dwNextPage = *pdwCurrent++;
  344. dwLogicalRoot = *pdwCurrent++;
  345. }
  346. };
  347. #define MAP_LEADING_SIGNATURE 0xABCD
  348. #define MAP_TRAILING_SIGNATURE 0xDCBA
  349. void
  350. Dump_Map(HANDLE hFile)
  351. {
  352. HANDLE hFileMap = NULL;
  353. BYTE * pMap = NULL;
  354. DWORD dwSize = 0;
  355. dwSize = GetFileSize(hFile,NULL);
  356. hFileMap = CreateFileMapping(hFile,
  357. NULL,
  358. PAGE_READONLY,
  359. 0,
  360. dwSize,
  361. NULL);
  362. if (hFileMap)
  363. {
  364. pMap = (BYTE *)MapViewOfFile(hFileMap,
  365. FILE_MAP_READ,
  366. 0,0,0);
  367. }
  368. else
  369. {
  370. dprintf("MapViewOfFile(hFileMap) %d\n",GetLastError());
  371. goto cleanup;
  372. };
  373. dwSize = GetFileSize(hFile,NULL);
  374. hFileMap = CreateFileMapping(hFile,
  375. NULL,
  376. PAGE_READONLY,
  377. 0,
  378. dwSize,
  379. NULL);
  380. if (hFileMap)
  381. {
  382. pMap = (BYTE *)MapViewOfFile(hFileMap,
  383. FILE_MAP_READ,
  384. 0,0,0);
  385. }
  386. else
  387. {
  388. dprintf("MapViewOfFile(hFileMapFre) %d\n",GetLastError());
  389. goto cleanup;
  390. };
  391. if (pMap)
  392. {
  393. debugCPageFile a(pMap);
  394. dprintf(" %08x SIGN HEAD\n",a.dwSign);
  395. dprintf(" %08x Trans\n",a.dwTrans);
  396. dprintf(" %08x m_dwPhysPagesA\n",a.dwPhysical);
  397. dprintf(" %08x m_aPageMapA.size()\n",a.dwNumPagesA);
  398. PrintDWORDS(a.pPagesA,a.dwNumPagesA);
  399. dprintf(" %08x m_aPhysFreeListA.size()\n",a.dwPagesFreeList);
  400. PrintDWORDS(a.pFreePages,a.dwPagesFreeList);
  401. dprintf(" %08x SIGN TAIL\n",a.dwSignTail);
  402. }
  403. cleanup:
  404. if (pMap)
  405. UnmapViewOfFile(pMap);
  406. if (hFileMap)
  407. CloseHandle(hFileMap);
  408. };
  409. void
  410. Dump_AdminPage(BYTE * pMap,BYTE * pObj)
  411. {
  412. if (pMap && pObj)
  413. {
  414. debugCPageFile a(pMap);
  415. DWORD i;
  416. DWORD AdminIndex = 0;
  417. do {
  418. if (WMIREP_INVALID_PAGE == a.pPagesA[AdminIndex] ||
  419. WMIREP_RESERVED_PAGE == a.pPagesA[AdminIndex])
  420. {
  421. dprintf("BAD dwNextAdminPage %08x index %x\n",a.pPagesA[AdminIndex],AdminIndex);
  422. break;
  423. }
  424. BYTE * pAdminPage = pObj + (a.pPagesA[AdminIndex]*PS_PAGE_SIZE);
  425. VarObjHeapAdminPage * pAdmin = (VarObjHeapAdminPage *)pAdminPage;
  426. AdminIndex = pAdmin->dwNextAdminPage;
  427. dprintf(" ver %08x Next %08x Ent %08x\n",pAdmin->dwVersion,pAdmin->dwNextAdminPage,pAdmin->dwNumberEntriesOnPage);
  428. VarObjHeapFreeList * pFreeEntry = (VarObjHeapFreeList *)(pAdmin+1);
  429. dprintf(" dwPageId dwFreeSp dwCRC32\n");
  430. if (pAdmin->dwNumberEntriesOnPage > (PS_PAGE_SIZE/sizeof(VarObjHeapFreeList)))
  431. {
  432. dprintf("Suspicious dwNumberEntriesOnPage %08x on page %x\n",pAdmin->dwNumberEntriesOnPage,AdminIndex);
  433. break;
  434. }
  435. for (i=0;i<pAdmin->dwNumberEntriesOnPage;i++)
  436. {
  437. dprintf(" %08x - %08x %08x %08X\n",i,pFreeEntry->dwPageId,pFreeEntry->dwFreeSpace,pFreeEntry->dwCRC32);
  438. pFreeEntry++;
  439. }
  440. } while(AdminIndex);
  441. }
  442. };
  443. void
  444. Dump_Index(BYTE * pMap,BYTE * pBtr)
  445. {
  446. if (pMap && pBtr)
  447. {
  448. debugCPageFile a(pMap);
  449. BYTE * pStart = pBtr + (a.pPagesA[0]*PS_PAGE_SIZE);
  450. debugBtrPage b(pStart);
  451. dprintf(" %08x %08x %08x %08x - %08X\n",b.dwPageType,b.dwPageId,b.dwNextPage,b.dwLogicalRoot,a.pPagesA[0]);
  452. //other pages
  453. DWORD i;
  454. for (i=0;i<a.dwNumPagesA;i++)
  455. {
  456. dprintf(" ---- %08x - %08x\n",i,a.pPagesA[i]);
  457. if (WMIREP_INVALID_PAGE != a.pPagesA[i] &&
  458. WMIREP_RESERVED_PAGE != a.pPagesA[i])
  459. {
  460. pStart = pBtr + (a.pPagesA[i]*PS_PAGE_SIZE);
  461. DumpPage((DWORD *)pStart );
  462. }
  463. }
  464. }
  465. }
  466. #define INDEX_FILE _T("\\FS\\index.btr")
  467. #define INDEX_FILE_MAP _T("\\FS\\index.map")
  468. #define HEAP_FILE _T("\\FS\\Objects.data")
  469. #define HEAP_FILE_MAP _T("\\FS\\Objects.map")
  470. #define REG_WBEM _T("Software\\Microsoft\\WBEM\\CIMOM")
  471. #define REG_DIR _T("Repository Directory")
  472. HANDLE
  473. GetRepositoryFile(TCHAR * pFileName)
  474. {
  475. HKEY hKey;
  476. LONG lRet;
  477. HANDLE hFile = INVALID_HANDLE_VALUE;
  478. lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  479. REG_WBEM,
  480. NULL,
  481. KEY_READ,
  482. &hKey);
  483. if (ERROR_SUCCESS == lRet)
  484. {
  485. TCHAR pPath[MAX_PATH];
  486. DWORD dwType;
  487. DWORD dwLen = MAX_PATH;
  488. lRet = RegQueryValueEx(hKey,
  489. REG_DIR,
  490. NULL,
  491. &dwType,
  492. (BYTE*)pPath,
  493. &dwLen);
  494. if (ERROR_SUCCESS == lRet)
  495. {
  496. TCHAR pPath2[MAX_PATH];
  497. ExpandEnvironmentStrings(pPath,pPath2,MAX_PATH);
  498. lstrcat(pPath2,pFileName);
  499. hFile = CreateFile(pPath2,
  500. GENERIC_READ,
  501. FILE_SHARE_WRITE|FILE_SHARE_READ,
  502. NULL,
  503. OPEN_EXISTING,
  504. 0,NULL);
  505. if (INVALID_HANDLE_VALUE != hFile)
  506. {
  507. // this is the OK path
  508. }
  509. else
  510. {
  511. dprintf("CreateFile(%s) %d\n",pPath2,GetLastError());
  512. }
  513. }
  514. else
  515. {
  516. dprintf("unable to RegQueryValueEx: %d\n",GetLastError());
  517. }
  518. RegCloseKey(hKey);
  519. }
  520. else
  521. {
  522. dprintf("unable to RegOpenKeyEx: %d\n",GetLastError());
  523. }
  524. return hFile;
  525. }
  526. //
  527. // Dumps the .MAP file as a CPageFile
  528. //
  529. /////////////////////////////////////////////
  530. DECLARE_API(fmap)
  531. {
  532. INIT_API();
  533. if (strlen(args))
  534. {
  535. char * pArgs = (char *)args;
  536. while (isspace(*pArgs)) pArgs++;
  537. HANDLE hFile;
  538. hFile = GetRepositoryFile((TCHAR *)pArgs);
  539. if (INVALID_HANDLE_VALUE != hFile)
  540. {
  541. Dump_Map(hFile);
  542. CloseHandle(hFile);
  543. }
  544. else
  545. {
  546. dprintf("GetRepositoryFile %d\n",GetLastError());
  547. }
  548. }
  549. else
  550. {
  551. dprintf("!wmiexts.fmap \\FS\\index.map || \\FS\\objects.map\n");
  552. }
  553. }
  554. //
  555. // Dump the Admin page of the objects.data
  556. //
  557. //////////////////////////////////////////
  558. DECLARE_API(varobj)
  559. {
  560. INIT_API();
  561. HANDLE hFileMap = INVALID_HANDLE_VALUE;
  562. HANDLE hFileObj = INVALID_HANDLE_VALUE;
  563. HANDLE hMappingMap = NULL;
  564. HANDLE hMappingObj = NULL;
  565. DWORD dwSizeMap = 0;
  566. DWORD dwSizeObj = 0;
  567. BYTE * pMap;
  568. BYTE * pObj;
  569. hFileMap = GetRepositoryFile(HEAP_FILE_MAP);
  570. if (INVALID_HANDLE_VALUE == hFileMap)
  571. {
  572. //dprintf("");
  573. goto Cleanup;
  574. }
  575. dwSizeMap = GetFileSize(hFileMap,NULL);
  576. hMappingMap = CreateFileMapping(hFileMap,
  577. NULL,
  578. PAGE_READONLY,
  579. 0,
  580. dwSizeMap,
  581. NULL);
  582. if (hFileMap)
  583. {
  584. pMap = (BYTE *)MapViewOfFile(hMappingMap,
  585. FILE_MAP_READ,
  586. 0,0,0);
  587. }
  588. else
  589. {
  590. dprintf("MapViewOfFile(hMappingMap) %d\n",GetLastError());
  591. goto Cleanup;
  592. };
  593. hFileObj = GetRepositoryFile(HEAP_FILE);
  594. if (INVALID_HANDLE_VALUE == hFileObj)
  595. {
  596. //dprintf("");
  597. goto Cleanup;
  598. }
  599. dwSizeObj = GetFileSize(hFileObj,NULL);
  600. hMappingObj = CreateFileMapping(hFileObj,
  601. NULL,
  602. PAGE_READONLY,
  603. 0,
  604. dwSizeObj,
  605. NULL);
  606. if (hMappingObj)
  607. {
  608. pObj = (BYTE *)MapViewOfFile(hMappingObj,
  609. FILE_MAP_READ,
  610. 0,0,0);
  611. }
  612. else
  613. {
  614. dprintf("MapViewOfFile(hMappingObj) %d\n",GetLastError());
  615. goto Cleanup;
  616. };
  617. if (pMap && pObj)
  618. {
  619. Dump_AdminPage(pMap,pObj);
  620. }
  621. Cleanup:
  622. if (pMap)
  623. UnmapViewOfFile(pMap);
  624. if (hMappingMap)
  625. CloseHandle(hMappingMap);
  626. if (INVALID_HANDLE_VALUE != hFileMap)
  627. CloseHandle(hFileMap);
  628. if (pObj)
  629. UnmapViewOfFile(pObj);
  630. if (hMappingObj)
  631. CloseHandle(hMappingObj);
  632. if (INVALID_HANDLE_VALUE != hFileObj)
  633. CloseHandle(hFileObj);
  634. }
  635. //
  636. // Dump the Admin page of the btr
  637. //
  638. //////////////////////////////////////////
  639. DECLARE_API(btr)
  640. {
  641. INIT_API();
  642. HANDLE hFileMap = INVALID_HANDLE_VALUE;
  643. HANDLE hFileBtr = INVALID_HANDLE_VALUE;
  644. HANDLE hMappingMap = NULL;
  645. HANDLE hMappingBtr = NULL;
  646. DWORD dwSizeMap = 0;
  647. DWORD dwSizeBtr = 0;
  648. BYTE * pMap;
  649. BYTE * pBtr;
  650. hFileMap = GetRepositoryFile(INDEX_FILE_MAP);
  651. if (INVALID_HANDLE_VALUE == hFileMap)
  652. {
  653. //dprintf("");
  654. goto Cleanup;
  655. }
  656. dwSizeMap = GetFileSize(hFileMap,NULL);
  657. hMappingMap = CreateFileMapping(hFileMap,
  658. NULL,
  659. PAGE_READONLY,
  660. 0,
  661. dwSizeMap,
  662. NULL);
  663. if (hFileMap)
  664. {
  665. pMap = (BYTE *)MapViewOfFile(hMappingMap,
  666. FILE_MAP_READ,
  667. 0,0,0);
  668. }
  669. else
  670. {
  671. dprintf("MapViewOfFile(hMappingMap) %d\n",GetLastError());
  672. goto Cleanup;
  673. };
  674. hFileBtr = GetRepositoryFile(INDEX_FILE);
  675. if (INVALID_HANDLE_VALUE == hFileBtr)
  676. {
  677. //dprintf("");
  678. goto Cleanup;
  679. }
  680. dwSizeBtr = GetFileSize(hFileBtr,NULL);
  681. hMappingBtr = CreateFileMapping(hFileBtr,
  682. NULL,
  683. PAGE_READONLY,
  684. 0,
  685. dwSizeBtr,
  686. NULL);
  687. if (hMappingBtr)
  688. {
  689. pBtr = (BYTE *)MapViewOfFile(hMappingBtr,
  690. FILE_MAP_READ,
  691. 0,0,0);
  692. }
  693. else
  694. {
  695. dprintf("MapViewOfFile(hMappingBtr) %d\n",GetLastError());
  696. goto Cleanup;
  697. };
  698. if (pMap && pBtr)
  699. {
  700. Dump_Index(pMap,pBtr);
  701. }
  702. Cleanup:
  703. if (pMap)
  704. UnmapViewOfFile(pMap);
  705. if (hMappingMap)
  706. CloseHandle(hMappingMap);
  707. if (INVALID_HANDLE_VALUE != hFileMap)
  708. CloseHandle(hFileMap);
  709. if (pBtr)
  710. UnmapViewOfFile(pBtr);
  711. if (hMappingBtr)
  712. CloseHandle(hMappingBtr);
  713. if (INVALID_HANDLE_VALUE != hFileBtr)
  714. CloseHandle(hFileBtr);
  715. }
  716. //
  717. //
  718. // dumps the g_FileCache
  719. //
  720. //
  721. /*
  722. DWORD WINAPI
  723. CallBackWriteInst(VOID * pData1)
  724. {
  725. DEFINE_CPP_VAR(CWriteFileInstruction,varCWriteFileInstruction);
  726. CWriteFileInstruction * pWriteInst = GET_CPP_VAR_PTR(CWriteFileInstruction,varCWriteFileInstruction);
  727. if (ReadMemory((ULONG_PTR)pData1,pWriteInst,sizeof(CWriteFileInstruction),NULL))
  728. {
  729. dprintf(" m_lStageOffset %p m_bCommitted %d\n",pWriteInst->m_lStageOffset,pWriteInst->m_bCommitted);
  730. dprintf(" m_dwLen %08x m_Location.m_nFileId %02x m_Location.m_lStartOffset %I64x\n",pWriteInst->m_dwLen,pWriteInst->m_Location.m_nFileId,pWriteInst->m_Location.m_lStartOffset);
  731. dprintf(" m_lZOrder %x m_bReuse %02x\n",pWriteInst->m_lZOrder,pWriteInst->m_bReuse);
  732. }
  733. return 0;
  734. }
  735. void DumpLongStage(ULONG_PTR Addr, // FileCache OOP pointer
  736. CFileCache * pFileCache, // inproc pointer
  737. ULONG_PTR Verbose)
  738. {
  739. //
  740. // CAbstractSource
  741. //
  742. dprintf(" + CLongFileStagingFile %p\n",Addr+FIELD_OFFSET(CFileCache,m_AbstractSource));
  743. CAbstractFileSource * pAbsS = &pFileCache->m_AbstractSource;
  744. CLongFileStagingFile * pLongStage = &pAbsS->m_Stage;
  745. CLongFileStagingFile * pLongStag_OOP = (CLongFileStagingFile *)(Addr + FIELD_OFFSET(CFileCache,m_AbstractSource) + FIELD_OFFSET(CAbstractFileSource,m_Stage));
  746. // CStageMgr members
  747. dprintf(" m_hFile %x m_hFlushFile %x\n",pLongStage->m_hFile,pLongStage->m_hFlushFile);
  748. //long m_lFirstFreeOffset;
  749. //CCritSec m_cs;
  750. dprintf(" m_qToWrite\n");
  751. _List * pList_OOP = (_List *)((BYTE *)pLongStag_OOP + FIELD_OFFSET(CLongFileStagingFile,m_qToWrite));
  752. PrintListCB(pList_OOP,CallBackWriteInst);
  753. dprintf(" m_stReplacedInstructions\n");
  754. pList_OOP = (_List *)((BYTE *)pLongStag_OOP + FIELD_OFFSET(CLongFileStagingFile,m_stReplacedInstructions));
  755. PrintListCB(pList_OOP,NULL);
  756. dprintf(" m_qTransaction\n");
  757. pList_OOP = (_List *)((BYTE *)pLongStag_OOP + FIELD_OFFSET(CLongFileStagingFile,m_qTransaction));
  758. PrintListCB(pList_OOP,CallBackWriteInst);
  759. dprintf(" TransIdx %I64d m_lTransactionStartOffset %x\n",pLongStage->m_nTransactionIndex,pLongStage->m_lTransactionStartOffset);
  760. //BYTE m_TransactionHash[16];
  761. dprintf(" bInTransaction %d bFailedBefore %d lStatus %d\n",pLongStage->m_bInTransaction,pLongStage->m_bFailedBefore,pLongStage->m_lStatus);
  762. //pStage->m_lMaxFileSize;
  763. //pStage->m_lAbortTransactionFileSize;
  764. // bool m_bMustFail;
  765. // bool m_bNonEmptyTransaction;
  766. if (Verbose)
  767. {
  768. // the multimap has the compare function
  769. _Map * pMapStarts = (_Map *)((BYTE*)pLongStag_OOP + sizeof(void *) + FIELD_OFFSET(CLongFileStagingFile,m_mapStarts));
  770. dprintf(" m_mapStarts\n");
  771. dprintf(" std::multimap< { CFileLocation::m_nFileId, CFileLocation::m_lStartOffset }, CWriteFileInstruction* >\n");
  772. PrintMapCB(pMapStarts,TRUE,NULL);
  773. _Map * pMapEnds = (_Map *)((BYTE*)pLongStag_OOP + sizeof(void *) + FIELD_OFFSET(CLongFileStagingFile,m_mapEnds));
  774. dprintf(" m_mapEnds\n");
  775. dprintf(" std::multimap< { CFileLocation::m_nFileId, CFileLocation::m_lStartOffset }, CWriteFileInstruction* >\n");
  776. PrintMapCB(pMapEnds,TRUE,NULL);
  777. }
  778. }
  779. DECLARE_API( stage )
  780. {
  781. INIT_API();
  782. ULONG_PTR Addr = 0;
  783. ULONG_PTR Verbose = GetExpression(args);
  784. Addr = GetExpression("repdrvfs!g_Glob");
  785. if (Addr)
  786. {
  787. Addr += FIELD_OFFSET(CGlobals,m_FileCache);
  788. }
  789. if (Addr)
  790. {
  791. DEFINE_CPP_VAR(CFileCache,varCFileCache);
  792. CFileCache * pFileCache = GET_CPP_VAR_PTR(CFileCache,varCFileCache);
  793. dprintf("CFileCache @ %p\n",Addr);
  794. if (ReadMemory((ULONG_PTR)Addr,pFileCache,sizeof(CFileCache),0))
  795. {
  796. DumpLongStage(Addr,pFileCache,Verbose);
  797. }
  798. else
  799. {
  800. dprintf("RM %p\n",Addr);
  801. }
  802. }
  803. else
  804. {
  805. dprintf("unable to resolve repdrvfs!g_Glob\n");
  806. }
  807. }
  808. */
  809. /*
  810. DECLARE_API( filec_old )
  811. {
  812. INIT_API();
  813. ULONG_PTR Addr = 0;
  814. if (0 != strlen(args))
  815. {
  816. Addr = GetExpression(args);
  817. }
  818. else
  819. {
  820. Addr = GetExpression("repdrvfs!g_Glob");
  821. if (Addr)
  822. {
  823. Addr += FIELD_OFFSET(CGlobals,m_FileCache);
  824. }
  825. }
  826. if (Addr)
  827. {
  828. DEFINE_CPP_VAR(CFileCache,varCFileCache);
  829. CFileCache * pFileCache = GET_CPP_VAR_PTR(CFileCache,varCFileCache);
  830. dprintf("CFileCache @ %p\n",Addr);
  831. if (ReadMemory((ULONG_PTR)Addr,pFileCache,sizeof(CFileCache),0))
  832. {
  833. dprintf(" m_lRef %d\n",pFileCache->m_lRef);
  834. DumpLongStage(Addr,pFileCache,TRUE);
  835. //
  836. // CObjectHeap
  837. //
  838. dprintf(" + CObjectHeap %p\n",Addr+FIELD_OFFSET(CFileCache,m_ObjectHeap));
  839. CObjectHeap * pObjectHeap_OOP = (CObjectHeap *)(Addr+FIELD_OFFSET(CFileCache,m_ObjectHeap));
  840. DEFINE_CPP_VAR(CFileHeap,varCFileHeap);
  841. CFileHeap * pFileHeap = GET_CPP_VAR_PTR(CFileHeap,varCFileHeap);
  842. CFileHeap * pFileHeap_OOP = (CFileHeap *)((ULONG_PTR)pObjectHeap_OOP+FIELD_OFFSET(CObjectHeap,m_Heap));
  843. dprintf(" +++ CFileHeap %p\n",pFileHeap_OOP);
  844. if (ReadMemory((ULONG_PTR)pFileHeap_OOP,pFileHeap,sizeof(CFileHeap),NULL))
  845. {
  846. DEFINE_CPP_VAR(CAbstractFile,varCAbstractFile);
  847. CAbstractFile * pAbstract = GET_CPP_VAR_PTR(CAbstractFile,varCAbstractFile);
  848. dprintf(" m_pMainFile %p\n",pFileHeap->m_pMainFile);
  849. ReadMemory((ULONG_PTR)pFileHeap->m_pMainFile,pAbstract,sizeof(CAbstractFile),NULL);
  850. dprintf(" m_pStage %p m_nId %d\n",pAbstract->m_pStage,pAbstract->m_nId);
  851. dprintf(" m_pFreeFile %p\n",pFileHeap->m_pFreeFile);
  852. ReadMemory((ULONG_PTR)pFileHeap->m_pFreeFile,pAbstract,sizeof(CAbstractFile),NULL);
  853. dprintf(" m_pStage %p m_nId %d\n",pAbstract->m_pStage,pAbstract->m_nId);
  854. dprintf(" m_mapFree\n");
  855. dprintf(" std::map< DWORD , { CRecordInfo::m_dwIndex, CRecordInfo::m_nOffset } >\n");
  856. _Map * pMapFree = (_Map *)((BYTE *)pFileCache->m_ObjectHeap.m_pHeap+FIELD_OFFSET(CFileHeap,m_mapFree));
  857. PrintMapCB(pMapFree,TRUE,NULL);
  858. dprintf(" m_mapFreeOffset\n");
  859. dprintf(" std::map< TOffset , DWORD >\n");
  860. _Map * pMapOffset = (_Map *)((BYTE *)pFileCache->m_ObjectHeap.m_pHeap+FIELD_OFFSET(CFileHeap,m_mapFreeOffset));
  861. PrintMapCB(pMapOffset,TRUE,NULL);
  862. }
  863. else
  864. {
  865. dprintf("RM %p %d\n",Addr,GetLastError());
  866. }
  867. CBtrIndex * pBtrIndex_OOP = (CBtrIndex *)((ULONG_PTR)pObjectHeap_OOP+FIELD_OFFSET(CObjectHeap,m_Index));
  868. dprintf(" +++ CBtrIndex %p\n",pBtrIndex_OOP);
  869. }
  870. else
  871. {
  872. dprintf("RM %p %d\n",Addr,GetLastError());
  873. }
  874. }
  875. else
  876. {
  877. dprintf("cannot resolve repdrvfs!g_Glob\n");
  878. }
  879. }
  880. */
  881. /*
  882. long m_lRef;
  883. BOOL m_bInit;
  884. CPageSource m_TransactionManager;
  885. CObjectHeap m_ObjectHeap;
  886. */
  887. void
  888. Print_CPageCache(ULONG_PTR pPageCache_OOP)
  889. {
  890. DEFINE_CPP_VAR(CPageCache,varCPageCache);
  891. CPageCache * pPageCache = GET_CPP_VAR_PTR(CPageCache,varCPageCache);
  892. dprintf(" + CPageCache @ %p\n",pPageCache_OOP);
  893. if (ReadMemory(pPageCache_OOP,pPageCache,sizeof(CPageCache),NULL))
  894. {
  895. /*
  896. DWORD m_dwStatus;
  897. DWORD m_dwPageSize;
  898. DWORD m_dwCacheSize;
  899. DWORD m_dwCachePromoteThreshold;
  900. DWORD m_dwCacheSpillRatio;
  901. DWORD m_dwLastFlushTime;
  902. DWORD m_dwWritesSinceFlush;
  903. DWORD m_dwLastCacheAccess;
  904. DWORD m_dwReadHits;
  905. DWORD m_dwReadMisses;
  906. DWORD m_dwWriteHits;
  907. DWORD m_dwWriteMisses;
  908. HANDLE m_hFile;
  909. std::vector <SCachePage *, wbem_allocator<SCachePage *> > m_aCache;
  910. */
  911. dprintf(" m_dwStatus %08x\n",pPageCache->m_dwStatus);
  912. dprintf(" m_dwPageSize %08x\n",pPageCache->m_dwPageSize);
  913. dprintf(" m_dwCacheSize %08x\n",pPageCache->m_dwCacheSize);
  914. dprintf(" m_hFile %p\n",pPageCache->m_hFile);
  915. _Vector * pVector;
  916. ULONG_PTR Size;
  917. SCachePage ** ppSCachePage;
  918. pVector = (_Vector *)&pPageCache->m_aCache;
  919. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(SCachePage *);
  920. dprintf(" m_aCache - S %x - P %p\n",Size,pVector->_First);
  921. ppSCachePage = new SCachePage *[Size];
  922. if(ppSCachePage)
  923. {
  924. if (ReadMemory((ULONG_PTR)pVector->_First,ppSCachePage,sizeof(SCachePage *)*Size,NULL))
  925. {
  926. for (ULONG_PTR i=0;i<Size;i++)
  927. {
  928. //dprintf(" - %p - %d\n",ppSCachePage[i],i);
  929. DEFINE_CPP_VAR(SCachePage,varSCachePage);
  930. SCachePage * pSCachePage = GET_CPP_VAR_PTR(SCachePage,varSCachePage);
  931. if (ReadMemory((ULONG_PTR)ppSCachePage[i],pSCachePage,sizeof(SCachePage),NULL))
  932. {
  933. dprintf(" D %d %08x - %p\n",pSCachePage->m_bDirty,pSCachePage->m_dwPhysId,pSCachePage->m_pPage);
  934. }
  935. };
  936. }
  937. delete [] ppSCachePage;
  938. };
  939. }
  940. else
  941. {
  942. dprintf("RM %p\n",pPageCache_OOP);
  943. }
  944. };
  945. void
  946. Print_CPageFile(ULONG_PTR pPageFile_OOP, BOOL bVerbose)
  947. {
  948. DEFINE_CPP_VAR(CPageFile,varCPageFile);
  949. CPageFile * pPageFile = GET_CPP_VAR_PTR(CPageFile,varCPageFile);
  950. dprintf(" + CPageFile @ %p\n",pPageFile_OOP);
  951. if (ReadMemory(pPageFile_OOP,pPageFile,sizeof(CPageFile),NULL))
  952. {
  953. /*
  954. LONG m_lRef;
  955. DWORD m_dwStatus;
  956. DWORD m_dwPageSize;
  957. CRITICAL_SECTION m_cs;
  958. WString m_sDirectory;
  959. WString m_sMapFile;
  960. WString m_sMainFile;
  961. CPageCache *m_pCache;
  962. BOOL m_bInTransaction;
  963. DWORD m_dwLastCheckpoint;
  964. DWORD m_dwTransVersion;
  965. // Generation A Mapping
  966. std::vector <DWORD, wbem_allocator<DWORD> > m_aPageMapA;
  967. std::vector <DWORD, wbem_allocator<DWORD> > m_aPhysFreeListA;
  968. std::vector <DWORD, wbem_allocator<DWORD> > m_aLogicalFreeListA;
  969. std::vector <DWORD, wbem_allocator<DWORD> > m_aReplacedPagesA;
  970. DWORD m_dwPhysPagesA;
  971. // Generation B Mapping
  972. std::vector <DWORD, wbem_allocator<DWORD> > m_aPageMapB;
  973. std::vector <DWORD, wbem_allocator<DWORD> > m_aPhysFreeListB;
  974. std::vector <DWORD, wbem_allocator<DWORD> > m_aLogicalFreeListB;
  975. std::vector <DWORD, wbem_allocator<DWORD> > m_aReplacedPagesB;
  976. DWORD m_dwPhysPagesB;
  977. */
  978. dprintf(" m_lRef %08x\n",pPageFile->m_lRef);
  979. dprintf(" m_dwStatus %08x\n",pPageFile->m_dwStatus);
  980. dprintf(" m_dwPageSize %08x\n",pPageFile->m_dwPageSize);
  981. dprintf(" m_pCache %p\n",pPageFile->m_pCache);
  982. Print_CPageCache((ULONG_PTR)pPageFile->m_pCache);
  983. dprintf(" m_bInTransaction %08x\n",pPageFile->m_bInTransaction);
  984. dprintf(" m_dwLastCheckpoint %08x\n",pPageFile->m_dwLastCheckpoint);
  985. dprintf(" m_dwTransVersion %08x\n",pPageFile->m_dwTransVersion);
  986. _Vector * pVector;
  987. ULONG_PTR Size;
  988. DWORD * pDW;
  989. pVector = (_Vector *)&pPageFile->m_aPageMapA;
  990. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  991. dprintf(" m_aPageMapA - S %x - P %p\n",Size,pVector->_First);
  992. if (bVerbose)
  993. {
  994. pDW = new DWORD[Size];
  995. if(pDW)
  996. {
  997. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  998. {
  999. PrintDWORDS(pDW,Size);
  1000. }
  1001. delete [] pDW;
  1002. };
  1003. }
  1004. pVector = (_Vector *)&pPageFile->m_aPhysFreeListA;
  1005. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1006. dprintf(" m_aPhysFreeListA - S %x - P %p\n",Size,pVector->_First);
  1007. if (bVerbose)
  1008. {
  1009. pDW = new DWORD[Size];
  1010. if(pDW)
  1011. {
  1012. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1013. {
  1014. PrintDWORDS(pDW,Size);
  1015. }
  1016. delete [] pDW;
  1017. };
  1018. };
  1019. pVector = (_Vector *)&pPageFile->m_aLogicalFreeListA;
  1020. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1021. dprintf(" m_aLogicalFreeListA - S %x - P %p\n",Size,pVector->_First);
  1022. if (bVerbose)
  1023. {
  1024. pDW = new DWORD[Size];
  1025. if(pDW)
  1026. {
  1027. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1028. {
  1029. PrintDWORDS(pDW,Size);
  1030. }
  1031. delete [] pDW;
  1032. };
  1033. }
  1034. pVector = (_Vector *)&pPageFile->m_aReplacedPagesA;
  1035. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1036. dprintf(" m_aReplacedPagesA - S %x - P %p\n",Size,pVector->_First);
  1037. if (bVerbose)
  1038. {
  1039. pDW = new DWORD[Size];
  1040. if(pDW)
  1041. {
  1042. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1043. {
  1044. PrintDWORDS(pDW,Size);
  1045. }
  1046. delete [] pDW;
  1047. };
  1048. }
  1049. dprintf(" m_dwPhysPagesA %08x\n",pPageFile->m_dwPhysPagesA);
  1050. pVector = (_Vector *)&pPageFile->m_aPageMapB;
  1051. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1052. dprintf(" m_aPageMapB - S %x - P %p\n",Size,pVector->_First);
  1053. if (bVerbose)
  1054. {
  1055. pDW = new DWORD[Size];
  1056. if(pDW)
  1057. {
  1058. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1059. {
  1060. PrintDWORDS(pDW,Size);
  1061. }
  1062. delete [] pDW;
  1063. };
  1064. }
  1065. pVector = (_Vector *)&pPageFile->m_aPhysFreeListB;
  1066. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1067. dprintf(" m_aPhysFreeListB - S %x - P %p\n",Size,pVector->_First);
  1068. if (bVerbose)
  1069. {
  1070. pDW = new DWORD[Size];
  1071. if(pDW)
  1072. {
  1073. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1074. {
  1075. PrintDWORDS(pDW,Size);
  1076. }
  1077. delete [] pDW;
  1078. };
  1079. }
  1080. pVector = (_Vector *)&pPageFile->m_aLogicalFreeListB;
  1081. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1082. dprintf(" m_aLogicalFreeListB - S %x - P %p\n",Size,pVector->_First);
  1083. if (bVerbose)
  1084. {
  1085. pDW = new DWORD[Size];
  1086. if(pDW)
  1087. {
  1088. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1089. {
  1090. PrintDWORDS(pDW,Size);
  1091. }
  1092. delete [] pDW;
  1093. };
  1094. }
  1095. pVector = (_Vector *)&pPageFile->m_aReplacedPagesB;
  1096. Size = ((ULONG_PTR)pVector->_Last - (ULONG_PTR)pVector->_First)/sizeof(DWORD);
  1097. dprintf(" m_aReplacedPagesB - S %x - P %p\n",Size,pVector->_First);
  1098. if (bVerbose)
  1099. {
  1100. pDW = new DWORD[Size];
  1101. if(pDW)
  1102. {
  1103. if (ReadMemory((ULONG_PTR)pVector->_First,pDW,sizeof(DWORD)*Size,NULL))
  1104. {
  1105. PrintDWORDS(pDW,Size);
  1106. }
  1107. delete [] pDW;
  1108. };
  1109. }
  1110. dprintf(" m_dwPhysPagesB %08x\n",pPageFile->m_dwPhysPagesB);
  1111. }
  1112. else
  1113. {
  1114. dprintf("RM %p\n",pPageFile_OOP);
  1115. }
  1116. }
  1117. DECLARE_API( filec )
  1118. {
  1119. INIT_API();
  1120. ULONG_PTR Addr = 0;
  1121. if (0 != strlen(args))
  1122. {
  1123. Addr = GetExpression(args);
  1124. }
  1125. else
  1126. {
  1127. Addr = GetExpression("repdrvfs!g_Glob");
  1128. if (Addr)
  1129. {
  1130. Addr += FIELD_OFFSET(CGlobals,m_FileCache);
  1131. }
  1132. }
  1133. if (Addr)
  1134. {
  1135. DEFINE_CPP_VAR(CFileCache,varCFileCache);
  1136. CFileCache * pFileCache = GET_CPP_VAR_PTR(CFileCache,varCFileCache);
  1137. dprintf("CFileCache @ %p\n",Addr);
  1138. if (ReadMemory((ULONG_PTR)Addr,pFileCache,sizeof(CFileCache),0))
  1139. {
  1140. dprintf(" m_lRef %d m_bInit %d\n",pFileCache->m_lRef,pFileCache->m_bInit);
  1141. //
  1142. // CPageSource
  1143. //
  1144. dprintf(" + CPageSource %p\n",Addr+FIELD_OFFSET(CFileCache,m_TransactionManager));
  1145. CPageSource * pPageSource_OOP = (CPageSource *)(Addr+FIELD_OFFSET(CFileCache,m_TransactionManager));
  1146. CPageSource * pPageSource = (CPageSource *)((BYTE *)pFileCache+FIELD_OFFSET(CFileCache,m_TransactionManager));
  1147. //dprintf();
  1148. dprintf(" m_dwPageSize %08x\n",pPageSource->m_dwPageSize);
  1149. dprintf(" m_dwLastCheckpoint %08x\n",pPageSource->m_dwLastCheckpoint);
  1150. dprintf(" m_dwCheckpointInterval %08x\n",pPageSource->m_dwCheckpointInterval);
  1151. // WString m_sDirectory;
  1152. // WString m_sBTreeMap;
  1153. // WString m_sObjMap;
  1154. // CPageFile *
  1155. dprintf(" m_pBTreePF %p\n",pPageSource->m_pBTreePF);
  1156. Print_CPageFile((ULONG_PTR)pPageSource->m_pBTreePF,FALSE);
  1157. dprintf(" m_pObjPF %p\n",pPageSource->m_pObjPF);
  1158. Print_CPageFile((ULONG_PTR)pPageSource->m_pObjPF,FALSE);
  1159. //
  1160. // CObjectHeap
  1161. //
  1162. dprintf(" + CObjectHeap %p\n",Addr+FIELD_OFFSET(CFileCache,m_ObjectHeap));
  1163. CObjectHeap * pObjectHeap_OOP = (CObjectHeap *)(Addr+FIELD_OFFSET(CFileCache,m_ObjectHeap));
  1164. DEFINE_CPP_VAR(CVarObjHeap,varCVarObjHeap);
  1165. CVarObjHeap * pVarObjHeap = GET_CPP_VAR_PTR(CVarObjHeap,varCVarObjHeap);
  1166. CVarObjHeap * pVarObjHeap_OOP = (CVarObjHeap *)((ULONG_PTR)pObjectHeap_OOP+FIELD_OFFSET(CObjectHeap,m_Heap));
  1167. dprintf(" +++ CVarObjHeap %p\n",pVarObjHeap_OOP);
  1168. if (ReadMemory((ULONG_PTR)pVarObjHeap_OOP,pVarObjHeap,sizeof(CVarObjHeap),NULL))
  1169. {
  1170. // this pagefile is the same as CPageSource::m_pObjPF
  1171. VarObjAdminPageEntry ** ppEntries = (VarObjAdminPageEntry **)_alloca(sizeof(VarObjAdminPageEntry *)*pVarObjHeap->m_aAdminPages.m_nSize);
  1172. if (ReadMemory((ULONG_PTR)pVarObjHeap->m_aAdminPages.m_pArray,ppEntries,sizeof(VarObjAdminPageEntry *)*pVarObjHeap->m_aAdminPages.m_nSize,NULL))
  1173. {
  1174. for(DWORD i=0;i<pVarObjHeap->m_aAdminPages.m_nSize;i++)
  1175. {
  1176. //VarObjAdminPageEntry
  1177. //dprintf(" - %x P %p\n",i,ppEntries[i]);
  1178. VarObjAdminPageEntry Entry;
  1179. if (ReadMemory((ULONG_PTR)ppEntries[i],&Entry,sizeof(Entry),NULL))
  1180. {
  1181. dprintf(" %08x %p %d\n",Entry.dwPageId,Entry.pbPage,Entry.bDirty);
  1182. }
  1183. else
  1184. {
  1185. dprintf("RM %p\n",ppEntries[i]);
  1186. }
  1187. }
  1188. }
  1189. else
  1190. {
  1191. dprintf("RM %p\n",pVarObjHeap->m_aAdminPages.m_pArray);
  1192. }
  1193. }
  1194. else
  1195. {
  1196. dprintf("RM %p %d\n",pVarObjHeap_OOP,GetLastError());
  1197. }
  1198. DEFINE_CPP_VAR(CBtrIndex,varCBtrIndex);
  1199. CBtrIndex * pBtrIndex = GET_CPP_VAR_PTR(CBtrIndex,varCBtrIndex);
  1200. CBtrIndex * pBtrIndex_OOP = (CBtrIndex *)((ULONG_PTR)pObjectHeap_OOP+FIELD_OFFSET(CObjectHeap,m_Index));
  1201. dprintf(" +++ CBtrIndex %p\n",pBtrIndex_OOP);
  1202. if (ReadMemory((ULONG_PTR)pBtrIndex_OOP,pBtrIndex,sizeof(CBtrIndex),NULL))
  1203. {
  1204. }
  1205. else
  1206. {
  1207. dprintf("RM %p %d\n",pBtrIndex_OOP,GetLastError());
  1208. }
  1209. }
  1210. else
  1211. {
  1212. dprintf("RM %p %d\n",Addr,GetLastError());
  1213. }
  1214. }
  1215. else
  1216. {
  1217. dprintf("cannot resolve repdrvfs!g_Glob\n");
  1218. }
  1219. }
  1220. DWORD
  1221. Dump_CClassRecord(void * pKey,void * pData)
  1222. {
  1223. //dprintf("Dump_CClassRecord\n");
  1224. DEFINE_CPP_VAR(CClassRecord,MyClassRecord);
  1225. CClassRecord * pClassRecord = GET_CPP_VAR_PTR(CClassRecord,MyClassRecord);
  1226. if (pData)
  1227. {
  1228. ReadMemory((ULONG_PTR)pData,pClassRecord,sizeof(CClassRecord),NULL);
  1229. WCHAR pName[MAX_PATH];
  1230. ReadMemory((ULONG_PTR)pClassRecord->m_wszClassName,pName,MAX_PATH,NULL);
  1231. pName[MAX_PATH-1]=0;
  1232. dprintf(" %p - %S\n",pClassRecord->m_pClassDef,pName);
  1233. }
  1234. return 0;
  1235. }
  1236. DWORD
  1237. Dump_CHierarchyCacheMap(void * pKey,void * pData)
  1238. {
  1239. //dprintf("Dump_CHierarchyCacheMap\n");
  1240. DEFINE_CPP_VAR(CHierarchyCache,MyHierarchyCache);
  1241. CHierarchyCache * pHieCache = GET_CPP_VAR_PTR(CHierarchyCache,MyHierarchyCache);
  1242. if (pKey)
  1243. {
  1244. WCHAR pString[MAX_PATH+1];
  1245. pString[MAX_PATH]=0;
  1246. if (ReadMemory((MEMORY_ADDRESS)pKey,pString,MAX_PATH*sizeof(WCHAR),NULL))
  1247. {
  1248. dprintf(" - %S\n",pString);
  1249. }
  1250. }
  1251. if (pData)
  1252. {
  1253. DWORD Num;
  1254. PrintMapCB((_Map *)((ULONG_PTR)pData+FIELD_OFFSET(CHierarchyCache,m_map)),TRUE,Dump_CClassRecord);
  1255. }
  1256. return 0;
  1257. };
  1258. //
  1259. //
  1260. // dumps the Forest Cache
  1261. //
  1262. //
  1263. DECLARE_API( forestc )
  1264. {
  1265. INIT_API();
  1266. ULONG_PTR Addr = 0;
  1267. if (0 != strlen(args))
  1268. {
  1269. Addr = GetExpression(args);
  1270. }
  1271. else
  1272. {
  1273. Addr = GetExpression("repdrvfs!g_Glob");
  1274. if (Addr)
  1275. {
  1276. Addr += FIELD_OFFSET(CGlobals,m_ForestCache);
  1277. }
  1278. }
  1279. if (Addr)
  1280. {
  1281. CForestCache * pForestCache_OOP = (CForestCache *)Addr;
  1282. if (pForestCache_OOP)
  1283. {
  1284. dprintf("CForestCache @ %p\n",pForestCache_OOP);
  1285. DEFINE_CPP_VAR(CForestCache,varCForestCache);
  1286. CForestCache * pForestCache = GET_CPP_VAR_PTR(CForestCache,varCForestCache);
  1287. ReadMemory((ULONG_PTR)pForestCache_OOP,pForestCache,sizeof(CForestCache),0);
  1288. DWORD Num;
  1289. PrintMapCB((_Map *)((ULONG_PTR)pForestCache_OOP+FIELD_OFFSET(CForestCache,m_map)),TRUE,Dump_CHierarchyCacheMap);
  1290. dprintf(" CClassRecord list\n");
  1291. CClassRecord * pCRec = pForestCache->m_pMostRecentlyUsed;
  1292. Num = 0;
  1293. while(pCRec)
  1294. {
  1295. DEFINE_CPP_VAR(CClassRecord,CRec);
  1296. ReadMemory((ULONG_PTR)pCRec,&CRec,sizeof(CClassRecord),0);
  1297. pCRec = ((CClassRecord *)&CRec)->m_pLessRecentlyUsed;
  1298. dprintf(" %d - %p\n",Num,pCRec);
  1299. Num++;
  1300. if (CheckControlC())
  1301. break;
  1302. };
  1303. dprintf(" T %d CClassRecord\n",Num);
  1304. }
  1305. } else {
  1306. dprintf(" unable to resolve repdrvfs!g_Glob\n");
  1307. }
  1308. }