void AbDisplayHeader ( char *FilePath) { UINT32 Actual; FILE *File; File = fopen (FilePath, "rb"); if (!File) { printf ("Could not open file %s\n", FilePath); return; } Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); fclose (File); if (Actual != sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain a valid ACPI table header\n", FilePath); return; } if (!AbValidateHeader (&Header1)) { return; } AbPrintHeaderInfo (&Header1); }
void AbComputeChecksum ( char *FilePath) { UINT32 Actual; ACPI_TABLE_HEADER *Table; UINT8 Checksum; FILE *File; File = fopen (FilePath, "rb"); if (!File) { printf ("Could not open file %s\n", FilePath); return; } Actual = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); if (Actual < sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain a valid ACPI table header\n", FilePath); goto Exit1; } if (!AbValidateHeader (&Header1)) { goto Exit1; } if (!Gbl_TerseMode) { AbPrintHeaderInfo (&Header1); } /* Allocate a buffer to hold the entire table */ Table = AcpiOsAllocate (Header1.Length); if (!Table) { printf ("Could not allocate buffer for table\n"); goto Exit1; } /* Read the entire table, including header */ fseek (File, 0, SEEK_SET); Actual = fread (Table, 1, Header1.Length, File); if (Actual != Header1.Length) { printf ("Could not read table, length %u\n", Header1.Length); goto Exit2; } /* Compute the checksum for the table */ Table->Checksum = 0; Checksum = (UINT8) (0 - AcpiTbSumTable (Table, Table->Length)); printf ("Computed checksum: 0x%X\n\n", Checksum); if (Header1.Checksum == Checksum) { printf ("Checksum OK in AML file, not updating\n"); goto Exit2; } /* Open the target file for writing, to update checksum */ fclose (File); File = fopen (FilePath, "r+b"); if (!File) { printf ("Could not open file %s for writing\n", FilePath); goto Exit2; } /* Set the checksum, write the new header */ Header1.Checksum = Checksum; Actual = fwrite (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File); if (Actual != sizeof (ACPI_TABLE_HEADER)) { printf ("Could not write updated table header\n"); goto Exit2; } printf ("Wrote new checksum\n"); Exit2: AcpiOsFree (Table); Exit1: if (File) { fclose (File); } return; }
int AbCompareAmlFiles ( char *File1Path, char *File2Path) { UINT32 Actual1; UINT32 Actual2; UINT32 Offset; UINT8 Char1; UINT8 Char2; UINT8 Mismatches = 0; BOOLEAN HeaderMismatch = FALSE; File1 = fopen (File1Path, "rb"); if (!File1) { printf ("Could not open file %s\n", File1Path); return -1; } File2 = fopen (File2Path, "rb"); if (!File2) { printf ("Could not open file %s\n", File2Path); return -1; } /* Read the ACPI header from each file */ Actual1 = fread (&Header1, 1, sizeof (ACPI_TABLE_HEADER), File1); if (Actual1 < sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain an ACPI table header\n", File1Path); return -1; } Actual2 = fread (&Header2, 1, sizeof (ACPI_TABLE_HEADER), File2); if (Actual2 < sizeof (ACPI_TABLE_HEADER)) { printf ("File %s does not contain an ACPI table header\n", File2Path); return -1; } if ((!AbValidateHeader (&Header1)) || (!AbValidateHeader (&Header2))) { return -1; } /* Table signatures must match */ if (*((UINT32 *) Header1.Signature) != *((UINT32 *) Header2.Signature)) { printf ("Table signatures do not match\n"); return -1; } if (!Gbl_TerseMode) { /* Display header information */ AbPrintHeaderInfo (&Header1); AbPrintHeaderInfo (&Header2); } if (memcmp (Header1.Signature, Header2.Signature, sizeof (ACPI_TABLE_HEADER))) { printf ("Headers do not match exactly\n"); HeaderMismatch = TRUE; } /* Do the byte-by-byte compare */ Actual1 = fread (&Char1, 1, 1, File1); Actual2 = fread (&Char2, 1, 1, File2); Offset = sizeof (ACPI_TABLE_HEADER); while (Actual1 && Actual2) { if (Char1 != Char2) { printf ("Error - Byte mismatch at offset %8.8X: 0x%2.2X 0x%2.2X\n", Offset, Char1, Char2); Mismatches++; if (Mismatches > 100) { printf ("100 Mismatches: Too many mismatches\n"); return -1; } } Offset++; Actual1 = fread (&Char1, 1, 1, File1); Actual2 = fread (&Char2, 1, 1, File2); } if (Actual1) { printf ("Error - file %s is longer than file %s\n", File1Path, File2Path); Mismatches++; } else if (Actual2) { printf ("Error - file %s is shorter than file %s\n", File1Path, File2Path); Mismatches++; } else if (!Mismatches) { if (HeaderMismatch) { printf ("Files compare exactly after header\n"); } else { printf ("Files compare exactly\n"); } } printf ("%u Mismatches found\n", Mismatches); return 0; }