227 lines
5.5 KiB
C
227 lines
5.5 KiB
C
/*++
|
|
|
|
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
|
|
|