1300 lines
23 KiB
C
1300 lines
23 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1993 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
kdexts.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This file contains the generic routines and initialization code
|
|||
|
for the kernel debugger extensions dll.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Stephane Plante (splante)
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
#pragma hdrstop
|
|||
|
|
|||
|
#include <ntverp.h>
|
|||
|
#include <imagehlp.h>
|
|||
|
|
|||
|
//
|
|||
|
// globals
|
|||
|
//
|
|||
|
EXT_API_VERSION ApiVersion = { 5, 0, EXT_API_VERSION_NUMBER, 0 };
|
|||
|
WINDBG_EXTENSION_APIS ExtensionApis;
|
|||
|
USHORT SavedMajorVersion;
|
|||
|
USHORT SavedMinorVersion;
|
|||
|
ULONG_PTR AcpiExtAddress = 0;
|
|||
|
ULONG_PTR AcpiTreeAddress = 0;
|
|||
|
ULONG_PTR AcpiObjAddress = 0;
|
|||
|
ULONG_PTR AcpiFacsAddress = 0;
|
|||
|
ULONG_PTR AcpiFadtAddress = 0;
|
|||
|
ULONG_PTR AcpiHdrAddress = 0;
|
|||
|
ULONG_PTR AcpiMapicAddress = 0;
|
|||
|
ULONG_PTR AcpiRsdtAddress = 0;
|
|||
|
ULONG_PTR AcpiUnasmAddress = 0;
|
|||
|
ULONG AcpiUnasmLength = 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:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
WinDbgExtensionDllInit(
|
|||
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|||
|
USHORT MajorVersion,
|
|||
|
USHORT MinorVersion
|
|||
|
)
|
|||
|
{
|
|||
|
ExtensionApis = *lpExtensionApis;
|
|||
|
SavedMajorVersion = MajorVersion;
|
|||
|
SavedMinorVersion = MinorVersion;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
BOOL
|
|||
|
GetUlong (
|
|||
|
IN PCHAR String,
|
|||
|
IN PULONG Value
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR Location;
|
|||
|
ULONG result;
|
|||
|
|
|||
|
|
|||
|
Location = GetExpression( String );
|
|||
|
if (!Location) {
|
|||
|
|
|||
|
dprintf("unable to get %s\n",String);
|
|||
|
return FALSE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
Location,
|
|||
|
Value,
|
|||
|
sizeof(ULONG),
|
|||
|
&result
|
|||
|
);
|
|||
|
if (status == FALSE || result != sizeof(ULONG)) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
BOOL
|
|||
|
GetUlongPtr (
|
|||
|
IN PCHAR String,
|
|||
|
IN PULONG_PTR Address
|
|||
|
)
|
|||
|
{
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR Location;
|
|||
|
ULONG result;
|
|||
|
|
|||
|
|
|||
|
Location = GetExpression( String );
|
|||
|
if (!Location) {
|
|||
|
|
|||
|
dprintf("unable to get %s\n",String);
|
|||
|
return FALSE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
Location,
|
|||
|
Address,
|
|||
|
sizeof(ULONG_PTR),
|
|||
|
&result
|
|||
|
);
|
|||
|
if (status == FALSE || result != sizeof(ULONG)) {
|
|||
|
|
|||
|
return FALSE;
|
|||
|
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
LPEXT_API_VERSION
|
|||
|
ExtensionApiVersion(
|
|||
|
VOID
|
|||
|
)
|
|||
|
{
|
|||
|
return &ApiVersion;
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( accfield )
|
|||
|
{
|
|||
|
ULONG_PTR fieldAddress = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
fieldAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (fieldAddress == 0) {
|
|||
|
|
|||
|
dprintf("accfield: <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpAccessFieldUnit(
|
|||
|
fieldAddress,
|
|||
|
(ULONG) -1,
|
|||
|
0
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( acpiext )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
DEVICE_EXTENSION deviceExtension;
|
|||
|
DEVICE_OBJECT deviceObject;
|
|||
|
ULONG_PTR deviceExtensionAddress = 0;
|
|||
|
ULONG verbose = VERBOSE_ALL;
|
|||
|
|
|||
|
//
|
|||
|
// Read the address of the device object
|
|||
|
//
|
|||
|
if ( args != NULL) {
|
|||
|
|
|||
|
sscanf( args, "%lx %x", &deviceExtensionAddress, &verbose );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (deviceExtensionAddress == 0) {
|
|||
|
|
|||
|
if ( args != NULL) {
|
|||
|
|
|||
|
deviceExtensionAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
if (deviceExtensionAddress == 0) {
|
|||
|
|
|||
|
b = GetUlongPtr(
|
|||
|
"ACPI!RootDeviceExtension",
|
|||
|
&deviceExtensionAddress
|
|||
|
);
|
|||
|
if (!b) {
|
|||
|
|
|||
|
deviceExtensionAddress = 0;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if (deviceExtensionAddress == 0) {
|
|||
|
|
|||
|
dprintf("acpiext <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Read the device object
|
|||
|
//
|
|||
|
b = ReadMemory(
|
|||
|
deviceExtensionAddress,
|
|||
|
&deviceExtension,
|
|||
|
sizeof(DEVICE_EXTENSION),
|
|||
|
NULL
|
|||
|
);
|
|||
|
if (!b || deviceExtension.Signature != ACPI_SIGNATURE) {
|
|||
|
|
|||
|
//
|
|||
|
// Try to read a device object instead
|
|||
|
//
|
|||
|
b = ReadMemory(
|
|||
|
deviceExtensionAddress,
|
|||
|
&deviceObject,
|
|||
|
sizeof(DEVICE_OBJECT),
|
|||
|
NULL
|
|||
|
);
|
|||
|
if (!b) {
|
|||
|
|
|||
|
dprintf("0x%08lx: Could not read DeviceObject\n", deviceExtensionAddress);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Try to read an extension now
|
|||
|
//
|
|||
|
deviceExtensionAddress = (ULONG_PTR) deviceObject.DeviceExtension;
|
|||
|
if (deviceExtensionAddress == 0) {
|
|||
|
|
|||
|
dprintf("acpiext: Could not find ACPI Extension\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dumpAcpiExtension(
|
|||
|
deviceExtensionAddress,
|
|||
|
verbose,
|
|||
|
0
|
|||
|
);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( buildlist )
|
|||
|
{
|
|||
|
UCHAR tempBuff[100];
|
|||
|
|
|||
|
if (args != NULL && args[0] != 0) {
|
|||
|
|
|||
|
_snprintf( tempBuff, 100, "ACPI!ACPIBuild%sList", args );
|
|||
|
dumpAcpiBuildList( tempBuff );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
dumpAcpiBuildLists();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( call )
|
|||
|
{
|
|||
|
ULONG_PTR callAddress = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
callAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (callAddress == 0) {
|
|||
|
|
|||
|
dprintf("call: <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpCall(
|
|||
|
callAddress,
|
|||
|
(ULONG) -1,
|
|||
|
0
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( context )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
ULONG_PTR contextAddress = 0;
|
|||
|
ULONG verbose = 0;
|
|||
|
|
|||
|
//
|
|||
|
// If there are arguments, try to read them
|
|||
|
//
|
|||
|
if ( args != NULL) {
|
|||
|
|
|||
|
sscanf( args, "%lx %x", &contextAddress, &verbose );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
contextAddress = GetExpression(args);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
CTXT context;
|
|||
|
PLIST listEntry;
|
|||
|
ULONG resultLength;
|
|||
|
|
|||
|
//
|
|||
|
// Try to read the default address
|
|||
|
//
|
|||
|
b = GetUlongPtr( "ACPI!gplistCtxtHead", &contextAddress );
|
|||
|
if (!b || contextAddress == 0) {
|
|||
|
|
|||
|
dprintf("context: Could not read ACPI!gplistCtxtHead\n" );
|
|||
|
return;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Read the list and look at the first item
|
|||
|
//
|
|||
|
b = ReadMemory(
|
|||
|
contextAddress,
|
|||
|
&listEntry,
|
|||
|
sizeof(PLIST),
|
|||
|
&resultLength
|
|||
|
);
|
|||
|
if (!b || resultLength != sizeof(PLIST)) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"context: Could not read PLIST @ 0x%08lx\n",
|
|||
|
contextAddress
|
|||
|
);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// The first item in the list is the context that we are
|
|||
|
// interested in
|
|||
|
//
|
|||
|
contextAddress = (ULONG_PTR) listEntry -
|
|||
|
( (ULONG_PTR) &(context.listCtxt) - (ULONG_PTR) &(context) );
|
|||
|
|
|||
|
//
|
|||
|
// Is there a context there?
|
|||
|
//
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"context: No current context\n"
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpContext( contextAddress, verbose );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( dm )
|
|||
|
{
|
|||
|
ULONG_PTR address = 0;
|
|||
|
ULONG i;
|
|||
|
ULONG length = 0;
|
|||
|
PUCHAR name = NULL;
|
|||
|
PUCHAR tok = NULL;
|
|||
|
char sz[1000];
|
|||
|
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
strcpy(sz, args);
|
|||
|
|
|||
|
for (i = 0, tok = strtok( sz, " \t" );
|
|||
|
i < 3, tok != NULL;
|
|||
|
i +=1 ) {
|
|||
|
|
|||
|
if (i == 0) {
|
|||
|
|
|||
|
address = GetExpression( tok );
|
|||
|
tok = strtok( NULL, " Ll\t" );
|
|||
|
|
|||
|
} else if (i == 1) {
|
|||
|
|
|||
|
length = (ULONG)GetExpression ( tok );
|
|||
|
tok = strtok( NULL, " \t\n\r");
|
|||
|
|
|||
|
} else if (i == 2) {
|
|||
|
|
|||
|
name = tok;
|
|||
|
tok = strtok( NULL, " \t\n\r");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (address == 0 || length == 0 || name == NULL) {
|
|||
|
|
|||
|
dprintf("dm <address> L<length> <filename>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpMemory( address, length, name );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
#if 0
|
|||
|
DECLARE_API( dsdt )
|
|||
|
{
|
|||
|
ULONG_PTR address = 0;
|
|||
|
ULONG i;
|
|||
|
PUCHAR name = NULL;
|
|||
|
PUCHAR tok = NULL;
|
|||
|
UCHAR tempBuff[1000];
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
strcpy(tempBuff, args);
|
|||
|
|
|||
|
for (i = 0, tok = strtok( tempBuff, " \t" );
|
|||
|
i < 2, tok != NULL;
|
|||
|
i +=1 ) {
|
|||
|
|
|||
|
if (i == 0) {
|
|||
|
|
|||
|
address = GetExpression( tok );
|
|||
|
tok = strtok( NULL, " \n\r\t" );
|
|||
|
|
|||
|
} else if (i == 1) {
|
|||
|
|
|||
|
name = tok;
|
|||
|
tok = strtok( NULL, " \t\n\r");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
ACPIInformation acpiInformation;
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR infAddress = 0;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
status = GetUlongPtr("ACPI!AcpiInformation", &infAddress );
|
|||
|
if (status == TRUE) {
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
infAddress,
|
|||
|
&acpiInformation,
|
|||
|
sizeof(ACPIInformation),
|
|||
|
&returnLength
|
|||
|
);
|
|||
|
if (status && returnLength == sizeof(ACPIInformation)) {
|
|||
|
|
|||
|
address = (ULONG_PTR) acpiInformation.DiffSystemDescTable;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
dprintf("dsdt <address>\n");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpDSDT( address, name );
|
|||
|
return;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
DECLARE_API( facs )
|
|||
|
{
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
AcpiFacsAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiFacsAddress == 0) {
|
|||
|
|
|||
|
ACPIInformation acpiInformation;
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR address;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
status = GetUlongPtr( "ACPI!AcpiInformation", &address );
|
|||
|
if (status == TRUE) {
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
address,
|
|||
|
&acpiInformation,
|
|||
|
sizeof(ACPIInformation),
|
|||
|
&returnLength
|
|||
|
);
|
|||
|
if (status && returnLength == sizeof(ACPIInformation)) {
|
|||
|
|
|||
|
AcpiFacsAddress = (ULONG_PTR) acpiInformation.FirmwareACPIControlStructure;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiFacsAddress == 0) {
|
|||
|
|
|||
|
dprintf("facs <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpFACS( AcpiFacsAddress );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( fadt )
|
|||
|
{
|
|||
|
|
|||
|
if (args != NULL && *args != '\0') {
|
|||
|
|
|||
|
AcpiFadtAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiFadtAddress == 0) {
|
|||
|
|
|||
|
ACPIInformation acpiInformation;
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR address;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
status = GetUlongPtr( "ACPI!AcpiInformation", &address );
|
|||
|
if (status == TRUE) {
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
address,
|
|||
|
&acpiInformation,
|
|||
|
sizeof(ACPIInformation),
|
|||
|
&returnLength
|
|||
|
);
|
|||
|
if (status && returnLength == sizeof(ACPIInformation)) {
|
|||
|
|
|||
|
AcpiFadtAddress = (ULONG_PTR) acpiInformation.FixedACPIDescTable;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiFadtAddress == 0) {
|
|||
|
|
|||
|
dprintf("fadt <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
dumpFADT( AcpiFadtAddress );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( gbl )
|
|||
|
{
|
|||
|
ULONG verbose = VERBOSE_1;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
if (!strcmp(args, "-v")) {
|
|||
|
|
|||
|
verbose |= VERBOSE_2;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpGBL( verbose );
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API ( gpe )
|
|||
|
{
|
|||
|
dumpAcpiGpeInformation( );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( hdr )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
BOOL virtualMemory = FALSE;
|
|||
|
DESCRIPTION_HEADER header;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
AcpiHdrAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
if (AcpiHdrAddress == 0) {
|
|||
|
|
|||
|
dprintf("hdr <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// First check to see if we find the correct things
|
|||
|
//
|
|||
|
b = ReadPhysicalOrVirtual(
|
|||
|
AcpiHdrAddress,
|
|||
|
&header,
|
|||
|
sizeof(DESCRIPTION_HEADER),
|
|||
|
&returnLength,
|
|||
|
virtualMemory
|
|||
|
);
|
|||
|
if (!b) {
|
|||
|
|
|||
|
//
|
|||
|
// Attempt to read a Virtual address
|
|||
|
//
|
|||
|
virtualMemory = !virtualMemory;
|
|||
|
b = ReadPhysicalOrVirtual(
|
|||
|
AcpiHdrAddress,
|
|||
|
&header,
|
|||
|
sizeof(DESCRIPTION_HEADER),
|
|||
|
&returnLength,
|
|||
|
virtualMemory
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Is the signature 'known'?
|
|||
|
//
|
|||
|
if (header.Signature != FADT_SIGNATURE &&
|
|||
|
header.Signature != FACS_SIGNATURE &&
|
|||
|
header.Signature != RSDT_SIGNATURE &&
|
|||
|
header.Signature != APIC_SIGNATURE &&
|
|||
|
header.Signature != DSDT_SIGNATURE &&
|
|||
|
header.Signature != SSDT_SIGNATURE &&
|
|||
|
header.Signature != PSDT_SIGNATURE &&
|
|||
|
header.Signature != SBST_SIGNATURE) {
|
|||
|
|
|||
|
//
|
|||
|
// Unknown -- try again
|
|||
|
//
|
|||
|
virtualMemory = !virtualMemory;
|
|||
|
b = ReadPhysicalOrVirtual(
|
|||
|
AcpiHdrAddress,
|
|||
|
&header,
|
|||
|
sizeof(DESCRIPTION_HEADER),
|
|||
|
&returnLength,
|
|||
|
virtualMemory
|
|||
|
);
|
|||
|
if (!b) {
|
|||
|
|
|||
|
virtualMemory = !virtualMemory;
|
|||
|
b = ReadPhysicalOrVirtual(
|
|||
|
AcpiHdrAddress,
|
|||
|
&header,
|
|||
|
sizeof(DESCRIPTION_HEADER),
|
|||
|
&returnLength,
|
|||
|
virtualMemory
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
dumpHeader( AcpiHdrAddress, &header, TRUE );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( kb )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
ULONG_PTR contextAddress = 0;
|
|||
|
ULONG verbose = 0;
|
|||
|
|
|||
|
//
|
|||
|
// If there are arguments, try to read them
|
|||
|
//
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
contextAddress = GetExpression(args);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
CTXT context;
|
|||
|
PLIST listEntry;
|
|||
|
ULONG resultLength;
|
|||
|
|
|||
|
//
|
|||
|
// Try to read the default address
|
|||
|
//
|
|||
|
b = GetUlongPtr( "ACPI!gplistCtxtHead", &contextAddress );
|
|||
|
if (!b || contextAddress == 0) {
|
|||
|
|
|||
|
dprintf("kb: Could not read ACPI!gplistCtxtHead\n" );
|
|||
|
return;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Read the list and look at the first item
|
|||
|
//
|
|||
|
b = ReadMemory(
|
|||
|
contextAddress,
|
|||
|
&listEntry,
|
|||
|
sizeof(PLIST),
|
|||
|
&resultLength
|
|||
|
);
|
|||
|
if (!b || resultLength != sizeof(PLIST)) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"kb: Could not read PLIST @ 0x%08lx\n",
|
|||
|
contextAddress
|
|||
|
);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// The first item in the list is the context that we are
|
|||
|
// interested in
|
|||
|
//
|
|||
|
contextAddress = (ULONG_PTR) listEntry -
|
|||
|
( (ULONG_PTR) &(context.listCtxt) - (ULONG_PTR) &(context) );
|
|||
|
|
|||
|
//
|
|||
|
// Is there a context there?
|
|||
|
//
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"kb: No current context\n"
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
stackTrace( contextAddress, 0 );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( kv )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
ULONG_PTR contextAddress = 0;
|
|||
|
ULONG verbose = 0;
|
|||
|
|
|||
|
//
|
|||
|
// If there are arguments, try to read them
|
|||
|
//
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
contextAddress = GetExpression(args);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
CTXT context;
|
|||
|
PLIST listEntry;
|
|||
|
ULONG resultLength;
|
|||
|
|
|||
|
//
|
|||
|
// Try to read the default address
|
|||
|
//
|
|||
|
b = GetUlongPtr( "ACPI!gplistCtxtHead", &contextAddress );
|
|||
|
if (!b || contextAddress == 0) {
|
|||
|
|
|||
|
dprintf("kv: Could not read ACPI!gplistCtxtHead\n" );
|
|||
|
return;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Read the list and look at the first item
|
|||
|
//
|
|||
|
b = ReadMemory(
|
|||
|
contextAddress,
|
|||
|
&listEntry,
|
|||
|
sizeof(PLIST),
|
|||
|
&resultLength
|
|||
|
);
|
|||
|
if (!b || resultLength != sizeof(PLIST)) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"kv: Could not read PLIST @ 0x%08lx\n",
|
|||
|
contextAddress
|
|||
|
);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// The first item in the list is the context that we are
|
|||
|
// interested in
|
|||
|
//
|
|||
|
contextAddress = (ULONG_PTR) listEntry -
|
|||
|
( (ULONG_PTR) &(context.listCtxt) - (ULONG_PTR) &(context) );
|
|||
|
|
|||
|
//
|
|||
|
// Is there a context there?
|
|||
|
//
|
|||
|
if (contextAddress == 0) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"kv: No current context\n"
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
stackTrace( contextAddress, 1 );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( inf )
|
|||
|
{
|
|||
|
dumpAcpiInformation( );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( mapic )
|
|||
|
{
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
AcpiMapicAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiMapicAddress == 0) {
|
|||
|
|
|||
|
ACPIInformation acpiInformation;
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR address;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
status = GetUlongPtr( "ACPI!AcpiInformation", &address );
|
|||
|
if (status == TRUE) {
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
address,
|
|||
|
&acpiInformation,
|
|||
|
sizeof(ACPIInformation),
|
|||
|
&returnLength
|
|||
|
);
|
|||
|
if (status && returnLength == sizeof(ACPIInformation)) {
|
|||
|
|
|||
|
AcpiMapicAddress = (ULONG_PTR) acpiInformation.MultipleApicTable;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (AcpiMapicAddress == 0) {
|
|||
|
dprintf("mapic <address>");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
dumpMAPIC( AcpiMapicAddress );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( node )
|
|||
|
{
|
|||
|
ULONG_PTR nodeAddress;
|
|||
|
|
|||
|
nodeAddress = GetExpression( args );
|
|||
|
if (nodeAddress == 0) {
|
|||
|
|
|||
|
dprintf("node: Illegal Address (%s == NULL)\n", args );
|
|||
|
return;
|
|||
|
}
|
|||
|
dumpAcpiDeviceNodes( nodeAddress, VERBOSE_4, 0 );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( nsobj )
|
|||
|
{
|
|||
|
ULONG_PTR address = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
address = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (args == 0) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"nsobj: Could not find %s\n",
|
|||
|
(args != NULL ? args : "null")
|
|||
|
);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpNSObject( address, 0xFFFF, 0 );
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( nstree )
|
|||
|
{
|
|||
|
ULONG_PTR address = 0;
|
|||
|
|
|||
|
if ((args != NULL) && (*args != '\0')) {
|
|||
|
|
|||
|
address = GetExpression( args );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
address = GetExpression( "acpi!gpnsNameSpaceRoot" );
|
|||
|
|
|||
|
}
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
dprintf(
|
|||
|
"nstree: Could not find %s\n",
|
|||
|
(args != NULL ? args : "acpi!gpnsNameSpaceRoot" )
|
|||
|
);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpNSTree( address, 0 );
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( objdata )
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
ULONG address = 0;
|
|||
|
|
|||
|
//
|
|||
|
// Read the address of the device object
|
|||
|
//
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
AcpiObjAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
if (AcpiObjAddress == 0) {
|
|||
|
|
|||
|
dprintf("object <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpPObject( AcpiObjAddress, 0xFFFF, 0);
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( pnpreslist )
|
|||
|
{
|
|||
|
ULONG_PTR address = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
address = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
dprintf("pnpreslist <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpPnPResources( address );
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( polist )
|
|||
|
{
|
|||
|
UCHAR tempBuff[100];
|
|||
|
|
|||
|
if (args != NULL && args[0] != 0) {
|
|||
|
|
|||
|
_snprintf( tempBuff, 100, "ACPI!ACPIPower%sList", args );
|
|||
|
dumpAcpiPowerList( tempBuff );
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
dumpAcpiPowerLists();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( ponodes )
|
|||
|
{
|
|||
|
dumpAcpiPowerNodes();
|
|||
|
}
|
|||
|
|
|||
|
#if 0
|
|||
|
DECLARE_API( psdt )
|
|||
|
{
|
|||
|
|
|||
|
ULONG_PTR address = 0;
|
|||
|
ULONG i;
|
|||
|
PUCHAR name = NULL;
|
|||
|
PUCHAR tok = NULL;
|
|||
|
UCHAR tempBuff[1000];
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
strcpy(tempBuff, args);
|
|||
|
|
|||
|
for (i = 0, tok = strtok( tempBuff, " \t" );
|
|||
|
i < 2, tok != NULL;
|
|||
|
i +=1 ) {
|
|||
|
|
|||
|
if (i == 0) {
|
|||
|
|
|||
|
address = GetExpression( tok );
|
|||
|
tok = strtok( NULL, " Ll\t" );
|
|||
|
|
|||
|
} else if (i == 1) {
|
|||
|
|
|||
|
name = tok;
|
|||
|
tok = strtok( NULL, " \t\n\r");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
dprintf("psdt <address>");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpDSDT( address, name );
|
|||
|
return;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
DECLARE_API( rsdt )
|
|||
|
{
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
AcpiRsdtAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
if (AcpiRsdtAddress == 0) {
|
|||
|
|
|||
|
ACPIInformation acpiInformation;
|
|||
|
BOOL status;
|
|||
|
ULONG_PTR address;
|
|||
|
ULONG returnLength;
|
|||
|
|
|||
|
status = GetUlongPtr( "ACPI!AcpiInformation", &address );
|
|||
|
if (status == TRUE) {
|
|||
|
|
|||
|
status = ReadMemory(
|
|||
|
address,
|
|||
|
&acpiInformation,
|
|||
|
sizeof(ACPIInformation),
|
|||
|
&returnLength
|
|||
|
);
|
|||
|
if (status && returnLength == sizeof(ACPIInformation)) {
|
|||
|
|
|||
|
AcpiRsdtAddress = (ULONG_PTR) acpiInformation.RootSystemDescTable;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
if (AcpiRsdtAddress == 0) {
|
|||
|
|
|||
|
if (!findRSDT( &AcpiRsdtAddress) ) {
|
|||
|
|
|||
|
dprintf("Could not locate the RSDT pointer\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpRSDT( AcpiRsdtAddress );
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( scope )
|
|||
|
{
|
|||
|
ULONG_PTR scopeAddress = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
scopeAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (scopeAddress == 0) {
|
|||
|
|
|||
|
dprintf("scope: <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpScope(
|
|||
|
scopeAddress,
|
|||
|
(ULONG) -1,
|
|||
|
0
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#if 0
|
|||
|
DECLARE_API( ssdt )
|
|||
|
{
|
|||
|
|
|||
|
ULONG_PTR address = 0;
|
|||
|
ULONG i;
|
|||
|
PUCHAR name = NULL;
|
|||
|
PUCHAR tok = NULL;
|
|||
|
UCHAR tempBuff[1000];
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
strcpy(tempBuff, args);
|
|||
|
|
|||
|
for (i = 0, tok = strtok( tempBuff, " \t" );
|
|||
|
i < 2, tok != NULL;
|
|||
|
i +=1 ) {
|
|||
|
|
|||
|
if (i == 0) {
|
|||
|
|
|||
|
address = GetExpression( tok );
|
|||
|
tok = strtok( NULL, " Ll\t" );
|
|||
|
|
|||
|
} else if (i == 1) {
|
|||
|
|
|||
|
name = tok;
|
|||
|
tok = strtok( NULL, " \t\n\r");
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (address == 0) {
|
|||
|
|
|||
|
dprintf("ssdt <address>");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpDSDT( address, name );
|
|||
|
return;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
DECLARE_API( term )
|
|||
|
{
|
|||
|
ULONG_PTR termAddress = 0;
|
|||
|
|
|||
|
if (args != NULL) {
|
|||
|
|
|||
|
termAddress = GetExpression( args );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (termAddress == 0) {
|
|||
|
|
|||
|
dprintf("term: <address>\n");
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
dumpTerm(
|
|||
|
termAddress,
|
|||
|
(ULONG) -1,
|
|||
|
0
|
|||
|
);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
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
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( amli )
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Invoke AMLI debugger
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
if ((args == NULL) || (*args == '\0'))
|
|||
|
{
|
|||
|
dprintf("Usage: amli <cmd> [arguments ...]\n"
|
|||
|
"where <cmd> is one of the following:\n");
|
|||
|
AMLIDbgHelp(NULL, NULL, 0, 0);
|
|||
|
dprintf("\n");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
AMLIDbgExecuteCmd((PSZ)args);
|
|||
|
dprintf("\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
DECLARE_API( irqarb )
|
|||
|
{
|
|||
|
|
|||
|
dprintf("Moved to kdexts.dll Try '!acpiirqarb'\n");
|
|||
|
}
|