/*++ 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; }