windows-nt/Source/XPSP1/NT/base/busdrv/acpi/tools/unasm2/acpiuasm.c
2020-09-26 16:20:57 +08:00

298 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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