360 lines
7.3 KiB
C
360 lines
7.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
isnext.c
|
|
|
|
Abstract:
|
|
|
|
This file contains the generic routines and initialization code
|
|
for the kernel debugger extensions dll.
|
|
|
|
Author:
|
|
|
|
Munil Shah
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// globals
|
|
//
|
|
|
|
#include "isnspx.h"
|
|
|
|
ENUM_INFO EnumStructureType[] =
|
|
{
|
|
EnumString( IPX_DEVICE_SIGNATURE ),
|
|
EnumString( IPX_ADAPTER_SIGNATURE ),
|
|
EnumString( IPX_BINDING_SIGNATURE ),
|
|
EnumString( IPX_ADDRESS_SIGNATURE ),
|
|
EnumString( IPX_ADDRESSFILE_SIGNATURE ),
|
|
{ 0x4453, "SPX_DEVICE_SIGNATURE" },
|
|
{ 0x4441, "SPX_ADDRESS_SIGNATURE" },
|
|
{ 0x4641, "SPX_ADDRESSFILE_SIGNATURE" },
|
|
{ 0x4643, "SPX_CONNFILE_SIGNATURE" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
EXT_API_VERSION ApiVersion = { 3, 5, EXT_API_VERSION_NUMBER, 0 };
|
|
WINDBG_EXTENSION_APIS ExtensionApis;
|
|
USHORT SavedMajorVersion;
|
|
USHORT SavedMinorVersion;
|
|
BOOLEAN ChkTarget;
|
|
INT Item;
|
|
|
|
HANDLE _hInstance;
|
|
HANDLE _hAdditionalReference;
|
|
HANDLE _hProcessHeap;
|
|
|
|
int _Indent = 0;
|
|
char IndentBuf[ 80 ]={"\0 "};
|
|
|
|
DllInit(
|
|
HANDLE hModule,
|
|
DWORD dwReason,
|
|
DWORD dwReserved
|
|
)
|
|
{
|
|
switch (dwReason) {
|
|
case DLL_THREAD_ATTACH:
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_ATTACH:
|
|
_hInstance = hModule;
|
|
_hAdditionalReference = NULL;
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID
|
|
WinDbgExtensionDllInit(
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
USHORT MajorVersion,
|
|
USHORT MinorVersion
|
|
)
|
|
{
|
|
ExtensionApis = *lpExtensionApis;
|
|
|
|
SavedMajorVersion = MajorVersion;
|
|
SavedMinorVersion = MinorVersion;
|
|
ChkTarget = SavedMajorVersion == 0x0c ? TRUE : FALSE;
|
|
return;
|
|
}
|
|
|
|
DECLARE_API( version )
|
|
{
|
|
#if DBG
|
|
PCHAR DebuggerType = "Checked";
|
|
#else
|
|
PCHAR DebuggerType = "Free";
|
|
#endif
|
|
|
|
dprintf( "%s Extension dll for Build %d debugging %s kernel for Build %d\n",
|
|
DebuggerType,
|
|
VER_PRODUCTBUILD,
|
|
SavedMajorVersion == 0x0c ? "Checked" : "Free",
|
|
SavedMinorVersion
|
|
);
|
|
}
|
|
|
|
VOID
|
|
CheckVersion(
|
|
VOID
|
|
)
|
|
{
|
|
|
|
return;
|
|
|
|
#if DBG
|
|
if ((SavedMajorVersion != 0x0c) || (SavedMinorVersion != VER_PRODUCTBUILD)) {
|
|
dprintf("\r\n*** Extension DLL(%d Checked) does not match target system(%d %s)\r\n\r\n",
|
|
VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" );
|
|
}
|
|
#else
|
|
if ((SavedMajorVersion != 0x0f) || (SavedMinorVersion != VER_PRODUCTBUILD)) {
|
|
dprintf("\r\n*** Extension DLL(%d Free) does not match target system(%d %s)\r\n\r\n",
|
|
VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
LPEXT_API_VERSION
|
|
ExtensionApiVersion(
|
|
VOID
|
|
)
|
|
{
|
|
return &ApiVersion;
|
|
}
|
|
|
|
//
|
|
// Exported functions
|
|
//
|
|
DECLARE_API( help )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Command help for ISN debugger extensions.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
dprintf("NB debugger extension commands:\n\n");
|
|
dprintf("\tnbaddr <ptr> - Dump an NB ADDRESS object\n");
|
|
dprintf("\tnbaddrfile <ptr> - Dump an NB ADDRESS_FILE object\n");
|
|
dprintf("\tnbconn <ptr> - Dump key fields of an NB CONNECTION object\n");
|
|
dprintf("\tnbconnfull <ptr> - Dump all fields of an NB CONNECTION object\n");
|
|
dprintf("\tnbdev [ptr] - Dump key fields of an NB DEVICE object\n");
|
|
dprintf("\tnbdevfull [ptr] - Dump all fields of an NB DEVICE object\n");
|
|
dprintf("\tnbspacketlist [ptr] [-l Max] - Dump SEND_PACKET list upto Max count\n");
|
|
dprintf("\tnbcache\n");
|
|
dprintf("\n");
|
|
|
|
dprintf("SPX debugger extension commands:\n\n");
|
|
dprintf("\tspxdev [ptr] [-l var] - Dump all fields of an IPX DEVICE object\n" );
|
|
dprintf("\tspxaddr <ptr>\n" );
|
|
dprintf("\tspxaddrfile <ptr>\n" );
|
|
dprintf("\tspxconnfile <ptr>\n" );
|
|
dprintf("\n");
|
|
|
|
dprintf("IPX debugger extension commands:\n\n");
|
|
dprintf("\tipxdev [ptr] [-l var] - Dump all fields of an IPX DEVICE object\n" );
|
|
dprintf("\tipxaddr <ptr>\n" );
|
|
dprintf("\tipxaddrfile <ptr>\n" );
|
|
dprintf("\tipxbinding <ptr>\n" );
|
|
dprintf("\tipxadapter <ptr>\n" );
|
|
dprintf("\tipxrequest <ptr> - Turn an IRP into an IPX_ADDRESS_FILE\n" );
|
|
dprintf("\n");
|
|
|
|
dprintf("\tnext - Advance to next element in currently focused list.\n\n" );
|
|
dprintf("\tprev - Advance to previous element in currently focused list.\n\n" );
|
|
|
|
dprintf( "Compiled on " __DATE__ " at " __TIME__ "\n" );
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
dprintSymbolPtr
|
|
(
|
|
PVOID Pointer,
|
|
PCHAR EndOfLine
|
|
)
|
|
{
|
|
UCHAR SymbolName[ 80 ];
|
|
ULONG Displacement;
|
|
|
|
dprintf("%-10lx", ( ULONG )Pointer );
|
|
|
|
GetSymbol( Pointer, SymbolName, &Displacement );
|
|
|
|
if ( Displacement == 0 )
|
|
{
|
|
dprintf( "(%s)%s", SymbolName, EndOfLine );
|
|
}
|
|
else
|
|
{
|
|
dprintf( "(%s + 0x%X)%s", SymbolName, Displacement, EndOfLine );
|
|
}
|
|
}
|
|
|
|
VOID
|
|
dprint_nchar
|
|
(
|
|
PCHAR pch,
|
|
int cch
|
|
)
|
|
{
|
|
CHAR ch;
|
|
int index;
|
|
|
|
for ( index = 0; index < cch; index ++ )
|
|
{
|
|
ch = pch[ index ];
|
|
dprintf( "%c", ( ch >= 32 ) ? ch : '.' );
|
|
}
|
|
}
|
|
|
|
VOID
|
|
dprint_hardware_address
|
|
(
|
|
PUCHAR Address
|
|
)
|
|
{
|
|
dprintf( "%02x-%02x-%02x-%02x-%02x-%02x",
|
|
Address[ 0 ],
|
|
Address[ 1 ],
|
|
Address[ 2 ],
|
|
Address[ 3 ],
|
|
Address[ 4 ],
|
|
Address[ 5 ] );
|
|
}
|
|
|
|
VOID
|
|
dprint_network_address
|
|
(
|
|
PUCHAR Address
|
|
)
|
|
{
|
|
dprintf( "%02x-%02x-%02x-%02x",
|
|
Address[ 0 ],
|
|
Address[ 1 ],
|
|
Address[ 2 ],
|
|
Address[ 3 ]);
|
|
}
|
|
|
|
BOOL
|
|
dprint_enum_name
|
|
(
|
|
ULONG Value,
|
|
PENUM_INFO pEnumInfo
|
|
)
|
|
{
|
|
while ( pEnumInfo->pszDescription != NULL )
|
|
{
|
|
if ( pEnumInfo->Value == Value )
|
|
{
|
|
dprintf( "%.40s", pEnumInfo->pszDescription );
|
|
return( TRUE );
|
|
}
|
|
pEnumInfo ++;
|
|
}
|
|
|
|
dprintf( "Unknown enumeration value." );
|
|
return( FALSE );
|
|
}
|
|
|
|
BOOL
|
|
dprint_flag_names
|
|
(
|
|
ULONG Value,
|
|
PFLAG_INFO pFlagInfo
|
|
)
|
|
{
|
|
BOOL bFoundOne = FALSE;
|
|
|
|
while ( pFlagInfo->pszDescription != NULL )
|
|
{
|
|
if ( pFlagInfo->Value & Value )
|
|
{
|
|
if ( bFoundOne )
|
|
{
|
|
dprintf( " | " );
|
|
}
|
|
bFoundOne = TRUE;
|
|
|
|
dprintf( "%.15s", pFlagInfo->pszDescription );
|
|
}
|
|
pFlagInfo ++;
|
|
}
|
|
|
|
return( bFoundOne );
|
|
}
|
|
|
|
BOOL
|
|
dprint_masked_value
|
|
(
|
|
ULONG Value,
|
|
ULONG Mask
|
|
)
|
|
{
|
|
CHAR Buf[ 9 ];
|
|
ULONG nibble;
|
|
int index;
|
|
|
|
for ( index = 0; index < 8; index ++ )
|
|
{
|
|
nibble = ( Mask & 0xF0000000 );
|
|
/*
|
|
dprintf( "#%d: nibble == %08X\n"
|
|
" Mask == %08X\n"
|
|
" Value == %08X\n", index, nibble, Mask, Value );
|
|
|
|
*/
|
|
if ( nibble )
|
|
{
|
|
Buf[ index ] = "0123456789abcdef"[ (( nibble & Value ) >> 28) & 0xF ];
|
|
}
|
|
else
|
|
{
|
|
Buf[ index ] = ' ';
|
|
}
|
|
|
|
Mask <<= 4;
|
|
Value <<= 4;
|
|
}
|
|
|
|
Buf[ 8 ] = '\0';
|
|
|
|
dprintf( "%s", Buf );
|
|
|
|
return( TRUE );
|
|
}
|