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

347 lines
5.7 KiB
C
Raw 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:
acpiuasm.c
Abstract:
Test wrapper for the unassembler
Author:
Stephane Plante
Based on code by Ken Reneris
Environment:
User
Revision History:
--*/
#include "acpiuasm.h"
IFILE Orig; // Image of original aml file
BOOLEAN Verbose;
BOOLEAN ArgsParsed;
int
__cdecl
main(
IN int argc,
IN char *argv[]
)
{
//
// Init globals
//
Orig.Desc = "original image";
//
// Parse args
//
ParseArgs(argc, argv);
//
// Check the image header
//
CheckImageHeader(
&Orig
);
//
// Debug the image
//
return ScopeParser(
(PUCHAR) (Orig.Image + sizeof(DSDT)),
Orig.FileSize,
(ULONG) ( 0 - (ULONG) Orig.Image - sizeof(DSDT) ),
0
);
}
VOID
CheckImageHeader (
IN PIFILE File
)
{
PUCHAR Image;
PDSDT Dsdt;
UCHAR check;
ULONG i;
if (File->FileSize < sizeof(DSDT)) {
FAbort ("Invalid image size in", File);
}
Dsdt = (PDSDT) File->Image;
if (Dsdt->Signature != 'TDSD') {
FAbort ("Image signature not DSDT in", File);
}
if (File->FileSize != Dsdt->Length) {
FAbort ("File size in DSDT does not match image size in", File);
}
check = 0;
for (Image = File->Image; Image < File->EndOfImage; Image += 1) {
check += *Image;
}
if (check) {
FAbort ("Image checksum is incorrect in", File);
}
// normalize fixed strings
File->OemID = FixString (Dsdt->OemID, 6);
File->OemTableID = FixString (Dsdt->OemID, 8);
memcpy (File->OemRevision, Dsdt->OemRevision, 4);
for (i=0; i < 4; i++) {
if (File->OemRevision[i] == 0 || File->OemRevision[i] == ' ') {
File->OemRevision[i] = '_';
}
}
if (Verbose) {
printf ("\n");
printf ("DSDT info for %s (%s)\n", File->Desc, File->FileName);
printf (" size of image: %d\n", File->FileSize);
printf (" OEM id.......: %s\n", File->OemID);
printf (" OEM Table id.: %s\n", File->OemTableID);
printf (" OEM revision.: %4x\n", File->OemRevision);
}
}
PUCHAR
FixString (
IN PUCHAR Str,
IN ULONG Len
)
{
PUCHAR p;
ULONG i;
p = malloc(Len+1);
memcpy (p, Str, Len);
p[Len] = 0;
for (i=Len; i; i--) {
if (p[i] != ' ') {
break;
}
p[i] = 0;
}
return p;
}
VOID
FAbort (
PUCHAR Text,
PIFILE File
)
{
printf ("%s %s (%s)\n", Text, File->Desc, File->FileName);
Abort();
}
VOID
Abort(
VOID
)
{
if (!ArgsParsed) {
printf ("amlload: UpdateImage [OriginalImage] [-v] [-d]\n");
}
exit (1);
}
VOID
ParseArgs (
IN int argc,
IN char *argv[]
)
{
PIFILE File;
OFSTRUCT OpenBuf;
File = &Orig;
while (--argc) {
argv += 1;
//
// If it's a flag crack it
//
if (argv[0][0] == '-') {
switch (argv[0][1]) {
case 'v':
case 'V':
Verbose = TRUE;
break;
default:
printf ("Unkown flag %s\n", argv[0]);
Abort ();
}
} else {
if (!File) {
printf ("Unexcepted parameter %s\n", argv[0]);
Abort();
}
//
// Open the file
//
File->FileName = argv[0];
File->FileHandle = OpenFile(argv[0], &OpenBuf, OF_READ);
if (File->FileHandle == HFILE_ERROR) {
FAbort ("Can not open", File);
}
File->FileSize = GetFileSize(File->FileHandle, NULL);
//
// Map it
//
File->MapHandle =
CreateFileMapping(
File->FileHandle,
NULL,
PAGE_READONLY,
0,
File->FileSize,
NULL
);
if (!File->MapHandle) {
FAbort ("Can not map", File);
}
File->Image =
MapViewOfFile (
File->MapHandle,
FILE_MAP_READ,
0,
0,
File->FileSize
);
if (!File->Image) {
FAbort ("Can not map view of image", File);
}
File->EndOfImage = File->Image + File->FileSize;
File->Opened = TRUE;
//
// Next file param
//
File = NULL;
}
}
//
// At least a update image is needed
//
if (!Orig.Opened) {
Abort ();
}
ArgsParsed = TRUE;
return ;
}
PVOID
MEMORY_ALLOCATE(
ULONG Num
)
{
return malloc( Num );
}
VOID
MEMORY_COPY(
PVOID Dest,
PVOID Src,
ULONG Length
)
{
memcpy( Dest, Src, Length);
}
VOID
MEMORY_FREE(
PVOID Dest
)
{
free( Dest );
}
VOID
MEMORY_SET(
PVOID Src,
UCHAR Value,
ULONG Length
)
{
memset(Src, Value, Length );
}
VOID
MEMORY_ZERO(
PVOID Src,
ULONG Length
)
{
memset( Src, 0, Length );
}
VOID
PRINTF(
PUCHAR String,
...
)
{
va_list ap;
va_start( ap, String );
vprintf( String, ap );
va_end( ap );
}
ULONG
STRING_LENGTH(
PUCHAR String
)
{
return strlen( String );
}
VOID
STRING_PRINT(
PUCHAR Buffer,
PUCHAR String,
...
)
{
va_list ap;
va_start( ap, String );
vsprintf( Buffer, String, ap );
va_end( ap );
}