int main ( int Argc, char *Argv[] ) /*++ Routine Description: Call the routine to parse the command-line options, then process the file. Arguments: Standard C main() argc and argv. Returns: 0 if successful nonzero otherwise --*/ { STATUS Status; // // Set the utility name for error reporting purposes // SetUtilityName (UTILITY_NAME); // // Process the command-line arguments // Status = ProcessArgs (Argc, Argv); if (Status != STATUS_SUCCESS) { return Status; } // // Switch based on args // if (mGlobals.Mode & MODE_CREATE_HII_RESOURCE_FILE) { CreateResourceScript (mGlobals.ResourceFileName, &mGlobals.Guid, mGlobals.PackageFile); } if (mGlobals.Mode & MODE_CREATE_HII_PACKAGE_LIST) { CreatePackageList (mGlobals.PackageListFileName, &mGlobals.Guid, mGlobals.PackageFile); } FreeGlobals (); return GetUtilityStatus (); }
int main ( int argc, char **argv ) { VOID *BaseMemory; INTN result; CHAR8 *OutputFile = NULL; CHAR8 *InputFile = NULL; EFI_STATUS Status; UINT64 TempValue; SetUtilityName("GenPage"); if (argc == 1) { Usage(); return STATUS_ERROR; } argc --; argv ++; if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) { Usage(); return 0; } if (stricmp (argv[0], "--version") == 0) { Version(); return 0; } while (argc > 0) { if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) { if (argv[1] == NULL || argv[1][0] == '-') { Error (NULL, 0, 1003, "Invalid option value", "Output file is missing for -o option"); return STATUS_ERROR; } OutputFile = argv[1]; argc -= 2; argv += 2; continue; } if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--baseaddr") == 0)) { if (argv[1] == NULL || argv[1][0] == '-') { Error (NULL, 0, 1003, "Invalid option value", "Base address is missing for -b option"); return STATUS_ERROR; } Status = AsciiStringToUint64 (argv[1], FALSE, &TempValue); if (EFI_ERROR (Status)) { Error (NULL, 0, 1003, "Invalid option value", "Base address is not valid intergrator"); return STATUS_ERROR; } gPageTableBaseAddress = (UINT32) TempValue; argc -= 2; argv += 2; continue; } if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--offset") == 0)) { if (argv[1] == NULL || argv[1][0] == '-') { Error (NULL, 0, 1003, "Invalid option value", "Offset is missing for -f option"); return STATUS_ERROR; } Status = AsciiStringToUint64 (argv[1], FALSE, &TempValue); if (EFI_ERROR (Status)) { Error (NULL, 0, 1003, "Invalid option value", "Offset is not valid intergrator"); return STATUS_ERROR; } gPageTableOffsetInFile = (UINT32) TempValue; argc -= 2; argv += 2; continue; } if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) { argc --; argv ++; continue; } if ((stricmp (argv[0], "-v") ==0) || (stricmp (argv[0], "--verbose") == 0)) { argc --; argv ++; continue; } if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) { if (argv[1] == NULL || argv[1][0] == '-') { Error (NULL, 0, 1003, "Invalid option value", "Debug Level is not specified."); return STATUS_ERROR; } Status = AsciiStringToUint64 (argv[1], FALSE, &TempValue); if (EFI_ERROR (Status)) { Error (NULL, 0, 1003, "Invalid option value", "Debug Level is not valid intergrator."); return STATUS_ERROR; } if (TempValue > 9) { Error (NULL, 0, 1003, "Invalid option value", "Debug Level range is 0-9, currnt input level is %d", (int) TempValue); return STATUS_ERROR; } argc -= 2; argv += 2; continue; } if (argv[0][0] == '-') { Error (NULL, 0, 1000, "Unknown option", argv[0]); return STATUS_ERROR; } // // Don't recognize the parameter. // InputFile = argv[0]; argc--; argv++; } if (InputFile == NULL) { Error (NULL, 0, 1003, "Invalid option value", "Input file is not specified"); return STATUS_ERROR; } // // Create X64 page table // BaseMemory = CreateIdentityMappingPageTables (); // // Add page table to binary file // result = GenBinPage (BaseMemory, InputFile, OutputFile); if (result < 0) { return STATUS_ERROR; } return 0; }
int main ( int argc, char *argv[] ) /*++ Routine Description: Arguments: Returns: --*/ { UINT64 i; UINT64 filesize; FILE *fpIn, *fpOut; EFILDR_HEADER EfiLdrHeader; EFILDR_IMAGE EfiLdrImage[MAX_PE_IMAGES]; CHAR8* OutputFileName = NULL; CHAR8* InputFileNames[MAX_PE_IMAGES + 1]; UINT8 InputFileCount = 0; UINT64 DebugLevel = 0; UINT64 VerboseLevel = 0; EFI_STATUS Status = EFI_SUCCESS; SetUtilityName (UTILITY_NAME); if (argc == 1) { Usage(); return STATUS_ERROR; } argc --; argv ++; if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) { Usage(); return STATUS_SUCCESS; } if (stricmp (argv[0], "--version") == 0) { Version(); return STATUS_SUCCESS; } while (argc > 0) { if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) { OutputFileName = argv[1]; if (OutputFileName == NULL) { Error (NULL, 0, 1003, "Invalid option value", "Output file can't be null"); return STATUS_ERROR; } argc -= 2; argv += 2; continue; } if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) { argc --; argv ++; continue; } if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) { VerboseLevel = 1; if (strlen(argv[0]) > 2) { Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel); if (EFI_ERROR (Status)) { Error (NULL, 0, 1003, "Invalid option value", argv[0]); return STATUS_ERROR; } } argc --; argv ++; continue; } if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) { Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel); if (EFI_ERROR (Status)) { Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]); return STATUS_ERROR; } argc -= 2; argv += 2; continue; } // // Don't recognize the parameter, should be regarded as the input file name. // InputFileNames[InputFileCount] = argv[0]; InputFileCount++; argc--; argv++; } if (InputFileCount == 0) { Error (NULL, 0, 1001, "Missing option", "No input file"); return STATUS_ERROR; } // // Open output file for write // if (OutputFileName == NULL) { Error (NULL, 0, 1001, "Missing option", "No output file"); return STATUS_ERROR; } fpOut = fopen (LongFilePath (OutputFileName), "w+b"); if (!fpOut) { Error (NULL, 0, 0001, "Could not open output file", OutputFileName); return STATUS_ERROR; } memset (&EfiLdrHeader, 0, sizeof (EfiLdrHeader)); memset (&EfiLdrImage, 0, sizeof (EFILDR_IMAGE) * (InputFileCount)); memcpy (&EfiLdrHeader.Signature, "EFIL", 4); EfiLdrHeader.FileLength = sizeof(EFILDR_HEADER) + sizeof(EFILDR_IMAGE)*(InputFileCount); // // Skip the file header first // fseek (fpOut, EfiLdrHeader.FileLength, SEEK_SET); // // copy all the input files to the output file // for(i=0;i<InputFileCount;i++) { // // Copy the content of PeImage file to output file // fpIn = fopen (LongFilePath (InputFileNames[i]), "rb"); if (!fpIn) { Error (NULL, 0, 0001, "Could not open input file", InputFileNames[i]); fclose (fpOut); return STATUS_ERROR; } filesize = FCopyFile (fpIn, fpOut); fclose(fpIn); // // And in the same time update the EfiLdrHeader and EfiLdrImage array // EfiLdrImage[i].Offset = EfiLdrHeader.FileLength; EfiLdrImage[i].Length = (UINT32) filesize; strncpy ((CHAR8*) EfiLdrImage[i].FileName, InputFileNames[i], sizeof (EfiLdrImage[i].FileName) - 1); EfiLdrHeader.FileLength += (UINT32) filesize; EfiLdrHeader.NumberOfImages++; } // // Write the image header to the output file finally // fseek (fpOut, 0, SEEK_SET); fwrite (&EfiLdrHeader, sizeof(EFILDR_HEADER) , 1, fpOut); fwrite (&EfiLdrImage , sizeof(EFILDR_IMAGE)*(InputFileCount), 1, fpOut); fclose (fpOut); printf ("Created %s\n", OutputFileName); return 0; }
int main ( int Argc, char *Argv[] ) /*++ Routine Description: Arguments: Argc - standard C main() argument count Argv - standard C main() argument list Returns: 0 success non-zero otherwise --*/ // GC_TODO: ] - add argument and description to function comment { INT8 *Ext; UINT32 Status; SetUtilityName (UTILITY_NAME); // // Parse the command line arguments // if (ParseCommandLine (Argc, Argv)) { return STATUS_ERROR; } // // If dumping an image, then do that and quit // if (mOptions.Dump) { DumpImage (mOptions.InFileName); goto Finish; } // // Determine the output filename. Either what they specified on // the command line, or the first input filename with a different extension. // if (!mOptions.OutFileName[0]) { strcpy (mOptions.OutFileName, mOptions.InFileName); // // Find the last . on the line and replace the filename extension with // the default // for (Ext = mOptions.OutFileName + strlen (mOptions.OutFileName) - 1; (Ext >= mOptions.OutFileName) && (*Ext != '.') && (*Ext != '\\'); Ext-- ) ; // // If dot here, then insert extension here, otherwise append // if (*Ext != '.') { Ext = mOptions.OutFileName + strlen (mOptions.OutFileName); } strcpy (Ext, DEFAULT_OUTPUT_EXTENSION); } // // Make sure we don't have the same filename for input and output files // if (_stricmp (mOptions.OutFileName, mOptions.InFileName) == 0) { Error (NULL, 0, 0, mOptions.OutFileName, "input and output file names must be different"); goto Finish; } // // Process the file // ProcessFile (mOptions.InFileName, mOptions.OutFileName); Finish: Status = GetUtilityStatus (); return Status; }
VOID CVfrCompiler::OptionInitialization ( IN INT32 Argc, IN CHAR8 **Argv ) { INT32 Index; EFI_STATUS Status; Status = EFI_SUCCESS; SetUtilityName ((CHAR8*) PROGRAM_NAME); mOptions.VfrFileName[0] = '\0'; mOptions.RecordListFile[0] = '\0'; mOptions.CreateRecordListFile = FALSE; mOptions.CreateIfrPkgFile = FALSE; mOptions.PkgOutputFileName[0] = '\0'; mOptions.COutputFileName[0] = '\0'; mOptions.OutputDirectory[0] = '\0'; mOptions.PreprocessorOutputFileName[0] = '\0'; mOptions.VfrBaseFileName[0] = '\0'; mOptions.IncludePaths = NULL; mOptions.SkipCPreprocessor = TRUE; mOptions.CPreprocessorOptions = NULL; mOptions.CompatibleMode = FALSE; mOptions.HasOverrideClassGuid = FALSE; mOptions.WarningAsError = FALSE; memset (&mOptions.OverrideClassGuid, 0, sizeof (EFI_GUID)); if (Argc == 1) { Usage (); SET_RUN_STATUS (STATUS_DEAD); return; } for (Index = 1; (Index < Argc) && (Argv[Index][0] == '-'); Index++) { if ((stricmp(Argv[Index], "-h") == 0) || (stricmp(Argv[Index], "--help") == 0)) { Usage (); SET_RUN_STATUS (STATUS_DEAD); return; } else if (stricmp(Argv[Index], "-l") == 0) { mOptions.CreateRecordListFile = TRUE; gCIfrRecordInfoDB.TurnOn (); } else if (stricmp(Argv[Index], "-i") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-i missing path argument"); goto Fail; } AppendIncludePath(Argv[Index]); } else if (stricmp(Argv[Index], "-o") == 0 || stricmp(Argv[Index], "--output-directory") == 0 || stricmp(Argv[Index], "-od") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-o missing output directory name"); goto Fail; } strcpy (mOptions.OutputDirectory, Argv[Index]); CHAR8 lastChar = mOptions.OutputDirectory[strlen(mOptions.OutputDirectory) - 1]; if ((lastChar != '/') && (lastChar != '\\')) { if (strchr(mOptions.OutputDirectory, '/') != NULL) { strcat (mOptions.OutputDirectory, "/"); } else { strcat (mOptions.OutputDirectory, "\\"); } } DebugMsg (NULL, 0, 9, (CHAR8 *) "Output Directory", mOptions.OutputDirectory); } else if (stricmp(Argv[Index], "-b") == 0 || stricmp(Argv[Index], "--create-ifr-package") == 0 || stricmp(Argv[Index], "-ibin") == 0) { mOptions.CreateIfrPkgFile = TRUE; } else if (stricmp(Argv[Index], "-n") == 0 || stricmp(Argv[Index], "--no-pre-processing") == 0 || stricmp(Argv[Index], "-nopp") == 0) { mOptions.SkipCPreprocessor = TRUE; } else if (stricmp(Argv[Index], "-f") == 0 || stricmp(Argv[Index], "--pre-processing-flag") == 0 || stricmp(Argv[Index], "-ppflag") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-od - missing C-preprocessor argument"); goto Fail; } AppendCPreprocessorOptions (Argv[Index]); } else if (stricmp(Argv[Index], "-c") == 0 || stricmp(Argv[Index], "--compatible-framework") == 0) { mOptions.CompatibleMode = TRUE; } else if (stricmp(Argv[Index], "-s") == 0|| stricmp(Argv[Index], "--string-db") == 0) { Index++; if ((Index >= Argc) || (Argv[Index][0] == '-')) { DebugError (NULL, 0, 1001, "Missing option", "-s missing input string file name"); goto Fail; } gCVfrStringDB.SetStringFileName(Argv[Index]); DebugMsg (NULL, 0, 9, (CHAR8 *) "Input string file path", Argv[Index]); } else if ((stricmp (Argv[Index], "-g") == 0) || (stricmp (Argv[Index], "--guid") == 0)) { Index++; Status = StringToGuid (Argv[Index], &mOptions.OverrideClassGuid); if (EFI_ERROR (Status)) { DebugError (NULL, 0, 1000, "Invalid format:", "%s", Argv[Index]); goto Fail; } mOptions.HasOverrideClassGuid = TRUE; } else if (stricmp(Argv[Index], "-w") == 0 || stricmp(Argv[Index], "--warning-as-error") == 0) { mOptions.WarningAsError = TRUE; } else { DebugError (NULL, 0, 1000, "Unknown option", "unrecognized option %s", Argv[Index]); goto Fail; } } if (Index != Argc - 1) { DebugError (NULL, 0, 1001, "Missing option", "VFR file name is not specified."); goto Fail; } else { strcpy (mOptions.VfrFileName, Argv[Index]); } if (SetBaseFileName() != 0) { goto Fail; } if (SetPkgOutputFileName () != 0) { goto Fail; } if (SetCOutputFileName() != 0) { goto Fail; } if (SetPreprocessorOutputFileName () != 0) { goto Fail; } if (SetRecordListFileName () != 0) { goto Fail; } return; Fail: SET_RUN_STATUS (STATUS_DEAD); mOptions.VfrFileName[0] = '\0'; mOptions.RecordListFile[0] = '\0'; mOptions.CreateRecordListFile = FALSE; mOptions.CreateIfrPkgFile = FALSE; mOptions.PkgOutputFileName[0] = '\0'; mOptions.COutputFileName[0] = '\0'; mOptions.OutputDirectory[0] = '\0'; mOptions.PreprocessorOutputFileName[0] = '\0'; mOptions.VfrBaseFileName[0] = '\0'; if (mOptions.IncludePaths != NULL) { delete mOptions.IncludePaths; mOptions.IncludePaths = NULL; } if (mOptions.CPreprocessorOptions != NULL) { delete mOptions.CPreprocessorOptions; mOptions.CPreprocessorOptions = NULL; } }
int main ( int Argc, char *Argv[] ) /*++ Routine Description: Call the routine to parse the command-line options, then process each file to build dependencies. Arguments: Argc - Standard C main() argc. Argv - Standard C main() argv. Returns: 0 if successful nonzero otherwise --*/ { STRING_LIST *File; STRING_LIST ProcessedFiles; STRING_LIST *TempList; STATUS Status; INT8 *Cptr; INT8 TargetFileName[MAX_PATH]; SetUtilityName (UTILITY_NAME); // // Process the command-line arguments // Status = ProcessArgs (Argc, Argv); if (Status != STATUS_SUCCESS) { return STATUS_ERROR; } // // Go through the list of source files and process each. // memset (&ProcessedFiles, 0, sizeof (STRING_LIST)); File = mGlobals.SourceFiles; while (File != NULL) { // // Clear out our list of processed files // TempList = ProcessedFiles.Next; while (ProcessedFiles.Next != NULL) { TempList = ProcessedFiles.Next->Next; free (ProcessedFiles.Next->Str); free (ProcessedFiles.Next); ProcessedFiles.Next = TempList; } // // Replace filename extension with ".obj" if they did not // specifically specify the target file // if (mGlobals.TargetFileName[0] == 0) { strcpy (TargetFileName, File->Str); // // Find the .extension // for (Cptr = TargetFileName + strlen (TargetFileName) - 1; (*Cptr != '\\') && (Cptr > TargetFileName) && (*Cptr != '.'); Cptr-- ) ; if (Cptr == TargetFileName) { Error (NULL, 0, 0, File->Str, "could not locate extension in filename"); goto Finish; } // // Tack on the ".obj" // strcpy (Cptr, ".obj"); } else { // // Copy the target filename they specified // strcpy (TargetFileName, mGlobals.TargetFileName); } if (mGlobals.IsCl) { Status = ProcessClOutput (TargetFileName, File->Str, &ProcessedFiles); } else { Status = ProcessFile (TargetFileName, File->Str, START_NEST_DEPTH, &ProcessedFiles, SearchCurrentDir); } if (Status != STATUS_SUCCESS) { goto Finish; } File = File->Next; } Finish: // // Free up memory // FreeLists (); // // Free up our processed files list // TempList = ProcessedFiles.Next; while (ProcessedFiles.Next != NULL) { TempList = ProcessedFiles.Next->Next; free (ProcessedFiles.Next->Str); free (ProcessedFiles.Next); ProcessedFiles.Next = TempList; } // // Close our temp output file // if ((mGlobals.OutFptr != stdout) && (mGlobals.OutFptr != NULL)) { fclose (mGlobals.OutFptr); } if (mGlobals.NeverFail) { return STATUS_SUCCESS; } if (mGlobals.OutFileName != NULL) { if (GetUtilityStatus () == STATUS_ERROR) { // // If any errors, then delete our temp output // Also try to delete target file to improve the incremental build // remove (mGlobals.TmpFileName); remove (TargetFileName); } else { // // Otherwise, rename temp file to output file // remove (mGlobals.OutFileName); rename (mGlobals.TmpFileName, mGlobals.OutFileName); } } return GetUtilityStatus (); }
VOID TestUtilityMessages ( VOID ) { CHAR8 *ArgStr = "ArgString"; int ArgInt; ArgInt = 0x12345678; // // Test without setting utility name // fprintf (stdout, "* Testing without setting utility name\n"); fprintf (stdout, "** Test debug message not printed\n"); DebugMsg (NULL, 0, 0x00000001, NULL, NULL); fprintf (stdout, "** Test warning with two strings and two args\n"); Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); fprintf (stdout, "** Test error with two strings and two args\n"); Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); fprintf (stdout, "** Test parser warning with nothing\n"); ParserWarning (0, NULL, NULL); fprintf (stdout, "** Test parser error with nothing\n"); ParserError (0, NULL, NULL); // // Test with utility name set now // fprintf (stdout, "** Testingin with utility name set\n"); SetUtilityName ("MyUtilityName"); // // Test debug prints // SetDebugMsgMask (2); fprintf (stdout, "** Test debug message with one string\n"); DebugMsg (NULL, 0, 0x00000002, "Text1", NULL); fprintf (stdout, "** Test debug message with one string\n"); DebugMsg (NULL, 0, 0x00000002, NULL, "Text2"); fprintf (stdout, "** Test debug message with two strings\n"); DebugMsg (NULL, 0, 0x00000002, "Text1", "Text2"); fprintf (stdout, "** Test debug message with two strings and two args\n"); DebugMsg (NULL, 0, 0x00000002, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); // // Test warning prints // fprintf (stdout, "** Test warning with no strings\n"); Warning (NULL, 0, 1234, NULL, NULL); fprintf (stdout, "** Test warning with one string\n"); Warning (NULL, 0, 1234, "Text1", NULL); fprintf (stdout, "** Test warning with one string\n"); Warning (NULL, 0, 1234, NULL, "Text2"); fprintf (stdout, "** Test warning with two strings and two args\n"); Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); // // Test error prints // fprintf (stdout, "** Test error with no strings\n"); Error (NULL, 0, 1234, NULL, NULL); fprintf (stdout, "** Test error with one string\n"); Error (NULL, 0, 1234, "Text1", NULL); fprintf (stdout, "** Test error with one string\n"); Error (NULL, 0, 1234, NULL, "Text2"); fprintf (stdout, "** Test error with two strings and two args\n"); Error (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); // // Test parser prints // fprintf (stdout, "** Test parser errors\n"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserError (1234, NULL, NULL); ParserSetPosition (__FILE__, __LINE__ + 1); ParserError (1234, "Text1", NULL); ParserSetPosition (__FILE__, __LINE__ + 1); ParserError (1234, NULL, "Text2"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserError (1234, "Text1", "Text2"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserError (1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); fprintf (stdout, "** Test parser warnings\n"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserWarning (4321, NULL, NULL); ParserSetPosition (__FILE__, __LINE__ + 1); ParserWarning (4321, "Text1", NULL); ParserSetPosition (__FILE__, __LINE__ + 1); ParserWarning (4321, NULL, "Text2"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserWarning (4321, "Text1", "Text2"); ParserSetPosition (__FILE__, __LINE__ + 1); ParserWarning (4321, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt); }
EFI_STATUS main ( IN INTN argc, IN CHAR8 **argv ) /*++ Routine Description: This utility uses GenFvImage.Lib to build a firmware volume image. Arguments: FvInfFileName The name of an FV image description file. Arguments come in pair in any order. -I FvInfFileName Returns: EFI_SUCCESS No error conditions detected. EFI_INVALID_PARAMETER One or more of the input parameters is invalid. EFI_OUT_OF_RESOURCES A resource required by the utility was unavailable. Most commonly this will be memory allocation or file creation. EFI_LOAD_ERROR GenFvImage.lib could not be loaded. EFI_ABORTED Error executing the GenFvImage lib. --*/ { EFI_STATUS Status; CHAR8 InfFileName[_MAX_PATH]; CHAR8 *InfFileImage; UINTN InfFileSize; UINT8 *FvImage; UINTN FvImageSize; UINT8 Index; CHAR8 FvFileNameBuffer[_MAX_PATH]; CHAR8 *FvFileName; FILE *FvFile; FILE *SymFile; CHAR8 SymFileNameBuffer[_MAX_PATH]; CHAR8 *SymFileName; UINT8 *SymImage; UINTN SymImageSize; CHAR8 *CurrentSymString; FvFileName = FvFileNameBuffer; SymFileName = SymFileNameBuffer; SetUtilityName (UTILITY_NAME); // // Display utility information // PrintUtilityInfo (); // // Verify the correct number of arguments // if (argc != MAX_ARGS) { Error (NULL, 0, 0, "invalid number of input parameters specified", NULL); PrintUsage (); return GetUtilityStatus (); } // // Initialize variables // strcpy (InfFileName, ""); // // Parse the command line arguments // for (Index = 1; Index < MAX_ARGS; Index += 2) { // // Make sure argument pair begin with - or / // if (argv[Index][0] != '-' && argv[Index][0] != '/') { Error (NULL, 0, 0, argv[Index], "argument pair must begin with \"-\" or \"/\""); PrintUsage (); return GetUtilityStatus (); } // // Make sure argument specifier is only one letter // if (argv[Index][2] != 0) { Error (NULL, 0, 0, argv[Index], "unrecognized argument"); PrintUsage (); return GetUtilityStatus (); } // // Determine argument to read // switch (argv[Index][1]) { case 'I': case 'i': if (strlen (InfFileName) == 0) { strcpy (InfFileName, argv[Index + 1]); } else { Error (NULL, 0, 0, argv[Index + 1], "FvInfFileName may only be specified once"); PrintUsage (); return GetUtilityStatus (); } break; default: Error (NULL, 0, 0, argv[Index], "unrecognized argument"); PrintUsage (); return GetUtilityStatus (); break; } } // // Read the INF file image // Status = GetFileImage (InfFileName, &InfFileImage, &InfFileSize); if (EFI_ERROR (Status)) { return STATUS_ERROR; } // // Call the GenFvImage lib // Status = GenerateFvImage ( InfFileImage, InfFileSize, &FvImage, &FvImageSize, &FvFileName, &SymImage, &SymImageSize, &SymFileName ); if (EFI_ERROR (Status)) { switch (Status) { case EFI_INVALID_PARAMETER: Error (NULL, 0, 0, "invalid parameter passed to GenFvImage Lib", NULL); return GetUtilityStatus (); break; case EFI_ABORTED: Error (NULL, 0, 0, "error detected while creating the file image", NULL); return GetUtilityStatus (); break; case EFI_OUT_OF_RESOURCES: Error (NULL, 0, 0, "GenFvImage Lib could not allocate required resources", NULL); return GetUtilityStatus (); break; case EFI_VOLUME_CORRUPTED: Error (NULL, 0, 0, "no base address was specified, but the FV.INF included a PEI or BSF file", NULL); return GetUtilityStatus (); break; case EFI_LOAD_ERROR: Error (NULL, 0, 0, "could not load FV image generation library", NULL); return GetUtilityStatus (); break; default: Error (NULL, 0, 0, "GenFvImage Lib returned unknown status", "status returned = 0x%X", Status); return GetUtilityStatus (); break; } } // // Write file // FvFile = fopen (FvFileName, "wb"); if (FvFile == NULL) { Error (NULL, 0, 0, FvFileName, "could not open output file"); free (FvImage); free (SymImage); return GetUtilityStatus (); } if (fwrite (FvImage, 1, FvImageSize, FvFile) != FvImageSize) { Error (NULL, 0, 0, FvFileName, "failed to write to output file"); free (FvImage); free (SymImage); fclose (FvFile); return GetUtilityStatus (); } fclose (FvFile); free (FvImage); // // Write symbol file // if (strcmp (SymFileName, "")) { SymFile = fopen (SymFileName, "wt"); if (SymFile == NULL) { Error (NULL, 0, 0, SymFileName, "could not open output symbol file"); free (SymImage); return GetUtilityStatus (); } fprintf (SymFile, "TEXTSYM format | V1.0\n"); CurrentSymString = SymImage; while (((UINTN) CurrentSymString - (UINTN) SymImage) < SymImageSize) { fprintf (SymFile, "%s", CurrentSymString); CurrentSymString = (CHAR8 *) (((UINTN) CurrentSymString) + strlen (CurrentSymString) + 1); } fclose (SymFile); } free (SymImage); return GetUtilityStatus (); }