windows-nt/Source/XPSP1/NT/base/tools/kdexts2/isapnp.c
2020-09-26 16:20:57 +08:00

490 lines
14 KiB
C

/*++
Copyright (c) 1997-1998 Microsoft Corporation
Module Name:
isapnp.c
Abstract:
WinDbg Extension Api for ISAPNP
Author:
Robert Nelson 4/99
Environment:
User Mode.
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define FLAG_NAME(flag) {flag, #flag}
FLAG_NAME IsapnpExtensionFlags[] = {
FLAG_NAME(DF_DELETED), // 00000001
FLAG_NAME(DF_REMOVED), // 00000002
FLAG_NAME(DF_NOT_FUNCTIONING), // 00000004
FLAG_NAME(DF_ENUMERATED), // 00000008
FLAG_NAME(DF_ACTIVATED), // 00000010
FLAG_NAME(DF_QUERY_STOPPED), // 00000020
FLAG_NAME(DF_SURPRISE_REMOVED), // 00000040
FLAG_NAME(DF_PROCESSING_RDP), // 00000080
FLAG_NAME(DF_STOPPED), // 00000100
FLAG_NAME(DF_RESTARTED_MOVED), // 00000200
FLAG_NAME(DF_RESTARTED_NOMOVE), // 00000400
FLAG_NAME(DF_REQ_TRIMMED), // 00000800
FLAG_NAME(DF_READ_DATA_PORT), // 40000000
FLAG_NAME(DF_BUS), // 80000000
{0,0}
};
PUCHAR DevExtIsapnpSystemPowerState[] = {
"Unspecified",
"Working",
"Sleeping1",
"Sleeping2",
"Sleeping3",
"Hibernate",
"Shutdown"
};
PUCHAR DevExtIsapnpDevicePowerState[] = {
"Unspecified",
"D0",
"D1",
"D2",
"D3"
};
PUCHAR IsapnpStates[] = {
"Unknown",
"WaitForKey",
"Sleep",
"Isolation",
"Config"
};
extern
VOID
DevExtIsapnp(
ULONG64 Extension
);
BOOL
DumpIsaBusInfo(
ULONG Depth,
ULONG64 BusInformation,
BOOL Verbose,
BOOL DumpCards,
BOOL DumpDevices
);
BOOL
DumpIsaCardInfo(
ULONG Depth,
ULONG64 CardInformation,
BOOL Verbose,
BOOL DumpCards,
BOOL DumpDevices
);
BOOL
DumpIsaDeviceInfo(
ULONG Depth,
ULONG64 DeviceInformation,
BOOL Verbose,
BOOL DumpDevices
);
VOID
DevExtIsapnp(
ULONG64 Extension
)
/*++
Routine Description:
Dump an ISAPNP Device extension.
Arguments:
Extension Address of the extension to be dumped.
Return Value:
None.
--*/
{
ULONG flags, result;
if (!ReadMemory(Extension, &flags, sizeof(flags), &result) ) {
dprintf("Could not read Device Extension flags at 0x%08p\n", Extension);
return;
}
if (flags & DF_BUS) {
DumpIsaBusInfo( 0, Extension, TRUE, FALSE, FALSE );
} else {
DumpIsaDeviceInfo( 0, Extension, TRUE, FALSE );
}
}
DECLARE_API( isainfo )
/*++
Routine Description:
Dumps a CARD_INFORMATION structure.
Arguments:
args Address of the CARD_INFORMATION structure
Return Value:
None.
--*/
{
ULONG64 cardInfo = 0;
ULONG64 addr, entry;
BOOL continueDump = TRUE;
ULONG flags = 0;
if (GetExpressionEx(args, &cardInfo, &args)) {
flags = (ULONG) GetExpression(args);
}
if (cardInfo == 0) {
addr = GetExpression("isapnp!PipBusExtension");
if (addr == 0) {
dprintf("Error retrieving address of PipBusExtension\n");
return E_INVALIDARG;
}
if (!ReadPointer(addr, &entry) ) {
dprintf("Could not read PipBusExtension at 0x%08p\n", addr);
return E_INVALIDARG;
}
while (continueDump && entry != 0) {
if (CheckControlC()) {
continueDump = FALSE;
break;
}
if (InitTypeRead(entry, isapnp!_BUS_EXTENSION_LIST) ) {
dprintf("Could not read isapnp!_BUS_EXTENSION_LIST at 0x%08p\n", entry);
return E_INVALIDARG;
}
entry = ReadField(Next);
continueDump = DumpIsaBusInfo( 0,
ReadField(BusExtension),
flags & 1,
TRUE,
TRUE);
}
} else {
DumpIsaCardInfo(0, cardInfo, TRUE, FALSE, FALSE);
}
return S_OK;
} // isainfo
BOOL
DumpIsaBusInfo(
ULONG Depth,
ULONG64 BusInformation,
BOOL Verbose,
BOOL DumpCards,
BOOL DumpDevices
)
{
ULONG64 cardInformation;
ULONG64 addr;
ULONG64 PipRDPNode;
ULONG Off;
ULONG state;
BOOL continueDump = TRUE;
ULONG64 CardNext;
//
// device extension for ISAPNP FDO
//
if (CheckControlC()) {
return FALSE;
}
if (InitTypeRead(BusInformation, isapnp!_PI_BUS_EXTENSION)) {
dprintf("Could not read Card Information at 0x%08p\n", BusInformation);
return FALSE;
}
xdprintf(Depth,"");
dprintf(
"ISA PnP FDO @ 0x%08p, DevExt @ 0x%08p, Bus # %d\n",
ReadField(FunctionalBusDevice),
BusInformation,
(ULONG) ReadField(BusNumber));
DumpFlags( Depth, "Flags", (ULONG) ReadField(Flags), IsapnpExtensionFlags);
dprintf("\n");
if (Verbose) {
addr = GetExpression("isapnp!PipState");
if (addr != 0) {
if (state = GetUlongFromAddress(addr)) {// , "PNPISA_STATE", NULL, state)) {
xdprintf(
Depth,
"State - %s\n",
IsapnpStates[state]);
}
}
xdprintf(Depth,"");
dprintf( "NumberCSNs - %d\n", (ULONG) ReadField(NumberCSNs));
xdprintf(Depth,"");
dprintf(
"ReadDataPort - 0x%08p (%smapped)\n",
ReadField(ReadDataPort),
ReadField(DataPortMapped) ? "" : "not ");
xdprintf(Depth,"");
dprintf(
"AddressPort - 0x%08p (%smapped)\n",
ReadField(AddressPort),
ReadField(AddrPortMapped) ? "" : "not ");
xdprintf(Depth,"");
dprintf(
"CommandPort - 0x%08p (%smapped)\n",
ReadField(CommandPort),
ReadField(CmdPortMapped) ? "" : "not ");
xdprintf(Depth,"");dprintf( "DeviceList - 0x%08p\n", ReadField(DeviceList));
xdprintf(Depth,"");dprintf( "CardList - 0x%08p\n", ReadField(CardList));
xdprintf(Depth,"");dprintf( "PhysicalBusDevice - 0x%08p\n", ReadField(PhysicalBusDevice));
xdprintf(Depth,"");dprintf( "AttachedDevice - 0x%08p\n", ReadField(AttachedDevice));
xdprintf(Depth,"");dprintf( "SystemPowerState - %s\n",
DevExtIsapnpSystemPowerState[(ULONG) ReadField(SystemPowerState)]);
xdprintf(Depth,"");dprintf( "DevicePowerState - %s\n\n",
DevExtIsapnpDevicePowerState[(ULONG) ReadField(DevicePowerState)]);
}
CardNext = ReadField(CardList.Next);
if (DumpDevices && ReadField(BusNumber) == 0) {
addr = GetExpression("isapnp!PipRDPNode");
if (addr != 0) {
if (!ReadPointer(addr, &PipRDPNode)) {
dprintf("Could not read PipRDPNode at 0x%08p\n", addr);
return FALSE;
}
continueDump = DumpIsaDeviceInfo( Depth + 1, PipRDPNode, Verbose, DumpDevices );
} else {
dprintf("Error retrieving address of PipBusExtension\n");
}
}
GetFieldOffset("isapnp!_CARD_INFORMATION_", "CardList", &Off);
if (DumpCards && CardNext != 0) {
cardInformation = CardNext - Off;
continueDump = DumpIsaCardInfo( Depth + 1, cardInformation, Verbose, DumpCards, DumpDevices );
}
return continueDump;
}
BOOL
DumpIsaCardInfo(
ULONG Depth,
ULONG64 CardInformation,
BOOL Verbose,
BOOL DumpCards,
BOOL DumpDevices
)
{
ULONG64 deviceInformation;
UCHAR idString[8], *compressedID;
BOOL continueDump = TRUE;
ULONG VenderId;
ULONG DevOff, CardOff;
static UCHAR HexDigits[16] = "0123456789ABCDEF";
GetFieldOffset("isapnp!_DEVICE_INFORMATION_", "LogicalDeviceList", &DevOff);
GetFieldOffset("isapnp!_CARD_INFORMATION_", "CardList", &CardOff);
do {
ULONG64 CardData, CardNext, LogNext, CardList;
if (CheckControlC()) {
continueDump = FALSE;
break;
}
if (InitTypeRead(CardInformation, _CARD_INFORMATION_) ) {
dprintf("Could not read Card Information at 0x%08p\n", CardInformation);
return FALSE;
}
CardData = ReadField(CardData);
xdprintf(Depth,"");
dprintf("ISA PnP Card Information @ 0x%08p, CSN = %d, ID ", CardInformation, (ULONG) ReadField(CardSelectNumber));
if (ReadField(CardDataLength) >= GetTypeSize("isapnp!_SERIAL_IDENTIFIER_")) {
ULONG SerialNumber;
if (GetFieldValue(CardData, "_SERIAL_IDENTIFIER_", "VenderId", VenderId) ) {
dprintf("\nCould not read CardData at 0x%08p\n", CardData);
return FALSE;
}
compressedID = (PUCHAR)&VenderId;
idString[0] = (compressedID[0] >> 2) + 0x40;
idString[1] = (((compressedID[0] & 0x03) << 3) | (compressedID[1] >> 5)) + 0x40;
idString[2] = (compressedID[1] & 0x1f) + 0x40;
idString[3] = HexDigits[compressedID[2] >> 4];
idString[4] = HexDigits[compressedID[2] & 0x0F];
idString[5] = HexDigits[compressedID[3] >> 4];
idString[6] = HexDigits[compressedID[3] & 0x0F];
idString[7] = 0x00;
if (GetFieldValue(CardData, "_SERIAL_IDENTIFIER_", "SerialNumber",SerialNumber)) {
dprintf("\nCould not read CardData at 0x%08p\n", CardData);
return FALSE;
}
dprintf("= %s\\%X\n\n", idString, SerialNumber);
} else {
dprintf("isn't present\n\n");
}
if (Verbose) {
xdprintf(Depth,""); dprintf( "Next Card (CardList) - %08p\n", CardData);
xdprintf(Depth,""); dprintf( "NumberLogicalDevices - %d\n", (ULONG) ReadField(NumberLogicalDevices));
xdprintf(Depth,""); dprintf( "LogicalDeviceList - 0x%08p\n", ReadField(LogicalDeviceList));
xdprintf(Depth,""); dprintf( "CardData - 0x%08p\n", ReadField(CardData));
xdprintf(Depth,"CardDataLength - %d\n", (ULONG) ReadField(CardDataLength));
xdprintf(Depth,""); dprintf( "CardFlags - 0x%08p\n\n", ReadField(CardFlags));
}
CardNext = ReadField(CardList.Next);
LogNext = ReadField(LogicalDeviceList.Next);
if (DumpDevices && LogNext != 0) {
deviceInformation = LogNext - DevOff;
continueDump = DumpIsaDeviceInfo( Depth + 1, deviceInformation, Verbose, DumpDevices );
}
if (CardNext != 0) {
CardInformation = CardNext - CardOff;
} else {
break;
}
} while (DumpCards);
return continueDump;
}
BOOL
DumpIsaDeviceInfo(
ULONG Depth,
ULONG64 DeviceInformation,
BOOL Verbose,
BOOL DumpDevices
)
{
//
// device extension for ISAPNP PDO
//
BOOL continueDump = TRUE;
ULONG DevOff;
ULONG64 Next;
GetFieldOffset("isapnp!_DEVICE_INFORMATION_", "LogicalDeviceList", &DevOff);
do {
if (CheckControlC()) {
continueDump = FALSE;
break;
}
if (Next = InitTypeRead(DeviceInformation, _DEVICE_INFORMATION_)) {
dprintf("Could not read Device Information at 0x%08p - %I64x\n", DeviceInformation, Next);
return FALSE;
}
xdprintf(Depth,""); dprintf(
"ISA PnP PDO @ 0x%08P, DevExt @ 0x%08P\n",
ReadField(PhysicalDeviceObject),
DeviceInformation);
DumpFlags( Depth, "Flags", (ULONG) ReadField(Flags), IsapnpExtensionFlags);
dprintf("\n");
if (Verbose) {
//xdprintf(Depth,""); dprintf( "SystemPowerState - %s\n", DevExtIsapnpSystemPowerState[(ULONG) ReadField(SystemPowerState]));
xdprintf(Depth,""); dprintf( "DevicePowerState - %s\n", DevExtIsapnpDevicePowerState[(ULONG) ReadField(DevicePowerState)]);
xdprintf(Depth,""); dprintf( "ParentDevExt - 0x%08P\n", ReadField(ParentDeviceExtension));
xdprintf(Depth,""); dprintf( "DeviceList - 0x%08P\n", ReadField(DeviceList));
xdprintf(Depth,""); dprintf( "EnumerationMutex - %sLocked\n", ReadField(EnumerationMutex.Header.SignalState) ? "Not " : "");
xdprintf(Depth,""); dprintf( "ResourceRequirements - 0x%08P\n", ReadField(ResourceRequirements));
xdprintf(Depth,""); dprintf( "CardInformation - 0x%08P\n", ReadField(CardInformation));
xdprintf(Depth,""); dprintf( "LogicalDeviceList - 0x%08P\n", ReadField(LogicalDeviceList));
xdprintf(Depth,""); dprintf( "LogicalDeviceNumber - %d\n", (ULONG) ReadField(LogicalDeviceNumber));
xdprintf(Depth,""); dprintf( "DeviceData - 0x%08P\n", ReadField(DeviceData));
xdprintf(Depth,""); dprintf( "DeviceDataLength - 0x%08P\n", ReadField(DeviceDataLength));
xdprintf(Depth,""); dprintf( "BootResourceList - 0x%08P\n", ReadField(BootResources));
xdprintf(Depth,""); dprintf( "BootResourceLength - 0x%08P\n", ReadField(BootResourcesLength));
xdprintf(Depth,""); dprintf( "AllocatedResList - 0x%08P\n", ReadField(AllocatedResources));
xdprintf(Depth,""); dprintf( "LogConfHandle - 0x%08P\n", ReadField(LogConfHandle));
xdprintf(Depth,""); dprintf( "Paging/Crash Path - %d/%d\n\n", (ULONG) ReadField(Paging),
(ULONG) ReadField(CrashDump));
}
Next = ReadField(LogicalDeviceList.Next);
if (Next != 0) {
DeviceInformation = Next - DevOff;
} else {
break;
}
} while (DumpDevices);
return continueDump;
}