/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) 1990-1997 Microsoft Corporation Module Name: acpintsd.c Abstract: ACPI-Specific NTSD Extensions Environment: Win32 Revision History: --*/ #include "acpintsd.h" NTSD_EXTENSION_APIS ExtensionApis; HANDLE ExtensionCurrentProcess; PUCHAR ScTableName[] = { "ParseFunctionHandler", "ParseArgument", "ParseArgumentObject", "ParseBuffer", "ParseByte", "ParseCodeObject", "ParseConstObject", "ParseData", "ParseDelimiter", "ParseDword", "ParseField", "ParseLocalObject", "ParseName", "ParseNameObject", "ParseOpcode", "ParsePackage", "ParsePop", "ParsePush", "ParseSuperName", "ParseTrailingArgument", "ParseTrailingBuffer", "ParseTrailingPackage", "ParseVariableObject", "ParseWord" }; VOID dumpParseStack( DWORD AddrStack ) /*++ Routine Description: This dumps the parse stack Arguments: AddrStack: Address of the stack to dump Return Value: None --*/ { BOOL b; STRING_STACK tempStack; PSTRING_STACK stack; ULONG index; // // Read the stack header into memory // b = ReadMemory( (LPVOID) AddrStack, &tempStack, sizeof(STRING_STACK), NULL ); if (!b) { return; } // // Allocate memory for the entire stack // stack = (PSTRING_STACK) LocalAlloc( LMEM_ZEROINIT, sizeof(STRING_STACK) + tempStack.StackSize - 1 ); if (!stack) { return; } // // Read the entire stack // b = ReadMemory( (LPVOID) AddrStack, stack, sizeof(STRING_STACK) + tempStack.StackSize - 1, NULL ); if (!b) { LocalFree( stack ); return; } // // Show the user something // dprintf( "ParseStack: Size 0x%x Top: 0x%x\n", tempStack.StackSize, tempStack.TopOfStack ); if (tempStack.TopOfStack == 0) { dprintf("Stack is empty\n"); return; } // // Walk the stack // for (index = tempStack.TopOfStack - 1; ; index--) { dprintf("[%2d] %s\n", index, ScTableName[ stack->Stack[index] ] ); if (index == 0) { break; } } // // Free the stack // LocalFree( stack ); } VOID dumpStringStack( DWORD AddrStack ) /*++ Routine Description: This dumps the parse stack Arguments: AddrStack: Address of the stack to dump Return Value: None --*/ { BOOL b; STRING_STACK tempStack; PSTRING_STACK stack; ULONG index; // // Read the stack header into memory // b = ReadMemory( (LPVOID) AddrStack, &tempStack, sizeof(STRING_STACK), NULL ); if (!b) { return; } // // Allocate memory for the entire stack // stack = (PSTRING_STACK) LocalAlloc( LMEM_ZEROINIT, sizeof(STRING_STACK) + tempStack.StackSize ); if (!stack) { return; } // // Read the entire stack // b = ReadMemory( (LPVOID) AddrStack, stack, sizeof(STRING_STACK) + tempStack.StackSize - 1, NULL ); if (!b) { LocalFree( stack ); return; } // // Show the user something // dprintf( "StringStack: Size 0x%x Top: 0x%x\nString: '%s'\n", tempStack.StackSize, tempStack.TopOfStack, stack->Stack ); // // Free the stack // LocalFree( stack ); } VOID dumpScope( PSCOPE Scope ) /*++ Routine Description: Dumps a scope, as used in the ACPI unasm.lib Arguments: Scope - LocalCopy of the scope Return Value: None --*/ { BOOL b; AMLTERM amlTerm; UCHAR buffer[64]; dprintf("%8x %8x %8x %8x %2x %2x %2x %1d %8x", Scope->CurrentByte, Scope->TermByte, Scope->LastByte, Scope->StringStack, Scope->Context1, Scope->Context2, Scope->Flags, Scope->IndentLevel, Scope->AmlTerm ); b = ReadMemory( Scope->AmlTerm, &amlTerm, sizeof(AMLTERM), NULL ); if (!b) { dprintf("\n"); return; } else { dprintf(" %4x %4x\n", amlTerm.OpCode, amlTerm.OpCodeFlags ); b = ReadMemory( amlTerm.TermName, buffer, 64, NULL ); if (b) { dprintf(" %-60s\n", buffer ); } } } VOID dumpScopeHeader( BOOL Verbose ) /*++ Routine Description: Dumps the header for a scope stack dump Arguments: Verbose: wether or not to include the field for stack level Return Value: None --*/ { if (Verbose) { dprintf("Level "); } dprintf(" Current First Last S.Stack C1 C2 Fl I AML Term OpCd Flag\n" ); } DECLARE_API( sscope ) /*++ Routine Description: Dumps one of the stacks used by the ACPI Unassembler Arguments: hCurrentProcess - Supplies a handle to the current process (at the time the extension was called). hCurrentThread - Supplies a handle to the current thread (at the time the extension was called). CurrentPc - Supplies the current pc at the time the extension is called. lpExtensionApis - Supplies the address of the functions callable by this extension. lpArgumentString - Supplies the asciiz string that describes the ansi string to be dumped. Return Value: None --*/ { BOOL b; DWORD addrStack; DWORD i; DWORD offset; DWORD top; STACK tempStack; PSTACK stack; PSCOPE scope; INIT_API(); // // Evaluate the argument string to get the address of the // stack to dump // addrStack = GetExpression( lpArgumentString ); if ( !addrStack) { return; } // // Read the stack header into memory // b = ReadMemory( (LPVOID) addrStack, &tempStack, sizeof(STACK), NULL ); if (!b) { return; } // // Allocate memory for the entire stack // stack = (PSTACK) LocalAlloc( LMEM_ZEROINIT, sizeof(STACK) + tempStack.StackSize - 1 ); if (!stack) { return; } // // Read the entire stack // b = ReadMemory( (LPVOID) addrStack, stack, sizeof(STACK) + tempStack.StackSize - 1, NULL ); if (!b) { LocalFree( stack ); return; } // // Show the user something // dumpScopeHeader( TRUE ); // // Loop on each of the scopes // for (top = (stack->TopOfStack / stack->StackElementSize) - 1;;top--) { scope = (PSCOPE) &(stack->Stack[ top * stack->StackElementSize ] ); dprintf("[%2d]: ", top ); dumpScope(scope); if (top == 0) { dumpParseStack( (DWORD) scope->ParseStack ); dumpStringStack( (DWORD) scope->StringStack ); break; } } // // Done // LocalFree( stack ); } DECLARE_API( amlterm ) { BOOL b; DWORD addrTerm; DWORD offset; AMLTERM amlTerm; UCHAR nameBuff[17]; UCHAR symbolBuff[128]; INIT_API(); // // Evaluate the argument string to get the address of the // term to dump // addrTerm = GetExpression( lpArgumentString ); if ( !addrTerm ) { return; } // // Read the term into memory // b = ReadMemory( (LPVOID) addrTerm, &amlTerm, sizeof(AMLTERM), NULL ); if (!b) { return; } // // Begin to print things // dprintf("AMLTERM: %x\n", addrTerm); // // Read the name of the term into memory // nameBuff[16] = '\0'; b = ReadMemory( (LPVOID) amlTerm.TermName, nameBuff, 16, NULL ); dprintf("Name: %-16s ",( !b ? "" : nameBuff) ); // // Handle the symbol term // if (amlTerm.FunctionHandler != NULL) { // // Read the symbol of the term // GetSymbol( (LPVOID) amlTerm.FunctionHandler, symbolBuff, &offset ); dprintf(" Handler: %-30s\n", symbolBuff ); } else { dprintf("\n"); } // // Display the opcode // if ( amlTerm.OpCode > 0xFF) { dprintf( "Opcode: %2x %2x", (amlTerm.OpCode & 0xff), (amlTerm.OpCode >> 8) ); } else { dprintf("Opcode: %2x ", amlTerm.OpCode ); } // // Display the Argument Types // RtlZeroMemory( nameBuff, 17 ); if (amlTerm.ArgumentTypes) { b = ReadMemory( (LPVOID) amlTerm.ArgumentTypes, nameBuff, 16, NULL ); dprintf(" Args: %-4s", (!b ? "????" : nameBuff ) ); } else { dprintf(" Args: %-4s", "None"); } // // Display the flags // switch( (amlTerm.OpCodeFlags & 0xF) ) { case 0: dprintf(" Flags: NORMAL "); break; case 1: dprintf(" Flags: VARIABLE"); break; case 2: dprintf(" Flags: ARG "); break; case 3: dprintf(" Flags: LOCAL "); break; case 4: dprintf(" Flags: CONSTANT"); break; case 5: dprintf(" Flags: NAME "); break; case 6: dprintf(" Flags: DATA "); break; case 7: dprintf(" Flags: DEBUG "); break; case 8: dprintf(" Flags: REF "); break; default: dprintf(" Flags: UNKNOWN "); break; } // // Display the term group // switch(amlTerm.TermGroup & 0xF) { case 1: dprintf(" Group: NAMESPACE\n"); break; case 2: dprintf(" Group: NAMED OBJECT\n"); break; case 3: dprintf(" Group: TYPE 1\n"); break; case 4: dprintf(" Group: TYPE 2\n"); break; case 5: dprintf(" Group: OTHER\n"); break; default: dprintf(" Group: UNKNOWN\n"); break; } } DECLARE_API( scope ) { BOOL b; DWORD addrScope; SCOPE scope; INIT_API(); // // Evaluate the argument string to get the address of the // stack to dump // addrScope = GetExpression( lpArgumentString ); if ( !addrScope) { return; } // // Read the stack header into memory // b = ReadMemory( (LPVOID) addrScope, &scope, sizeof(scope), NULL ); if (!b) { return; } // // Dump the string to the user // dumpScopeHeader(FALSE); dumpScope( &scope ); } DECLARE_API( pstack ) { DWORD addrStack; INIT_API(); addrStack = GetExpression( lpArgumentString ); if (!addrStack) { return; } dumpParseStack( addrStack ); } DECLARE_API( sstack ) { DWORD addrStack; INIT_API(); addrStack = GetExpression( lpArgumentString ); if (!addrStack) { return; } dumpStringStack( addrStack ); } DECLARE_API( version ) { OSVERSIONINFOA VersionInformation; HKEY hkey; DWORD cb, dwType; CHAR szCurrentType[128]; CHAR szCSDString[3+128]; INIT_API(); VersionInformation.dwOSVersionInfoSize = sizeof(VersionInformation); if (!GetVersionEx( &VersionInformation )) { dprintf("GetVersionEx failed - %u\n", GetLastError()); return; } szCurrentType[0] = '\0'; if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hkey ) == NO_ERROR ) { cb = sizeof(szCurrentType); if (RegQueryValueEx( hkey, "CurrentType", NULL, &dwType, szCurrentType, &cb ) != 0 ) { szCurrentType[0] = '\0'; } } RegCloseKey(hkey); if (VersionInformation.szCSDVersion[0]) { sprintf( szCSDString, ": %s", VersionInformation.szCSDVersion ); } else { szCSDString[0] = '\0'; } dprintf( "Version %d.%d (Build %d%s) %s\n", VersionInformation.dwMajorVersion, VersionInformation.dwMinorVersion, VersionInformation.dwBuildNumber, szCSDString, szCurrentType ); return; } DECLARE_API( help ) { INIT_API(); dprintf("!version - Dump System Version and Build Number\n"); dprintf("!sscope - Dump an UnASM Scope Stack\n"); dprintf("!scope - Dump an UnASM Scope\n"); dprintf("!pstack - Dump an UnASM Parse Stack\n"); dprintf("!sstack - Dump an UnASM String STack\n"); }