You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
297 lines
5.5 KiB
297 lines
5.5 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
apciuasm.c
|
|
|
|
Abstract:
|
|
|
|
This unassembles an AML file
|
|
|
|
Author:
|
|
|
|
Based on code by Mike Tsang (MikeTs)
|
|
Stephane Plante (Splante)
|
|
|
|
Environment:
|
|
|
|
User mode only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <zwapi.h>
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <memory.h>
|
|
#include <crt\io.h>
|
|
#include <fcntl.h>
|
|
#include <windows.h>
|
|
#include <windef.h>
|
|
|
|
#define SPEC_VER 100
|
|
#include "acpitabl.h"
|
|
#include "unasmdll.h"
|
|
#include "parsearg.h"
|
|
|
|
ULONG ParseOutput( PUCHAR *Argument, PARGTYPE TableEntry );
|
|
ULONG PrintHelp(PUCHAR *Argument, PARGTYPE TableEntry );
|
|
VOID PrintOutput(PCCHAR Format, ... );
|
|
|
|
ARGTYPE ArgTypes[] = {
|
|
{ "?", AT_ACTION, 0, PrintHelp, 0, NULL },
|
|
{ "Fo", AT_ACTION, PF_SEPARATOR, ParseOutput, 0, NULL },
|
|
{ "" , 0, 0, 0, 0, NULL }
|
|
};
|
|
#pragma warning(default: 4054)
|
|
PROGINFO ProgInfo = { NULL, NULL, NULL, NULL };
|
|
FILE *outputHandle;
|
|
|
|
int
|
|
__cdecl
|
|
main(
|
|
IN int argc,
|
|
IN char *argv[]
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine unassembles and displays a file
|
|
|
|
Arguments:
|
|
|
|
argc - Number of Arguments
|
|
argv - Array of Arruments
|
|
|
|
Return Value:
|
|
|
|
int
|
|
|
|
--*/
|
|
{
|
|
int rc;
|
|
int handle;
|
|
NTSTATUS result;
|
|
PUCHAR byte = NULL;
|
|
ULONG length;
|
|
ULONG readLength;
|
|
|
|
outputHandle = stdout;
|
|
|
|
//
|
|
// Beging by initializing the program information
|
|
//
|
|
ParseProgramInfo( argv[0], &ProgInfo );
|
|
argv++;
|
|
argc--;
|
|
|
|
//
|
|
// Parse all the switches away
|
|
//
|
|
if (ParseSwitches( &argc, &argv, ArgTypes, &ProgInfo) != ARGERR_NONE ||
|
|
argc != 1) {
|
|
|
|
PrintHelp( NULL, NULL );
|
|
return 0;
|
|
|
|
}
|
|
|
|
//
|
|
// Open the remaining argument as our input file
|
|
//
|
|
handle = _open( argv[0], _O_BINARY | _O_RDONLY);
|
|
if (handle == -1) {
|
|
|
|
fprintf( stderr, "%s: Failed to open AML file - %s\n",
|
|
ProgInfo.ProgName, argv[0] );
|
|
return -1;
|
|
|
|
}
|
|
|
|
byte = malloc( sizeof(DESCRIPTION_HEADER) );
|
|
if (byte == NULL) {
|
|
|
|
fprintf( stderr, "%s: Failed to allocate description header block\n",
|
|
ProgInfo.ProgName );
|
|
return -2;
|
|
|
|
}
|
|
|
|
rc = _read( handle, byte, sizeof(DESCRIPTION_HEADER) );
|
|
if (rc != sizeof(DESCRIPTION_HEADER) ) {
|
|
|
|
fprintf( stderr, "%s: Failed to read description header block\n",
|
|
ProgInfo.ProgName );
|
|
return -3;
|
|
|
|
}
|
|
|
|
rc = _lseek( handle, 0, SEEK_SET);
|
|
if (rc == -1) {
|
|
|
|
fprintf( stderr, "%s: Failed seeking to beginning of file\n",
|
|
ProgInfo.ProgName );
|
|
return -4;
|
|
|
|
}
|
|
|
|
length = ( (PDESCRIPTION_HEADER) byte)->Length;
|
|
free (byte);
|
|
|
|
byte = malloc( length );
|
|
if (byte == NULL) {
|
|
|
|
fprintf( stderr, "%s: Failed to allocate AML file buffer\n",
|
|
ProgInfo.ProgName );
|
|
return -5;
|
|
|
|
}
|
|
|
|
readLength = (ULONG) _read( handle, byte, length );
|
|
if (readLength != length) {
|
|
|
|
fprintf( stderr, "%s: failed to read AML file\n",
|
|
ProgInfo.ProgName );
|
|
return - 6;
|
|
|
|
}
|
|
|
|
result = UnAsmLoadDSDT( byte );
|
|
if (result == 0) {
|
|
|
|
result = UnAsmDSDT( byte, PrintOutput, 0, 0 );
|
|
|
|
}
|
|
|
|
if (result != 0) {
|
|
|
|
fprintf(stderr, "%s: result = 0x%08lx\n",
|
|
ProgInfo.ProgName, result );
|
|
|
|
}
|
|
|
|
if (byte) {
|
|
|
|
free(byte);
|
|
|
|
}
|
|
if (handle) {
|
|
|
|
_close(handle);
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
ULONG
|
|
ParseOutput(
|
|
PUCHAR *Argument,
|
|
PARGTYPE TableEntry
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is called if the user specifies a different file to output
|
|
things to
|
|
|
|
Arguments:
|
|
|
|
Argument - Pointer to the string
|
|
TableEntry - Which table entry was matched
|
|
|
|
Return Value:
|
|
|
|
ULONG
|
|
|
|
--*/
|
|
{
|
|
if (*Argument == '\0') {
|
|
|
|
return ARGERR_INVALID_TAIL;
|
|
|
|
}
|
|
|
|
outputHandle = fopen( *Argument, "w" );
|
|
if (outputHandle == NULL) {
|
|
|
|
fprintf( stderr, "Failed to open AML file - %s\n", *Argument );
|
|
return ARGERR_INVALID_TAIL;
|
|
|
|
}
|
|
return ARGERR_NONE;
|
|
}
|
|
|
|
ULONG
|
|
PrintHelp(
|
|
PUCHAR *Argument,
|
|
PARGTYPE TableEntry
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print the help for the function
|
|
|
|
Arguments:
|
|
|
|
Argument - Pointer to the string
|
|
TableEntry - Which table entry was matched
|
|
|
|
Return Value:
|
|
|
|
ULONG
|
|
--*/
|
|
{
|
|
if (Argument != NULL) {
|
|
|
|
printf("Error on Argument - \"%s\"\n", *Argument );
|
|
|
|
}
|
|
printf("Usage:\t%s /?\n", ProgInfo.ProgName );
|
|
printf("\t%s [/Fo=<ASLFile>] <AMLFile>\n", ProgInfo.ProgName );
|
|
printf("\t? - Print this help message.\n");
|
|
printf("\tFo=ASLFile - Write output to ASLFile.\n");
|
|
printf("\tAMLFile - AML File to Unassemble\n");
|
|
return ARGERR_NONE;
|
|
}
|
|
|
|
VOID
|
|
PrintOutput(
|
|
PCCHAR Format,
|
|
...
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is called to display information to the user
|
|
|
|
Arguments:
|
|
|
|
Format - Character formating
|
|
... - Arguments
|
|
|
|
Return Value:
|
|
|
|
Null
|
|
|
|
--*/
|
|
{
|
|
va_list marker;
|
|
va_start( marker, Format );
|
|
vfprintf( outputHandle, Format, marker );
|
|
fflush( outputHandle );
|
|
va_end( marker );
|
|
}
|