-/*++\r
-\r
-Copyright (c) 2004, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name: \r
-\r
- GuidChk.c \r
- \r
-Abstract:\r
-\r
- Parse files in a directory and subdirectories to find all guid definitions.\r
- Then check them against each other to make sure there are no duplicates.\r
- \r
---*/\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-#include <ctype.h>\r
-\r
-#include "CommonUtils.h"\r
-#include "FileSearch.h"\r
-#include "UtilsMsgs.h"\r
-\r
-#define MAX_LINE_LEN 180 // we concatenate two lines sometimes\r
-// Define a structure that correlates filename extensions to an enumerated\r
-// type.\r
-//\r
-typedef struct {\r
- INT8 *Extension;\r
- INT8 ExtensionCode;\r
-} FILE_TYPE_TABLE_ENTRY;\r
-\r
-#define FILE_EXTENSION_UNKNOWN 0\r
-#define FILE_EXTENSION_C 1\r
-#define FILE_EXTENSION_H 2\r
-#define FILE_EXTENSION_IA32_ASM 3\r
-#define FILE_EXTENSION_IA32_INC 4\r
-#define FILE_EXTENSION_IA64_ASM 5\r
-#define FILE_EXTENSION_IA64_INC 6\r
-#define FILE_EXTENSION_PKG 7\r
-#define FILE_EXTENSION_INF 8\r
-\r
-FILE_TYPE_TABLE_ENTRY FileTypeTable[] = {\r
- ".c",\r
- FILE_EXTENSION_C,\r
- ".h",\r
- FILE_EXTENSION_H,\r
- ".inc",\r
- FILE_EXTENSION_IA32_INC,\r
- ".asm",\r
- FILE_EXTENSION_IA32_ASM,\r
- ".s",\r
- FILE_EXTENSION_IA64_ASM,\r
- ".pkg",\r
- FILE_EXTENSION_PKG,\r
- ".inf",\r
- FILE_EXTENSION_INF,\r
- ".i",\r
- FILE_EXTENSION_IA64_INC,\r
- NULL,\r
- 0\r
-};\r
-\r
-typedef struct EFI_GUID {\r
- UINT32 Data1;\r
- UINT16 Data2;\r
- UINT16 Data3;\r
- UINT8 Data4[8];\r
-} EFI_GUID;\r
-\r
-typedef struct {\r
- INT8 Data[4];\r
- INT8 DataLen;\r
-} EFI_SIGNATURE;\r
-\r
-typedef struct _GUID_RECORD {\r
- struct _GUID_RECORD *Next;\r
- BOOLEAN Reported;\r
- INT8 *FileName;\r
- INT8 *SymName;\r
- EFI_GUID Guid;\r
-} GUID_RECORD;\r
-\r
-typedef struct _SIGNATURE_RECORD {\r
- struct _SIGNATURE_RECORD *Next;\r
- BOOLEAN Reported;\r
- INT8 *FileName;\r
- EFI_SIGNATURE Signature;\r
-} SIGNATURE_RECORD;\r
-\r
-//\r
-// Utility options\r
-//\r
-typedef struct {\r
- INT8 DatabaseOutputFileName[MAX_PATH]; // with -b option\r
- STRING_LIST *ExcludeDirs; // list of directory names not to process\r
- STRING_LIST *ExcludeSubDirs; // list of directory names to not process subdirectories (build)\r
- STRING_LIST *ExcludeFiles; // list of files to exclude (make.inf)\r
- STRING_LIST *ExcludeExtensions; // list of filename extensions to exclude (.inf, .pkg)\r
- BOOLEAN Verbose;\r
- BOOLEAN PrintFound;\r
- BOOLEAN CheckGuids;\r
- BOOLEAN CheckSignatures;\r
- BOOLEAN GuidXReference;\r
-} OPTIONS;\r
-\r
-static\r
-STATUS\r
-ProcessArgs (\r
- int Argc,\r
- char *Argv[]\r
- );\r
-\r
-static\r
-VOID\r
-Usage (\r
- VOID\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessDirectory (\r
- INT8 *Path,\r
- INT8 *DirectoryName\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessFile (\r
- INT8 *DirectoryName,\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-UINT32\r
-GetFileExtension (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-UINT32\r
-SkipWhiteSpace (\r
- INT8 *Str\r
- );\r
-\r
-static\r
-UINT32\r
-ValidSymbolName (\r
- INT8 *Name\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessCFileGuids (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-STATUS\r
-AddSignature (\r
- INT8 *FileName,\r
- INT8 *StrDef,\r
- UINT32 SigSize\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessCFileSigs (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessINFFileGuids (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessPkgFileGuids (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessIA32FileGuids (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-STATUS\r
-ProcessIA64FileGuids (\r
- INT8 *FileName\r
- );\r
-\r
-static\r
-BOOLEAN\r
-IsIA64GuidLine (\r
- INT8 *Line,\r
- UINT32 *GuidHigh,\r
- UINT32 *GuidLow,\r
- BOOLEAN *Low,\r
- INT8 *SymName\r
- );\r
-\r
-static\r
-STATUS\r
-AddGuid11 (\r
- INT8 *FileName,\r
- UINT32 *Data,\r
- INT8 *SymName\r
- );\r
-\r
-static\r
-STATUS\r
-AddPkgGuid (\r
- INT8 *FileName,\r
- UINT32 *Data,\r
- UINT64 *Data64\r
- );\r
-\r
-static\r
-STATUS\r
-AddGuid16 (\r
- INT8 *FileName,\r
- UINT32 *Data\r
- );\r
-\r
-static\r
-STATUS\r
-AddGuid64x2 (\r
- INT8 *FileName,\r
- UINT32 DataHH, // Upper 32-bits of upper 64 bits of guid\r
- UINT32 DataHL, // Lower 32-bits of upper 64 bits\r
- UINT32 DataLH,\r
- UINT32 DataLL\r
- );\r
-\r
-static\r
-VOID\r
-FreeGuids (\r
- VOID\r
- );\r
-\r
-static\r
-VOID\r
-FreeSigs (\r
- VOID\r
- );\r
-\r
-static\r
-STATUS\r
-CheckDuplicates (\r
- VOID\r
- );\r
-\r
-//\r
-// static\r
-// VOID\r
-// ReportGuid (\r
-// INT8 *FileName,\r
-// GUID_RECORD *FileRecord\r
-// );\r
-//\r
-static\r
-VOID\r
-FreeOptions (\r
- VOID\r
- );\r
-\r
-static\r
-BOOLEAN\r
-CheckGuidData (\r
- UINT32 *GuidData,\r
- UINT32 DataCount\r
- );\r
-\r
-/**************************** GLOBALS ****************************************/\r
-static GUID_RECORD *gGuidList = NULL;\r
-static SIGNATURE_RECORD *gSignatureList = NULL;\r
-static OPTIONS gOptions;\r
-\r
-/*****************************************************************************/\r
-int\r
-main (\r
- int Argc,\r
- char *Argv[]\r
- )\r
-{\r
- INT8 *Cwd;\r
- STATUS Status;\r
-\r
- SetUtilityName ("GuidChk");\r
- //\r
- // Get the current working directory and then process the command line\r
- // arguments.\r
- //\r
- Cwd = _getcwd (NULL, 0);\r
- Status = ProcessArgs (Argc, Argv);\r
- if (Status != STATUS_SUCCESS) {\r
- return Status;\r
- }\r
-\r
- if (gOptions.CheckGuids || gOptions.CheckSignatures) {\r
- Status = ProcessDirectory (Cwd, NULL);\r
- if (Status == STATUS_SUCCESS) {\r
- //\r
- // Check for duplicates\r
- //\r
- Status = CheckDuplicates ();\r
- }\r
- }\r
-\r
- if (gOptions.DatabaseOutputFileName[0] != 0) {\r
- CreateGuidList (gOptions.DatabaseOutputFileName);\r
- }\r
- //\r
- // Free up the memory\r
- //\r
- free (Cwd);\r
- FreeGuids ();\r
- FreeSigs ();\r
- FreeOptions ();\r
- return GetUtilityStatus ();\r
-}\r
-\r
-static\r
-STATUS\r
-ProcessArgs (\r
- int Argc,\r
- char *Argv[]\r
- )\r
-{\r
- STRING_LIST *StrList;\r
-\r
- memset ((char *) &gOptions, 0, sizeof (gOptions));\r
- //\r
- // skip over program name\r
- //\r
- Argc--;\r
- Argv++;\r
-\r
- if (Argc == 0) {\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- while (Argc > 0) {\r
- //\r
- // Look for options\r
- //\r
- if ((Argv[0][0] == '-') || (Argv[0][0] == '/')) {\r
- switch (Argv[0][1]) {\r
- //\r
- // Help option\r
- //\r
- case 'h':\r
- case 'H':\r
- case '?':\r
- Usage ();\r
- return STATUS_ERROR;\r
- break;\r
-\r
- //\r
- // Check guids option\r
- //\r
- case 'g':\r
- case 'G':\r
- gOptions.CheckGuids = TRUE;\r
- break;\r
-\r
- //\r
- // Check signatures option\r
- //\r
- case 's':\r
- case 'S':\r
- gOptions.CheckSignatures = TRUE;\r
- break;\r
-\r
- //\r
- // Print guids found option\r
- //\r
- case 'p':\r
- case 'P':\r
- gOptions.PrintFound = TRUE;\r
- break;\r
-\r
- //\r
- // Exclude files option\r
- //\r
- case 'f':\r
- case 'F':\r
- //\r
- // Check for another arg\r
- //\r
- if (Argc < 2) {\r
- Error (NULL, 0, 0, Argv[0], "missing argument with option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- StrList = malloc (sizeof (STRING_LIST));\r
- if (StrList == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) StrList, 0, sizeof (STRING_LIST));\r
- StrList->Str = Argv[1];\r
- StrList->Next = gOptions.ExcludeFiles;\r
- gOptions.ExcludeFiles = StrList;\r
- Argc--;\r
- Argv++;\r
- break;\r
-\r
- //\r
- // Exclude directories option\r
- //\r
- case 'd':\r
- case 'D':\r
- //\r
- // Check for another arg\r
- //\r
- if (Argc < 2) {\r
- Error (NULL, 0, 0, Argv[0], "missing argument with option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- StrList = malloc (sizeof (STRING_LIST));\r
- if (StrList == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) StrList, 0, sizeof (STRING_LIST));\r
- StrList->Str = Argv[1];\r
- StrList->Next = gOptions.ExcludeDirs;\r
- gOptions.ExcludeDirs = StrList;\r
- Argc--;\r
- Argv++;\r
- break;\r
-\r
- //\r
- // -u exclude all subdirectories of a given directory option\r
- //\r
- case 'u':\r
- case 'U':\r
- //\r
- // Check for another arg\r
- //\r
- if (Argc < 2) {\r
- Error (NULL, 0, 0, Argv[0], "missing argument with option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- StrList = malloc (sizeof (STRING_LIST));\r
- if (StrList == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) StrList, 0, sizeof (STRING_LIST));\r
- StrList->Str = Argv[1];\r
- StrList->Next = gOptions.ExcludeSubDirs;\r
- gOptions.ExcludeSubDirs = StrList;\r
- Argc--;\r
- Argv++;\r
- break;\r
-\r
- //\r
- // -e exclude by filename extension option\r
- //\r
- case 'e':\r
- case 'E':\r
- //\r
- // Check for another arg\r
- //\r
- if (Argc < 2) {\r
- Error (NULL, 0, 0, Argv[0], "missing argument with option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- StrList = malloc (sizeof (STRING_LIST));\r
- if (StrList == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) StrList, 0, sizeof (STRING_LIST));\r
- //\r
- // Let them put a * in front of the filename extension\r
- //\r
- StrList->Str = Argv[1];\r
- if (StrList->Str[0] == '*') {\r
- StrList->Str++;\r
- }\r
-\r
- StrList->Next = gOptions.ExcludeExtensions;\r
- gOptions.ExcludeExtensions = StrList;\r
- Argc--;\r
- Argv++;\r
- break;\r
-\r
- //\r
- // Print guid with matching symbol name for guid definitions found\r
- //\r
- case 'x':\r
- case 'X':\r
- gOptions.GuidXReference = 1;\r
- break;\r
-\r
- //\r
- // -b Print the internal database list to a file\r
- //\r
- case 'b':\r
- case 'B':\r
- //\r
- // Check for one more arg\r
- //\r
- if (Argc < 2) {\r
- Error (NULL, 0, 0, Argv[0], "must specify file name with option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- strcpy (gOptions.DatabaseOutputFileName, Argv[1]);\r
- Argc--;\r
- Argv++;\r
- break;\r
-\r
- default:\r
- Error (NULL, 0, 0, Argv[0], "invalid option");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
- } else {\r
- break;\r
- }\r
- //\r
- // Next arg\r
- //\r
- Argc--;\r
- Argv++;\r
- }\r
-\r
- if (Argc > 0) {\r
- Error (NULL, 0, 0, Argv[0], "invalid argument");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Have to check signatures, GUIDs, or dump the GUID database.\r
- //\r
- if ((!gOptions.CheckGuids) && (!gOptions.CheckSignatures) && (gOptions.DatabaseOutputFileName[0] == 0)) {\r
- Error (NULL, 0, 0, "nothing to do", "must specify -g, -s, and/or -b");\r
- Usage ();\r
- return STATUS_ERROR;\r
- }\r
-\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Print usage instructions\r
-//\r
-static\r
-VOID\r
-Usage (\r
- VOID\r
- )\r
-{\r
- int Index;\r
- char *Str[] = {\r
- "GuidChk - scan files for duplicate GUID or signature definitions",\r
- "",\r
- "Usage: GuidChk {options}\n",\r
- " Options: ",\r
- " -d dirname exclude searching of a directory",\r
- " -f filename exclude searching of a file",\r
- " -e extension exclude searching of files by extension",\r
- " -p print all GUIDS found",\r
- " -g check for duplicate guids",\r
- " -s check for duplicate signatures",\r
- " -x print guid+defined symbol name",\r
- " -b outfile write internal GUID+basename list to outfile",\r
- " -u dirname exclude searching all subdirectories of a directory",\r
- " -h -? print this help text",\r
- " ",\r
- " Example: GuidChk -g -u build -d fv -f make.inf -e .pkg",\r
- "",\r
- NULL\r
- };\r
- for (Index = 0; Str[Index] != NULL; Index++) {\r
- fprintf (stdout, "%s\n", Str[Index]);\r
- }\r
-}\r
-//\r
-// Process an entire directory by name\r
-//\r
-static\r
-STATUS\r
-ProcessDirectory (\r
- INT8 *Path,\r
- INT8 *DirectoryName\r
- )\r
-{\r
- FILE_SEARCH_DATA FSData;\r
- char *FileMask;\r
- BOOLEAN Done;\r
- UINT32 Len;\r
- BOOLEAN NoSubdirs;\r
- STRING_LIST *SLPtr;\r
-\r
- //\r
- // Root directory may be null\r
- //\r
- if (DirectoryName != NULL) {\r
- //\r
- // printf ("Processing directory: %s\n", DirectoryName);\r
- //\r
- }\r
- //\r
- // Initialize our file searching\r
- //\r
- FileSearchInit (&FSData);\r
-\r
- //\r
- // Exclude some directories, files, and extensions\r
- //\r
- FileSearchExcludeDirs (&FSData, gOptions.ExcludeDirs);\r
- FileSearchExcludeExtensions (&FSData, gOptions.ExcludeExtensions);\r
- FileSearchExcludeFiles (&FSData, gOptions.ExcludeFiles);\r
- //\r
- // See if this directory is in the list of directories that they\r
- // don't want to process subdirectories of\r
- //\r
- NoSubdirs = FALSE;\r
- if (DirectoryName != NULL) {\r
- for (SLPtr = gOptions.ExcludeSubDirs; SLPtr != NULL; SLPtr = SLPtr->Next) {\r
- if (stricmp (SLPtr->Str, DirectoryName) == 0) {\r
- //\r
- // printf ("not processing subdirectories of %s\n", DirectoryName);\r
- //\r
- NoSubdirs = TRUE;\r
- break;\r
- }\r
- }\r
- }\r
- //\r
- // Create a filemask of files to search for. We'll append "\*.*" on the\r
- // end, so allocate some extra bytes.\r
- //\r
- Len = strlen (Path) + 10;\r
- if (DirectoryName != NULL) {\r
- Len += strlen (DirectoryName);\r
- }\r
-\r
- FileMask = malloc (Len);\r
- if (FileMask == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Now put it all together\r
- //\r
- strcpy (FileMask, Path);\r
- if ((DirectoryName != NULL) && (strlen (DirectoryName) > 0)) {\r
- strcat (FileMask, "\\");\r
- strcat (FileMask, DirectoryName);\r
- }\r
-\r
- strcat (FileMask, "\\*.*");\r
-\r
- //\r
- // Start file searching for files and directories\r
- //\r
- FileSearchStart (&FSData, FileMask, FILE_SEARCH_FILE | FILE_SEARCH_DIR);\r
-\r
- //\r
- // Now hack the "\*.*" off the end of the filemask so we can use it to pass\r
- // the full directory path on recursive calls to process directories.\r
- //\r
- FileMask[strlen (FileMask) - 4] = 0;\r
-\r
- //\r
- // Loop until no more files\r
- //\r
- Done = FALSE;\r
- while (!Done) {\r
- //\r
- // printf ("Found %s...", FSData.FileName);\r
- //\r
- if (FSData.FileFlags & FILE_SEARCH_DIR) {\r
- //\r
- // printf ("directory\n");\r
- //\r
- if (!NoSubdirs) {\r
- ProcessDirectory (FileMask, FSData.FileName);\r
- }\r
- } else if (FSData.FileFlags & FILE_SEARCH_FILE) {\r
- //\r
- // printf ("file\n");\r
- //\r
- ProcessFile (FileMask, FSData.FileName);\r
- } else {\r
- //\r
- // printf ("unknown\n");\r
- //\r
- }\r
-\r
- if (FileSearchFindNext (&FSData) != STATUS_SUCCESS) {\r
- Done = TRUE;\r
- }\r
- }\r
- //\r
- // Free up allocated memory\r
- //\r
- free (FileMask);\r
-\r
- //\r
- // Free up our file searching\r
- //\r
- FileSearchDestroy (&FSData);\r
-\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Process a single file.\r
-//\r
-static\r
-STATUS\r
-ProcessFile (\r
- INT8 *DirectoryName,\r
- INT8 *FileName\r
- )\r
-{\r
- STATUS Status;\r
- UINT32 FileExtension;\r
- INT8 FullFileName[MAX_PATH];\r
-\r
- Status = STATUS_SUCCESS;\r
-\r
- sprintf (FullFileName, "%s\\%s", DirectoryName, FileName);\r
- //\r
- // printf ("Found file: %s\n", FullFileName);\r
- //\r
- FileExtension = GetFileExtension (FileName);\r
-\r
- //\r
- // Process these for GUID checks\r
- //\r
- if (gOptions.CheckGuids) {\r
- switch (FileExtension) {\r
- case FILE_EXTENSION_C:\r
- case FILE_EXTENSION_H:\r
- Status = ProcessCFileGuids (FullFileName);\r
- break;\r
-\r
- case FILE_EXTENSION_PKG:\r
- Status = ProcessPkgFileGuids (FullFileName);\r
- break;\r
-\r
- case FILE_EXTENSION_IA32_INC:\r
- case FILE_EXTENSION_IA32_ASM:\r
- Status = ProcessIA32FileGuids (FullFileName);\r
- break;\r
-\r
- case FILE_EXTENSION_INF:\r
- Status = ProcessINFFileGuids (FullFileName);\r
- break;\r
-\r
- case FILE_EXTENSION_IA64_INC:\r
- case FILE_EXTENSION_IA64_ASM:\r
- Status = ProcessIA64FileGuids (FullFileName);\r
- break;\r
-\r
- default:\r
- //\r
- // No errors anyway\r
- //\r
- Status = STATUS_SUCCESS;\r
- break;\r
- }\r
- }\r
-\r
- if (gOptions.CheckSignatures) {\r
- switch (FileExtension) {\r
- case FILE_EXTENSION_C:\r
- case FILE_EXTENSION_H:\r
- Status = ProcessCFileSigs (FullFileName);\r
- break;\r
-\r
- default:\r
- //\r
- // No errors anyway\r
- //\r
- Status = STATUS_SUCCESS;\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-//\r
-// Return a code indicating the file name extension.\r
-//\r
-static\r
-UINT32\r
-GetFileExtension (\r
- INT8 *FileName\r
- )\r
-{\r
- INT8 *Extension;\r
- int Index;\r
-\r
- //\r
- // Look back for a filename extension\r
- //\r
- for (Extension = FileName + strlen (FileName) - 1; Extension >= FileName; Extension--) {\r
- if (*Extension == '.') {\r
- for (Index = 0; FileTypeTable[Index].Extension != NULL; Index++) {\r
- if (stricmp (FileTypeTable[Index].Extension, Extension) == 0) {\r
- return FileTypeTable[Index].ExtensionCode;\r
- }\r
- }\r
- }\r
- }\r
-\r
- return FILE_TYPE_UNKNOWN;\r
-}\r
-//\r
-// Process a .pkg file.\r
-//\r
-// Look for FFS_FILEGUID=35b898ca-b6a9-49ce-8c72-904735cc49b7\r
-//\r
-static\r
-STATUS\r
-ProcessPkgFileGuids (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN * 2];\r
- INT8 *Cptr;\r
- INT8 *Cptr2;\r
- UINT32 GuidScan[11];\r
- UINT64 Guid64;\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Read lines from the file until done\r
- //\r
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Line);\r
- if (strncmp (Cptr, "FFS_FILEGUID", 12) == 0) {\r
- Cptr += 12;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (*Cptr == '=') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr + 1);\r
- //\r
- // Blank out dashes on the line.\r
- //\r
- for (Cptr2 = Cptr; *Cptr2; Cptr2++) {\r
- if (*Cptr2 == '-') {\r
- *Cptr2 = ' ';\r
- }\r
- }\r
-\r
- if (sscanf (\r
- Cptr,\r
- "%X %X %X %X %I64X",\r
- &GuidScan[0],\r
- &GuidScan[1],\r
- &GuidScan[2],\r
- &GuidScan[3],\r
- &Guid64\r
- ) == 5) {\r
- AddPkgGuid (FileName, GuidScan, &Guid64);\r
- } else {\r
- DebugMsg (NULL, 0, 0, FileName, "GUID scan failed");\r
- }\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Process an IA32 assembly file.\r
-//\r
-// Look for:\r
-// FIND_FD_GUID_VAL equ 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h\r
-// PEI_GUID_FileNameGuid_Gmch815 equ 081818181h, 08181h, 08181h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 081h\r
-//\r
-static\r
-STATUS\r
-ProcessIA32FileGuids (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN];\r
- INT8 *Cptr;\r
- INT8 CSave;\r
- INT8 *CSavePtr;\r
- UINT32 Len;\r
- UINT32 GuidData[16];\r
- UINT32 Index;\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Read lines from the file until done\r
- //\r
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Line);\r
- //\r
- // Look for xxxGUIDyyy equ 01h, 02h, 03h, ...\r
- //\r
- Len = ValidSymbolName (Cptr);\r
- if (Len) {\r
- //\r
- // Terminate the line after the symbol name, then look for "guid" in\r
- // the name.\r
- //\r
- CSavePtr = Cptr + Len;\r
- CSave = *CSavePtr;\r
- *CSavePtr = 0;\r
- while (*Cptr) {\r
- if (strnicmp (Cptr, "guid", 4) == 0) {\r
- break;\r
- }\r
-\r
- Cptr++;\r
- }\r
- //\r
- // If we found the string "guid", continue\r
- //\r
- if (*Cptr) {\r
- //\r
- // Restore the character on the line where we null-terminated the symbol\r
- //\r
- *CSavePtr = CSave;\r
- Cptr = CSavePtr;\r
- Len = SkipWhiteSpace (Cptr);\r
- //\r
- // Had to be some white space\r
- //\r
- if (Len) {\r
- Cptr += Len;\r
- //\r
- // now look for "equ"\r
- //\r
- if (strnicmp (Cptr, "equ", 3) == 0) {\r
- Cptr += 3;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Now scan all the data\r
- //\r
- for (Index = 0; Index < 16; Index++) {\r
- if (sscanf (Cptr, "%X", &GuidData[Index]) != 1) {\r
- break;\r
- }\r
- //\r
- // Skip to next\r
- //\r
- while (isxdigit (*Cptr)) {\r
- Cptr++;\r
- }\r
-\r
- if ((*Cptr != 'h') && (*Cptr != 'H')) {\r
- break;\r
- } else {\r
- Cptr++;\r
- while (*Cptr && (isspace (*Cptr) || (*Cptr == ','))) {\r
- Cptr++;\r
- }\r
- }\r
- }\r
- //\r
- // Now see which form we had\r
- //\r
- if (Index == 16) {\r
- AddGuid16 (FileName, GuidData);\r
- } else if (Index == 11) {\r
- AddGuid11 (FileName, GuidData, NULL);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Found and parsed an IA32 assembly code guid. Save the 16 bytes off in the list\r
-// of guids.\r
-//\r
-static\r
-STATUS\r
-AddGuid16 (\r
- INT8 *FileName,\r
- UINT32 *Data\r
- )\r
-{\r
- GUID_RECORD *NewRec;\r
- int Index;\r
-\r
- //\r
- // Sanity check the data\r
- //\r
- if (!CheckGuidData (Data, 16)) {\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Allocate memory for a new guid structure\r
- //\r
- NewRec = malloc (sizeof (GUID_RECORD));\r
- if (NewRec == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) NewRec, 0, sizeof (GUID_RECORD));\r
- NewRec->FileName = malloc (strlen (FileName) + 1);\r
- if (NewRec->FileName == NULL) {\r
- free (NewRec);\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- strcpy (NewRec->FileName, FileName);\r
- NewRec->Guid.Data1 = (UINT32) (Data[0] | (Data[1] << 8) | (Data[2] << 16) | (Data[3] << 24));\r
- NewRec->Guid.Data2 = (UINT16) (Data[4] | (Data[5] << 8));\r
- NewRec->Guid.Data3 = (UINT16) (Data[6] | (Data[7] << 8));\r
- for (Index = 0; Index < 8; Index++) {\r
- NewRec->Guid.Data4[Index] = (UINT8) Data[Index + 8];\r
- }\r
- //\r
- // Add it to the list\r
- //\r
- NewRec->Next = gGuidList;\r
- gGuidList = NewRec;\r
-\r
- //\r
- // Report it\r
- // ReportGuid (FileName, NewRec);\r
- //\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Add a GUID defined as GuidLow: 0x1122334455667788\r
-// GuidHi: 0x99AABBCCDDEEFF00\r
-//\r
-// These are equivalent:\r
-// { 0x11223344, 0x5566, 0x7788, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00 }\r
-// and:\r
-// Low: 00FFEEDDCCBBAA99\r
-// Hi: 7788556611223344\r
-//\r
-static\r
-STATUS\r
-AddGuid64x2 (\r
- INT8 *FileName,\r
- UINT32 DataHH, // Upper 32-bits of upper 64 bits of guid\r
- UINT32 DataHL, // Lower 32-bits of upper 64 bits\r
- UINT32 DataLH,\r
- UINT32 DataLL\r
- )\r
-{\r
- GUID_RECORD *NewRec;\r
- int Index;\r
-\r
- //\r
- // Allocate memory for a new guid structure\r
- //\r
- NewRec = malloc (sizeof (GUID_RECORD));\r
- if (NewRec == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) NewRec, 0, sizeof (GUID_RECORD));\r
- NewRec->FileName = malloc (strlen (FileName) + 1);\r
- if (NewRec->FileName == NULL) {\r
- free (NewRec);\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- strcpy (NewRec->FileName, FileName);\r
- NewRec->Guid.Data1 = DataHL;\r
- NewRec->Guid.Data2 = (UINT16) DataHH;\r
- NewRec->Guid.Data3 = (UINT16) (DataHH >> 16);\r
- for (Index = 0; Index < 4; Index++) {\r
- NewRec->Guid.Data4[Index] = (UINT8) DataLL;\r
- DataLL >>= 8;\r
- }\r
-\r
- for (Index = 0; Index < 4; Index++) {\r
- NewRec->Guid.Data4[Index + 4] = (UINT8) DataLH;\r
- DataLH >>= 8;\r
- }\r
- //\r
- // Add it to the list\r
- //\r
- NewRec->Next = gGuidList;\r
- gGuidList = NewRec;\r
-\r
- //\r
- // Report it\r
- // ReportGuid (FileName, NewRec);\r
- //\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Process INF files. Look for:\r
-// FILE_GUID = 240612B6-A063-11d4-9A3A-0090273FC14D\r
-//\r
-static\r
-STATUS\r
-ProcessINFFileGuids (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN * 2];\r
- INT8 *Cptr;\r
- INT8 *Cptr2;\r
- UINT32 GuidScan[11];\r
- UINT64 Guid64;\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Read lines from the file until done\r
- //\r
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Line);\r
- if (strncmp (Cptr, "FILE_GUID", 9) == 0) {\r
- Cptr += 9;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (*Cptr == '=') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr + 1);\r
- //\r
- // Blank out dashes on the line.\r
- //\r
- for (Cptr2 = Cptr; *Cptr2; Cptr2++) {\r
- if (*Cptr2 == '-') {\r
- *Cptr2 = ' ';\r
- }\r
- }\r
-\r
- if (sscanf (\r
- Cptr,\r
- "%X %X %X %X %I64X",\r
- &GuidScan[0],\r
- &GuidScan[1],\r
- &GuidScan[2],\r
- &GuidScan[3],\r
- &Guid64\r
- ) == 5) {\r
- AddPkgGuid (FileName, GuidScan, &Guid64);\r
- } else {\r
- DebugMsg (NULL, 0, 0, FileName, "GUID scan failed");\r
- }\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Parse ('g','m','a','p','a','b','c','d')\r
-//\r
-static\r
-STATUS\r
-AddSignature (\r
- INT8 *FileName,\r
- INT8 *StrDef,\r
- UINT32 SigSize\r
- )\r
-{\r
- SIGNATURE_RECORD *NewRec;\r
- INT8 *Cptr;\r
- UINT32 Index;\r
- BOOLEAN Fail;\r
-\r
- //\r
- // Allocate memory for the new record\r
- //\r
- Fail = FALSE;\r
- NewRec = malloc (sizeof (SIGNATURE_RECORD));\r
- if (NewRec == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Allocate memory to save the file name\r
- //\r
- NewRec->FileName = malloc (strlen (FileName) + 1);\r
- if (NewRec->FileName == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- free (NewRec);\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Fill in the fields\r
- //\r
- strcpy (NewRec->FileName, FileName);\r
- NewRec->Signature.DataLen = (UINT8) SigSize;\r
- //\r
- // Skip to open parenthesis\r
- //\r
- Cptr = StrDef;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (*Cptr != '(') {\r
- Fail = TRUE;\r
- goto Done;\r
- }\r
-\r
- Cptr++;\r
- //\r
- // Skip to first ' and start processing\r
- //\r
- while (*Cptr && (*Cptr != '\'')) {\r
- Cptr++;\r
- }\r
-\r
- for (Index = 0; Index < SigSize; Index++) {\r
- if (*Cptr == '\'') {\r
- Cptr++;\r
- NewRec->Signature.Data[Index] = (INT8) *Cptr;\r
- //\r
- // Skip to closing quote\r
- //\r
- Cptr++;\r
- if (*Cptr != '\'') {\r
- Fail = TRUE;\r
- break;\r
- }\r
- //\r
- // Skip over closing quote, go to next one\r
- //\r
- Cptr++;\r
- while (*Cptr && (*Cptr != '\'')) {\r
- Cptr++;\r
- }\r
- } else {\r
- Fail = TRUE;\r
- DebugMsg (NULL, 0, 0, StrDef, "failed to parse signature");\r
- break;\r
- }\r
- }\r
-\r
-Done:\r
- if (Fail) {\r
- free (NewRec->FileName);\r
- free (NewRec);\r
- return STATUS_ERROR;\r
- }\r
-\r
- NewRec->Next = gSignatureList;\r
- gSignatureList = NewRec;\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Look for:\r
-// #define POOL_HEAD_SIGNATURE EFI_SIGNATURE_16('p','h')\r
-// #define GCD_MEMORY_MAP_SIGNATURE EFI_SIGNATURE_32('g','m','a','p')\r
-// #define GCD_MEMORY_MAP_SIGNATURE EFI_SIGNATURE_64('g','m','a','p','a','b','c','d')\r
-//\r
-static\r
-STATUS\r
-ProcessCFileSigs (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN * 2];\r
- INT8 *Cptr;\r
- UINT32 Len;\r
- UINT32 LineLen;\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Read lines from the file until done\r
- //\r
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Line);\r
- //\r
- // look for #define xxxGUIDxxx value\r
- //\r
- if (*Cptr == '#') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Look for "define"\r
- //\r
- if (!strncmp (Cptr, "define", 6)) {\r
- Cptr += 6;\r
- //\r
- // Better be whitespace\r
- //\r
- Len = SkipWhiteSpace (Cptr);\r
- if (Len) {\r
- Cptr += Len;\r
- //\r
- // See if it's a valid symbol name\r
- //\r
- Len = ValidSymbolName (Cptr);\r
- if (Len) {\r
- //\r
- // It is a valid symbol name. See if there's a line continuation,\r
- // and if so, read one more line.\r
- // Skip over the symbol name and look for the string "EFI_SIGNATURE_xx"\r
- //\r
- LineLen = strlen (Line);\r
- if ((Line[LineLen - 1] == '\n') && (Line[LineLen - 2] == '\\')) {\r
- fgets (Line + LineLen - 2, sizeof (Line) - LineLen, Fptr);\r
- } else if (Line[LineLen - 1] == '\\') {\r
- fgets (Line + LineLen - 1, sizeof (Line) - LineLen, Fptr);\r
- }\r
-\r
- Cptr += Len;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (strncmp (Cptr, "EFI_SIGNATURE_16", 16) == 0) {\r
- AddSignature (FileName, Cptr + 16, 2);\r
- } else if (strncmp (Cptr, "EFI_SIGNATURE_32", 16) == 0) {\r
- AddSignature (FileName, Cptr + 16, 4);\r
- } else if (strncmp (Cptr, "EFI_SIGNATURE_64", 16) == 0) {\r
- AddSignature (FileName, Cptr + 16, 8);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// look for #define xxxGUIDyyy { 0x...}\r
-// xxx EFI_GUID GuidName = { 0x... };\r
-//\r
-static\r
-STATUS\r
-ProcessCFileGuids (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN * 2];\r
- INT8 *Cptr;\r
- INT8 CSave;\r
- INT8 *CSavePtr;\r
- INT8 *TempCptr;\r
- INT8 *SymName;\r
- UINT32 Len;\r
- UINT32 LineLen;\r
- UINT32 GuidScan[11];\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Read lines from the file until done\r
- //\r
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Line);\r
- //\r
- // look for #define xxxGUIDxxx value\r
- //\r
- if (*Cptr == '#') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Look for "define"\r
- //\r
- if (!strncmp (Cptr, "define", 6)) {\r
- Cptr += 6;\r
- //\r
- // Better be whitespace\r
- //\r
- Len = SkipWhiteSpace (Cptr);\r
- if (Len) {\r
- Cptr += Len;\r
- //\r
- // See if it's a valid symbol name\r
- //\r
- Len = ValidSymbolName (Cptr);\r
- if (Len) {\r
- //\r
- // It is a valid symbol name. See if there's a line continuation,\r
- // and if so, read one more line.\r
- // Then truncate after the symbol name, look for the string "GUID",\r
- // and continue.\r
- //\r
- SymName = Cptr;\r
- LineLen = strlen (Line);\r
- if ((Line[LineLen - 1] == '\n') && (Line[LineLen - 2] == '\\')) {\r
- fgets (Line + LineLen - 2, sizeof (Line) - LineLen, Fptr);\r
- } else if (Line[LineLen - 1] == '\\') {\r
- fgets (Line + LineLen - 1, sizeof (Line) - LineLen, Fptr);\r
- }\r
-\r
- CSavePtr = Cptr + Len;\r
- CSave = *CSavePtr;\r
- *CSavePtr = 0;\r
- while (*Cptr) {\r
- if (strncmp (Cptr, "GUID", 4) == 0) {\r
- break;\r
- }\r
-\r
- Cptr++;\r
- }\r
- //\r
- // If we didn't run out of string, then we found the GUID string.\r
- // Now look for { 0x....... }\r
- //\r
- if (*Cptr) {\r
- Cptr = CSavePtr;\r
- *CSavePtr = CSave;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (*Cptr == '{') {\r
- *Cptr = 0;\r
- Cptr++;\r
- //\r
- // 0x665E3FF6, 0x46CC, 0x11d4, 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }\r
- // If you have one suffixed with "L", then it doesn't work. So hack off 'L' characters\r
- // in the string.\r
- //\r
- for (TempCptr = Cptr; *TempCptr; TempCptr++) {\r
- if (*TempCptr == 'L') {\r
- if (*(TempCptr + 1) == ',') {\r
- *TempCptr = ',';\r
- *(TempCptr + 1) = ' ';\r
- }\r
- }\r
- }\r
-\r
- if (sscanf (\r
- Cptr,\r
- "%X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X",\r
- &GuidScan[0],\r
- &GuidScan[1],\r
- &GuidScan[2],\r
- &GuidScan[3],\r
- &GuidScan[4],\r
- &GuidScan[5],\r
- &GuidScan[6],\r
- &GuidScan[7],\r
- &GuidScan[8],\r
- &GuidScan[9],\r
- &GuidScan[10]\r
- ) == 11) {\r
- AddGuid11 (FileName, GuidScan, SymName);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- //\r
- // Else look for "static EFI_GUID xxxGUIDxxx = { 0x.... };\r
- //\r
- } else if ((CSavePtr = strstr (Line, "EFI_GUID")) != NULL) {\r
- //\r
- // Read the next line if line continuation\r
- //\r
- LineLen = strlen (Line);\r
- if ((Line[LineLen - 1] == '\n') && (Line[LineLen - 2] == '\\')) {\r
- fgets (Line + LineLen - 2, sizeof (Line) - LineLen, Fptr);\r
- } else if (Line[LineLen - 1] == '\\') {\r
- fgets (Line + LineLen - 1, sizeof (Line) - LineLen, Fptr);\r
- }\r
-\r
- Cptr = CSavePtr + 8;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Should be variable name next\r
- //\r
- Len = ValidSymbolName (Cptr);\r
- SymName = Cptr;\r
- Cptr += Len;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if (*Cptr == '=') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Should be open-brace next to define guid\r
- //\r
- if (*Cptr == '{') {\r
- Cptr++;\r
- //\r
- // 0x665E3FF6, 0x46CC, 0x11d4, 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }\r
- //\r
- if (sscanf (\r
- Cptr,\r
- "%X, %X, %X, %X, %X, %X, %X, %X, %X, %X, %X",\r
- &GuidScan[0],\r
- &GuidScan[1],\r
- &GuidScan[2],\r
- &GuidScan[3],\r
- &GuidScan[4],\r
- &GuidScan[5],\r
- &GuidScan[6],\r
- &GuidScan[7],\r
- &GuidScan[8],\r
- &GuidScan[9],\r
- &GuidScan[10]\r
- ) == 11) {\r
- AddGuid11 (FileName, GuidScan, Cptr);\r
- //\r
- // printf ("Found guid: %s", Cptr);\r
- //\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Process Intel Itanium(TM) GUID definitions. Look for:\r
-// #define Cs870MemoryTestPEIMGuidL 0x9C2403386E1C8FAA\r
-// #define Cs870MemoryTestPEIMGuidH 0xE89E95C6180342f0\r
-// in either order.\r
-// This function assumes no blank lines between definitions.\r
-//\r
-static\r
-STATUS\r
-ProcessIA64FileGuids (\r
- INT8 *FileName\r
- )\r
-{\r
- FILE *Fptr;\r
- INT8 Line[MAX_LINE_LEN];\r
- UINT32 Guid1H;\r
- UINT32 Guid1L;\r
- UINT32 Guid2H;\r
- UINT32 Guid2L;\r
- INT8 SymName1[MAX_LINE_LEN];\r
- INT8 SymName2[MAX_LINE_LEN];\r
- BOOLEAN Done;\r
- BOOLEAN LowFirst;\r
- BOOLEAN FoundLow;\r
-\r
- if ((Fptr = fopen (FileName, "r")) == NULL) {\r
- Error (NULL, 0, 0, FileName, "could not open input file for reading");\r
- return STATUS_ERROR;\r
- }\r
-\r
- Done = FALSE;\r
- if (fgets (Line, sizeof (Line), Fptr) == NULL) {\r
- Done = 1;\r
- }\r
- //\r
- // Read lines from the file until done. Since the guid definition takes\r
- // two lines, we read lines in different places to recover gracefully\r
- // from mismatches. For example, if you thought you found the first half,\r
- // but the next line had a symbol mismatch, then you have to process the\r
- // line again in case it's the start of a new definition.\r
- //\r
- while (!Done) {\r
- //\r
- // Check current line for GUID definition. Assume low define first.\r
- //\r
- if (IsIA64GuidLine (Line, &Guid1H, &Guid1L, &FoundLow, SymName1)) {\r
- //\r
- // Might have to swap guids later. Save off if we found the LOW first\r
- //\r
- if (FoundLow) {\r
- LowFirst = TRUE;\r
- } else {\r
- LowFirst = FALSE;\r
- }\r
- //\r
- // Read the next line and try for the rest of the guid definition\r
- //\r
- if (fgets (Line, sizeof (Line), Fptr) == NULL) {\r
- Done = 1;\r
- } else {\r
- if (IsIA64GuidLine (Line, &Guid2H, &Guid2L, &FoundLow, SymName2)) {\r
- //\r
- // Found another. If the symbol names match, then save it off.\r
- //\r
- if (strcmp (SymName1, SymName2) == 0) {\r
- //\r
- // Yea, found one. Save it off.\r
- //\r
- if (LowFirst) {\r
- AddGuid64x2 (FileName, Guid2H, Guid2L, Guid1H, Guid1L);\r
- } else {\r
- AddGuid64x2 (FileName, Guid1H, Guid1L, Guid2H, Guid2L);\r
- }\r
- //\r
- // Read the next line for processing\r
- //\r
- if (fgets (Line, sizeof (Line), Fptr) == NULL) {\r
- Done = 1;\r
- }\r
- } else {\r
- //\r
- // Don't get another line so that we reprocess this line in case it\r
- // contains the start of a new definition.\r
- // fprintf (stdout, "Symbol name mismatch: %s: %s != %s\n",\r
- // FileName, SymName1, SymName2);\r
- //\r
- }\r
- } else {\r
- //\r
- // Second line was not a guid definition. Get the next line from the\r
- // file.\r
- //\r
- if (fgets (Line, sizeof (Line), Fptr) == NULL) {\r
- Done = 1;\r
- }\r
- }\r
- }\r
- } else {\r
- //\r
- // Not a guid define line. Next.\r
- //\r
- if (fgets (Line, sizeof (Line), Fptr) == NULL) {\r
- Done = 1;\r
- }\r
- }\r
- }\r
-\r
- fclose (Fptr);\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Given a line from an Itanium-based assembly file, check the line for a guid\r
-// defininition. One of either:\r
-// #define Cs870MemoryTestPEIMGuidL 0x9C2403386E1C8FAA\r
-// #define Cs870MemoryTestPEIMGuidH 0xE89E95C6180342f0\r
-// Return the defined value as two 32-bit values, and whether it's a high\r
-// or low guid.\r
-//\r
-static\r
-BOOLEAN\r
-IsIA64GuidLine (\r
- INT8 *Line,\r
- UINT32 *GuidHigh,\r
- UINT32 *GuidLow,\r
- BOOLEAN *FoundLow,\r
- INT8 *SymName\r
- )\r
-{\r
- INT8 *Cptr;\r
- INT8 CSave;\r
- INT8 *CSavePtr;\r
- INT8 *SymStart;\r
- UINT32 Len;\r
-\r
- Cptr = Line;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // look for #define xxxGUID[L|H] 0xHexValue\r
- //\r
- if (*Cptr == '#') {\r
- Cptr++;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- //\r
- // Look for "define"\r
- //\r
- if (!strncmp (Cptr, "define", 6)) {\r
- Cptr += 6;\r
- //\r
- // Better be whitespace\r
- //\r
- Len = SkipWhiteSpace (Cptr);\r
- if (Len) {\r
- Cptr += Len;\r
- //\r
- // See if it's a valid symbol name\r
- //\r
- Len = ValidSymbolName (Cptr);\r
- if (Len) {\r
- //\r
- // Save the start so we can copy it to their string if later checks are ok\r
- //\r
- SymStart = Cptr;\r
- //\r
- // It is a valid symbol name, look for the string GuidL or GuidH\r
- //\r
- CSavePtr = Cptr + Len;\r
- CSave = *CSavePtr;\r
- *CSavePtr = 0;\r
- while (*Cptr) {\r
- if (strncmp (Cptr, "GuidL", 5) == 0) {\r
- *FoundLow = 1;\r
- break;\r
- } else if (strncmp (Cptr, "GuidH", 5) == 0) {\r
- *FoundLow = 0;\r
- break;\r
- }\r
-\r
- Cptr++;\r
- }\r
- //\r
- // If we didn't run out of string, then we found the GUID string.\r
- // Restore the null character we inserted above and continue.\r
- // Now look for 0x.......\r
- //\r
- if (*Cptr) {\r
- //\r
- // Return symbol name less the "L" or "H"\r
- //\r
- strcpy (SymName, SymStart);\r
- SymName[strlen (SymName) - 1] = 0;\r
- Cptr = CSavePtr;\r
- *CSavePtr = CSave;\r
- Cptr += SkipWhiteSpace (Cptr);\r
- if ((*Cptr == '0') && (*(Cptr + 1) == 'x')) {\r
- //\r
- // skip over "0x"\r
- //\r
- Cptr += 2;\r
- //\r
- // 0x0123456789ABCDEF -- null terminate after 8 characters,\r
- // scan, replace the character and scan at that point.\r
- //\r
- CSave = *(Cptr + 8);\r
- *(Cptr + 8) = 0;\r
- if (sscanf (Cptr, "%X", GuidHigh) == 1) {\r
- *(Cptr + 8) = CSave;\r
- if (sscanf (Cptr + 8, "%X", GuidLow) == 1) {\r
- return TRUE;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- return FALSE;\r
-}\r
-//\r
-// Look at the characters in the string and determine if it's a valid\r
-// symbol name. Basically [a-zA-Z_][a-zA-Z_0-9]*\r
-//\r
-static\r
-UINT32\r
-ValidSymbolName (\r
- INT8 *Name\r
- )\r
-{\r
- int Len;\r
-\r
- Len = 0;\r
-\r
- //\r
- // Test first character\r
- //\r
- if (((*Name >= 'a') && (*Name <= 'z')) || ((*Name >= 'A') && (*Name <= 'Z')) || (*Name == '_')) {\r
- Name++;\r
- Len = 1;\r
- while (*Name) {\r
- if (((*Name >= 'a') && (*Name <= 'z')) ||\r
- ((*Name >= 'A') && (*Name <= 'Z')) ||\r
- ((*Name >= '0') && (*Name <= '9')) ||\r
- (*Name == '_')\r
- ) {\r
- Name++;\r
- Len++;\r
- } else {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- return Len;\r
-}\r
-\r
-static\r
-UINT32\r
-SkipWhiteSpace (\r
- INT8 *Str\r
- )\r
-{\r
- UINT32 Len;\r
- Len = 0;\r
- while (isspace (*Str) && *Str) {\r
- Len++;\r
- Str++;\r
- }\r
-\r
- return Len;\r
-}\r
-//\r
-// found FFS_FILEGUID=35b898ca-b6a9-49ce-8c72-904735cc49b7\r
-//\r
-static\r
-STATUS\r
-AddPkgGuid (\r
- INT8 *FileName,\r
- UINT32 *Data,\r
- UINT64 *Data64\r
- )\r
-{\r
- GUID_RECORD *NewRec;\r
- int Index;\r
-\r
- //\r
- // Sanity check the data\r
- //\r
- if ((Data[1] | Data[2] | Data[3]) & 0xFFFF0000) {\r
- Error (NULL, 0, 0, "out of range value for GUID data word(s) [1] - [3]", NULL);\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // More checks for Data64?\r
- // Allocate memory for a new one guid structure\r
- //\r
- NewRec = malloc (sizeof (GUID_RECORD));\r
- if (NewRec == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) NewRec, 0, sizeof (GUID_RECORD));\r
- NewRec->FileName = malloc (strlen (FileName) + 1);\r
- if (NewRec->FileName == NULL) {\r
- free (NewRec);\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- strcpy (NewRec->FileName, FileName);\r
- NewRec->Guid.Data1 = Data[0];\r
- NewRec->Guid.Data2 = (UINT16) Data[1];\r
- NewRec->Guid.Data3 = (UINT16) Data[2];\r
- NewRec->Guid.Data4[0] = (UINT8) Data[3];\r
- NewRec->Guid.Data4[1] = (UINT8) (Data[3] >> 8);\r
- for (Index = 2; Index < 8; Index++) {\r
- NewRec->Guid.Data4[Index] = (UINT8) *Data64;\r
- *Data64 >>= 8;\r
- }\r
- //\r
- // Add it to the list\r
- //\r
- NewRec->Next = gGuidList;\r
- gGuidList = NewRec;\r
-\r
- //\r
- // Report it\r
- // ReportGuid (FileName, NewRec);\r
- //\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// Add a guid consisting of 11 fields to our list of guids\r
-//\r
-static\r
-STATUS\r
-AddGuid11 (\r
- INT8 *FileName,\r
- UINT32 *Data,\r
- INT8 *SymName\r
- )\r
-{\r
- GUID_RECORD *NewRec;\r
- int Index;\r
-\r
- //\r
- // Sanity check the data\r
- //\r
- if (!CheckGuidData (Data, 11)) {\r
- return STATUS_ERROR;\r
- }\r
- //\r
- // Allocate memory for a new one guid structure\r
- //\r
- NewRec = malloc (sizeof (GUID_RECORD));\r
- if (NewRec == NULL) {\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- memset ((char *) NewRec, 0, sizeof (GUID_RECORD));\r
- NewRec->FileName = malloc (strlen (FileName) + 1);\r
- if (NewRec->FileName == NULL) {\r
- free (NewRec);\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
-\r
- strcpy (NewRec->FileName, FileName);\r
- if (SymName != NULL) {\r
- NewRec->SymName = malloc (strlen (SymName) + 1);\r
- if (NewRec->SymName == NULL) {\r
- free (NewRec);\r
- Error (NULL, 0, 0, "memory allocation failure", NULL);\r
- return STATUS_ERROR;\r
- }\r
- }\r
-\r
- strcpy (NewRec->SymName, SymName);\r
-\r
- NewRec->Guid.Data1 = Data[0];\r
- NewRec->Guid.Data2 = (UINT16) Data[1];\r
- NewRec->Guid.Data3 = (UINT16) Data[2];\r
- for (Index = 0; Index < 8; Index++) {\r
- NewRec->Guid.Data4[Index] = (UINT8) Data[3 + Index];\r
- }\r
- //\r
- // Add it to the list\r
- //\r
- NewRec->Next = gGuidList;\r
- gGuidList = NewRec;\r
-\r
- //\r
- // Report it\r
- // ReportGuid (FileName, NewRec);\r
- //\r
- return STATUS_SUCCESS;\r
-}\r
-//\r
-// For debug purposes, print each guid found\r
-//\r
-// static\r
-// VOID\r
-// ReportGuid (\r
-// INT8 *FileName,\r
-// GUID_RECORD *NewGuid\r
-// )\r
-// {\r
-// //fprintf (stdout, "%s: 0x%08X\n", FileName, NewGuid->Guid.Data1);\r
-// }\r
-//\r
-// Free up memory we allocated to keep track of guids defined.\r
-//\r
-static\r
-VOID\r
-FreeGuids (\r
- VOID\r
- )\r
-{\r
- GUID_RECORD *NextRec;\r
- while (gGuidList != NULL) {\r
- NextRec = gGuidList->Next;\r
- if (gGuidList->FileName != NULL) {\r
- free (gGuidList->FileName);\r
- }\r
-\r
- if (gGuidList->SymName != NULL) {\r
- free (gGuidList->SymName);\r
- }\r
-\r
- free (gGuidList);\r
- gGuidList = NextRec;\r
- }\r
-}\r
-\r
-static\r
-VOID\r
-FreeSigs (\r
- VOID\r
- )\r
-{\r
- SIGNATURE_RECORD *NextRec;\r
- while (gSignatureList != NULL) {\r
- NextRec = gSignatureList->Next;\r
- if (gSignatureList->FileName != NULL) {\r
- free (gSignatureList->FileName);\r
- }\r
-\r
- free (gSignatureList);\r
- gSignatureList = NextRec;\r
- }\r
-}\r
-//\r
-// Scan through all guids defined and compare each for duplicates.\r
-//\r
-static\r
-STATUS\r
-CheckDuplicates (\r
- VOID\r
- )\r
-{\r
- GUID_RECORD *CurrentFile;\r
-\r
- GUID_RECORD *TempFile;\r
- SIGNATURE_RECORD *CurrentSig;\r
- SIGNATURE_RECORD *TempSig;\r
- STATUS Status;\r
- int Index;\r
- int DupCount;\r
- int Len;\r
- BOOLEAN Same;\r
- UINT32 GuidSum;\r
- INT8 *SymName;\r
-\r
- Status = STATUS_SUCCESS;\r
-\r
- //\r
- // If we're checking guids.....\r
- //\r
- if (gOptions.CheckGuids) {\r
- //\r
- // If -p option, print all guids found\r
- //\r
- if (gOptions.PrintFound) {\r
- CurrentFile = gGuidList;\r
- while (CurrentFile != NULL) {\r
- fprintf (\r
- stdout,\r
- "GUID: 0x%08X 0x%04X 0x%04X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X %s\n",\r
- (UINT32) CurrentFile->Guid.Data1,\r
- (UINT32) CurrentFile->Guid.Data2,\r
- (UINT32) CurrentFile->Guid.Data3,\r
- (UINT32) CurrentFile->Guid.Data4[0],\r
- (UINT32) CurrentFile->Guid.Data4[1],\r
- (UINT32) CurrentFile->Guid.Data4[2],\r
- (UINT32) CurrentFile->Guid.Data4[3],\r
- (UINT32) CurrentFile->Guid.Data4[4],\r
- (UINT32) CurrentFile->Guid.Data4[5],\r
- (UINT32) CurrentFile->Guid.Data4[6],\r
- (UINT32) CurrentFile->Guid.Data4[7],\r
- CurrentFile->FileName\r
- );\r
- CurrentFile = CurrentFile->Next;\r
- }\r
- }\r
-\r
- if (gOptions.GuidXReference) {\r
- CurrentFile = gGuidList;\r
- while (CurrentFile != NULL) {\r
- //\r
- // If no symbol name, print "unknown"\r
- //\r
- SymName = CurrentFile->SymName;\r
- if (SymName == NULL) {\r
- SymName = "unknown";\r
- }\r
-\r
- fprintf (\r
- stdout,\r
- "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X %s\n",\r
- (UINT32) CurrentFile->Guid.Data1,\r
- (UINT32) CurrentFile->Guid.Data2,\r
- (UINT32) CurrentFile->Guid.Data3,\r
- (UINT32) CurrentFile->Guid.Data4[0],\r
- (UINT32) CurrentFile->Guid.Data4[1],\r
- (UINT32) CurrentFile->Guid.Data4[2],\r
- (UINT32) CurrentFile->Guid.Data4[3],\r
- (UINT32) CurrentFile->Guid.Data4[4],\r
- (UINT32) CurrentFile->Guid.Data4[5],\r
- (UINT32) CurrentFile->Guid.Data4[6],\r
- (UINT32) CurrentFile->Guid.Data4[7],\r
- SymName\r
- );\r
- CurrentFile = CurrentFile->Next;\r
- }\r
- }\r
- //\r
- // Now go through all guids and report duplicates.\r
- //\r
- CurrentFile = gGuidList;\r
- while (CurrentFile != NULL) {\r
- DupCount = 0;\r
- TempFile = CurrentFile->Next;\r
- while (TempFile) {\r
- //\r
- // Compare the guids\r
- //\r
- if ((CurrentFile->Guid.Data1 == TempFile->Guid.Data1) &&\r
- (CurrentFile->Guid.Data2 == TempFile->Guid.Data2) &&\r
- (CurrentFile->Guid.Data3 == TempFile->Guid.Data3)\r
- ) {\r
- //\r
- // OR in all the guid bytes so we can ignore NULL-guid definitions.\r
- //\r
- GuidSum = CurrentFile->Guid.Data1 | CurrentFile->Guid.Data2 | CurrentFile->Guid.Data3;\r
- Same = TRUE;\r
- for (Index = 0; Index < 8; Index++) {\r
- GuidSum |= CurrentFile->Guid.Data4[Index];\r
- if (CurrentFile->Guid.Data4[Index] != TempFile->Guid.Data4[Index]) {\r
- Same = FALSE;\r
- break;\r
- }\r
- }\r
- //\r
- // If they're the same, and the guid was non-zero, print a message.\r
- //\r
- if (Same && GuidSum) {\r
- if (DupCount == 0) {\r
- Error (NULL, 0, 0, "duplicate GUIDS found", NULL);\r
- fprintf (stdout, " FILE1: %s\n", CurrentFile->FileName);\r
- }\r
-\r
- DupCount++;\r
- fprintf (stdout, " FILE%d: %s\n", DupCount + 1, TempFile->FileName);\r
- //\r
- // Flag it as reported so we don't report it again if there's three or more\r
- //\r
- TempFile->Reported = TRUE;\r
- }\r
- }\r
- //\r
- // Next one\r
- //\r
- TempFile = TempFile->Next;\r
- }\r
- //\r
- // Print the guid if we found duplicates\r
- //\r
- if (DupCount) {\r
- fprintf (\r
- stdout,\r
- " GUID: 0x%08X 0x%04X 0x%04X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",\r
- (UINT32) CurrentFile->Guid.Data1,\r
- (UINT32) CurrentFile->Guid.Data2,\r
- (UINT32) CurrentFile->Guid.Data3,\r
- (UINT32) CurrentFile->Guid.Data4[0],\r
- (UINT32) CurrentFile->Guid.Data4[1],\r
- (UINT32) CurrentFile->Guid.Data4[2],\r
- (UINT32) CurrentFile->Guid.Data4[3],\r
- (UINT32) CurrentFile->Guid.Data4[4],\r
- (UINT32) CurrentFile->Guid.Data4[5],\r
- (UINT32) CurrentFile->Guid.Data4[6],\r
- (UINT32) CurrentFile->Guid.Data4[7]\r
- );\r
- //\r
- // return STATUS_ERROR;\r
- //\r
- }\r
- //\r
- // Find the next one that hasn't been reported\r
- //\r
- do {\r
- CurrentFile = CurrentFile->Next;\r
- } while ((CurrentFile != NULL) && (CurrentFile->Reported));\r
- }\r
- }\r
-\r
- if (gOptions.CheckSignatures) {\r
- //\r
- // Print ones found if specified\r
- //\r
- if (gOptions.PrintFound) {\r
- CurrentSig = gSignatureList;\r
- while (CurrentSig != NULL) {\r
- Len = CurrentSig->Signature.DataLen;\r
- for (Index = 0; Index < Len; Index++) {\r
- fprintf (stdout, "%c", CurrentSig->Signature.Data[Index]);\r
- }\r
-\r
- fprintf (stdout, " %s\n", CurrentSig->FileName);\r
- CurrentSig = CurrentSig->Next;\r
- }\r
- }\r
-\r
- CurrentSig = gSignatureList;\r
- while (CurrentSig != NULL) {\r
- DupCount = 0;\r
- TempSig = CurrentSig->Next;\r
- Len = CurrentSig->Signature.DataLen;\r
- while (TempSig) {\r
- //\r
- // Check for same length, then do string compare\r
- //\r
- if (Len == TempSig->Signature.DataLen) {\r
- if (strncmp (CurrentSig->Signature.Data, TempSig->Signature.Data, Len) == 0) {\r
- //\r
- // Print header message if first failure for this sig\r
- //\r
- if (DupCount == 0) {\r
- Error (NULL, 0, 0, "duplicate signatures found", NULL);\r
- fprintf (stdout, " FILE1: %s\n", CurrentSig->FileName);\r
- }\r
-\r
- DupCount++;\r
- fprintf (stdout, " FILE%d: %s\n", DupCount + 1, TempSig->FileName);\r
- TempSig->Reported = TRUE;\r
- }\r
- }\r
-\r
- TempSig = TempSig->Next;\r
- }\r
-\r
- if (DupCount) {\r
- fprintf (stdout, " SIG: ");\r
- for (Index = 0; Index < Len; Index++) {\r
- fprintf (stdout, "%c", CurrentSig->Signature.Data[Index]);\r
- }\r
-\r
- fprintf (stdout, "\n");\r
- }\r
- //\r
- // On to the next one that hasn't been reported\r
- //\r
- do {\r
- CurrentSig = CurrentSig->Next;\r
- } while ((CurrentSig != NULL) && (CurrentSig->Reported));\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-static\r
-VOID\r
-FreeOptions (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Free up any memory we allocated when processing command-line options.\r
-\r
-Arguments:\r
- None.\r
-\r
-Returns:\r
- NA\r
-\r
-Notes:\r
- We don't free up the ->Str fields because we did not allocate them.\r
- Instead, we just set the pointer to point to the actual parameter\r
- from the command line.\r
-\r
---*/\r
-{\r
- STRING_LIST *Ptr;\r
- while (gOptions.ExcludeDirs != NULL) {\r
- Ptr = gOptions.ExcludeDirs->Next;\r
- //\r
- // free (gOptions.ExcludeDirs->Str);\r
- //\r
- free (gOptions.ExcludeDirs);\r
- gOptions.ExcludeDirs = Ptr;\r
- }\r
-\r
- while (gOptions.ExcludeSubDirs != NULL) {\r
- Ptr = gOptions.ExcludeSubDirs->Next;\r
- //\r
- // free (gOptions.ExcludeSubDirs->Str);\r
- //\r
- free (gOptions.ExcludeSubDirs);\r
- gOptions.ExcludeSubDirs = Ptr;\r
- }\r
-\r
- while (gOptions.ExcludeExtensions != NULL) {\r
- Ptr = gOptions.ExcludeExtensions->Next;\r
- //\r
- // free (gOptions.ExcludeExtensions->Str);\r
- //\r
- free (gOptions.ExcludeExtensions);\r
- gOptions.ExcludeExtensions = Ptr;\r
- }\r
-\r
- while (gOptions.ExcludeFiles != NULL) {\r
- Ptr = gOptions.ExcludeFiles->Next;\r
- //\r
- // free (gOptions.ExcludeFiles->Str);\r
- //\r
- free (gOptions.ExcludeFiles);\r
- gOptions.ExcludeFiles = Ptr;\r
- }\r
-}\r
-//\r
-// Given an array of 32-bit data, validate the data for the given number of\r
-// guid data. For example, it might have been scanned as 16 bytes of data, or\r
-// 11 fields of data.\r
-//\r
-static\r
-BOOLEAN\r
-CheckGuidData (\r
- UINT32 *Data,\r
- UINT32 DataCount\r
- )\r
-{\r
- UINT32 Index;\r
-\r
- if (DataCount == 16) {\r
- for (Index = 0; Index < 16; Index++) {\r
- if (Data[Index] &~0xFF) {\r
- return FALSE;\r
- }\r
- }\r
-\r
- return TRUE;\r
- } else if (DataCount == 11) {\r
- //\r
- // Data[0] never out of range (32-bit)\r
- //\r
- if ((Data[1] | Data[2]) &~0xFFFF) {\r
- //\r
- // Error ("Out of range value for GUID data word(s) [1] and/or [2]");\r
- //\r
- return FALSE;\r
- }\r
-\r
- for (Index = 0; Index < 8; Index++) {\r
- if (Data[Index + 3] &~0xFF) {\r
- //\r
- // Error ("Out of range value for GUID data byte(s) [4] - [11]");\r
- //\r
- return FALSE;\r
- }\r
- }\r
-\r
- return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r