/*++ Copyright (c) 1999-2001 Microsoft Corporation Module Name: opaqueid.c Abstract: Dumps the Opaque ID table. Author: Keith Moore (keithmo) 10-Sep-1999 Environment: User Mode. Revision History: --*/ #include "precomp.h" // // Private prototypes. // // // Public functions. // DECLARE_API( opaqueid ) /*++ Routine Description: Dumps the Opaque ID table. Arguments: None. Return Value: None. --*/ { ULONG_PTR address; UL_ALIGNED_OPAQUE_ID_TABLE OpaqueIdTables[MAXIMUM_PROCESSORS]; PUL_OPAQUE_ID_TABLE_ENTRY *firstLevelTable = NULL; ULONG firstLevelTableInUse; ULONG result; LONG iSubTable, i, j, k; LONG BaseIdCyclic; LONG SecondaryIdCyclic; CHAR signature[sizeof("1234")]; UL_OPAQUE_ID_TABLE_ENTRY secondLevelTable[SECOND_LEVEL_TABLE_SIZE]; UL_OPAQUE_ID_INTERNAL internal; LONG NumberOfProcessors; SNAPSHOT_EXTENSION_DATA(); // // CODEWORK: Add a read-variable function to encapsulate all of // this repetitive goo // // // Read the size of the first-level lookup table. // address = GetExpression( "&http!g_UlOpaqueIdTable" ); if (address == 0) { dprintf( "opaqueid: cannot find http!g_UlOpaqueIdTable\n" ); goto cleanup; } if (!ReadMemory( address, &OpaqueIdTables[0], sizeof(OpaqueIdTables), &result )) { dprintf( "opaqueid: cannot read g_UlOpaqueIdTable[0..%u] @ %p\n", MAXIMUM_PROCESSORS-1, address ); goto cleanup; } address = GetExpression( "&http!g_UlNumberOfProcessors" ); if (address == 0) { dprintf( "opaqueid: cannot find http!g_UlNumberOfProcessors\n" ); goto cleanup; } if (!ReadMemory( address, &NumberOfProcessors, sizeof(NumberOfProcessors), &result )) { dprintf( "opaqueid: cannot read g_UlNumberOfProcessors @ %p\n", address ); goto cleanup; } dprintf( "(%u subtables)\n\n", NumberOfProcessors); for (iSubTable = 0; iSubTable < NumberOfProcessors; iSubTable++) { // // Allocate and read the first level table. // firstLevelTableInUse = OpaqueIdTables[iSubTable].OpaqueIdTable.FirstLevelTableInUse; firstLevelTable = (PUL_OPAQUE_ID_TABLE_ENTRY*) ALLOC( firstLevelTableInUse * sizeof(*firstLevelTable) ); if (firstLevelTable == NULL) { dprintf("opaqueid: cannot allocate FirstLevelTable[%u]" " (%u entries)\n", iSubTable, firstLevelTableInUse); goto cleanup; } if (!ReadMemory( (ULONG_PTR) OpaqueIdTables[iSubTable].OpaqueIdTable.FirstLevelTable, firstLevelTable, firstLevelTableInUse * sizeof(*firstLevelTable), &result )) { dprintf( "opaqueid: cannot read " "OpaqueIdTables[%u].FirstLevelTable @ %p\n", iSubTable, OpaqueIdTables[iSubTable].OpaqueIdTable.FirstLevelTable ); goto cleanup; } dprintf( "opaqueid: OpaqueIdTables[%u].FirstLevelTable @ %p\n", iSubTable, OpaqueIdTables[iSubTable].OpaqueIdTable.FirstLevelTable); #ifdef OPAQUE_ID_INSTRUMENTATION dprintf( "\tNumberOfAllocations=%I64d, NumberOfFrees=%I64d, " "NumberOfTotalGets=%I64d, NumberOfSuccessfulGets=%I64d, " "Reallocs=%d.\n", OpaqueIdTables[iSubTable].OpaqueIdTable.NumberOfAllocations, OpaqueIdTables[iSubTable].OpaqueIdTable.NumberOfFrees, OpaqueIdTables[iSubTable].OpaqueIdTable.NumberOfTotalGets, OpaqueIdTables[iSubTable].OpaqueIdTable.NumberOfSuccessfulGets, firstLevelTableInUse); #endif // OPAQUE_ID_INSTRUMENTATION for (i = 0 ; i < (LONG)firstLevelTableInUse ; i++) { dprintf( " SecondLevelTable[%u] @ %p\n", i, firstLevelTable[i] ); if (!ReadMemory( (ULONG_PTR) firstLevelTable[i], secondLevelTable, sizeof(secondLevelTable), &result )) { dprintf( " cannot read SecondLevelTable[%u] @ %p\n", i, firstLevelTable[i] ); continue; } for (j = SECOND_LEVEL_TABLE_SIZE ; --j>= 0 ; ) { if (secondLevelTable[j].OpaqueIdType != UlOpaqueIdTypeInvalid) { dprintf( " pContext - %p, " " EntryOpaqueIdCyclic - %x, " " Lock %x, " " OpaqueIdCyclic - %x, " " OpaqueIdType - %d.\n", secondLevelTable[j].pContext, secondLevelTable[j].EntryOpaqueIdCyclic, secondLevelTable[j].Lock, secondLevelTable[j].OpaqueIdCyclic, secondLevelTable[j].OpaqueIdType ); } } } FREE( firstLevelTable ); firstLevelTable = NULL; } cleanup: if (firstLevelTable != NULL) { FREE( firstLevelTable ); } } // opaqueid