490 lines
14 KiB
C
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;
|
||
|
}
|