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