put funtion prototype and variable definition in EfiRom.h file.
authorhtao <htao@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 27 Sep 2007 05:40:54 +0000 (05:40 +0000)
committerhtao <htao@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 27 Sep 2007 05:40:54 +0000 (05:40 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@768 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/EfiRom/EfiRom.c

index a2f504c..1fe65b7 100644 (file)
@@ -21,193 +21,8 @@ Abstract:
 \r
 --*/\r
 \r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-\r
-#include <Common/UefiBaseTypes.h>\r
-#include <IndustryStandard/PeImage.h> // for PE32 structure definitions\r
-\r
-#include <IndustryStandard/pci22.h>  // for option ROM header structures\r
-#include <IndustryStandard/pci30.h>\r
-\r
-#include "Compress.h"\r
-#include "CommonLib.h"\r
-\r
-//\r
-// Version of this utility\r
-//\r
-#define UTILITY_NAME "EfiRom"\r
-#define UTILITY_MAJOR_VERSION 0\r
-#define UTILITY_MINOR_VERSION 1\r
-\r
-//\r
-// Define some status return values\r
-//\r
-#define STATUS_SUCCESS  0\r
-#define STATUS_WARNING  1\r
-#define STATUS_ERROR    2\r
-\r
-//\r
-// Define the max length of a filename\r
-//\r
-#define MAX_PATH                  200\r
-\r
-#define DEFAULT_OUTPUT_EXTENSION  ".rom"\r
-\r
-//\r
-// Max size for an option ROM image\r
-//\r
-#define MAX_OPTION_ROM_SIZE (1024 * 1024 * 16)  // 16MB\r
-//\r
-// Values for the indicator field in the PCI data structure\r
-//\r
-#define INDICATOR_LAST  0x80  // last file in series of files\r
-//\r
-// Masks for the FILE_LIST.FileFlags field\r
-//\r
-#define FILE_FLAG_BINARY    0x01\r
-#define FILE_FLAG_EFI       0x02\r
-#define FILE_FLAG_COMPRESS  0x04\r
-\r
-//\r
-// Use this linked list structure to keep track of all the filenames\r
-// specified on the command line.\r
-//\r
-typedef struct _FILE_LIST {\r
-  struct _FILE_LIST *Next;\r
-  INT8              *FileName;\r
-  UINT32            FileFlags;\r
-  UINT32            ClassCode;\r
-  UINT16            CodeRevision;\r
-} FILE_LIST;\r
-\r
-//\r
-// Use this to track our command-line options\r
-//\r
-typedef struct {\r
-  INT8      OutFileName[MAX_PATH];\r
-  INT8      NoLast;\r
-  INT8      Verbose;\r
-  INT8      DumpOption;\r
-  INT8      Pci23;\r
-  UINT8     DevIdValid;\r
-  UINT8     VendIdValid;\r
-  UINT16    VendId;\r
-  UINT16    DevId;\r
-  FILE_LIST *FileList;\r
-} OPTIONS;\r
-\r
-//\r
-// Make a global structure to keep track of command-line options\r
-//\r
-static OPTIONS  mOptions;\r
-\r
-//\r
-// Use these to convert from machine type value to a named type\r
-//\r
-typedef struct {\r
-  UINT16  Value;\r
-  char    *Name;\r
-} STRING_LOOKUP;\r
-\r
-static STRING_LOOKUP  mMachineTypes[] = {\r
-  EFI_IMAGE_MACHINE_IA32,\r
-  "IA32",\r
-  EFI_IMAGE_MACHINE_IA64,\r
-  "IA64",\r
-  EFI_IMAGE_MACHINE_EBC,\r
-  "EBC",\r
-  0,\r
-  NULL\r
-};\r
-\r
-static STRING_LOOKUP  mSubsystemTypes[] = {\r
-  EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION,\r
-  "EFI application",\r
-  EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER,\r
-  "EFI boot service driver",\r
-  EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER,\r
-  "EFI runtime driver",\r
-  0,\r
-  NULL\r
-};\r
-\r
-static char* mCodeTypeStr[] = {\r
-  "PCAT Image",\r
-  "Open Firmware Image",\r
-  "HP PA RISC Image",\r
-  "EFI Image",\r
-  "Undefined"\r
-};\r
-\r
-//\r
-//  Function prototypes\r
-//\r
-static\r
-void\r
-Version (\r
-  VOID\r
-  );\r
-\r
-static\r
-void\r
-Usage (\r
-  VOID\r
-  );\r
-\r
-static\r
-int\r
-ParseCommandLine (\r
-  int       Argc,\r
-  char      *Argv[],\r
-  OPTIONS   *Options\r
-  );\r
+#include "EfiRom.h"\r
 \r
-static\r
-int\r
-CheckPE32File (\r
-  FILE      *Fptr,\r
-  UINT16    *MachineType,\r
-  UINT16    *SubSystem\r
-  );\r
-\r
-static\r
-int\r
-ProcessEfiFile (\r
-  FILE      *OutFptr,\r
-  FILE_LIST *InFile,\r
-  UINT16    VendId,\r
-  UINT16    DevId,\r
-  UINT32    *Size\r
-  );\r
-\r
-static\r
-int\r
-ProcessBinFile (\r
-  FILE      *OutFptr,\r
-  FILE_LIST *InFile,\r
-  UINT32    *Size\r
-  );\r
-\r
-static\r
-void\r
-DumpImage (\r
-  INT8 *InFileName\r
-  );\r
-\r
-char                  *\r
-GetMachineTypeStr (\r
-  UINT16    MachineType\r
-  );\r
-\r
-static\r
-char                  *\r
-GetSubsystemTypeStr (\r
-  UINT16  SubsystemType\r
-  );\r
-\r
-int\r
 main (\r
   int   Argc,\r
   char  *Argv[]\r
@@ -239,11 +54,24 @@ Returns:
   FILE_LIST *FList;\r
   UINT32    TotalSize;\r
   UINT32    Size;\r
+  CHAR8     *Ptr0;\r
+  FILE_LIST *OutFileList;\r
+\r
 \r
   SetUtilityName(UTILITY_NAME);\r
+\r
   Status  = STATUS_SUCCESS;\r
   FptrOut = NULL;\r
 \r
+  //\r
+  // Create a new out file structure\r
+  //\r
+  OutFileList = (FILE_LIST *) malloc (sizeof (FILE_LIST));\r
+  if (OutFileList == NULL) {\r
+    Error(stdout, 0, 4001, "Resource", "memory cannot be allocated ");\r
+    return STATUS_ERROR;\r
+  }  \r
+  memset ((char *) OutFileList, 0, sizeof (FILE_LIST));\r
   //\r
   // Parse the command line arguments\r
   //\r
@@ -251,19 +79,31 @@ Returns:
     return STATUS_ERROR;\r
   }\r
 \r
+  if (mOptions.Quiet) {\r
+    SetPrintLevel(40);\r
+  } else if (mOptions.Verbose) {\r
+    SetPrintLevel(15);\r
+  } else if (mOptions.Debug) {\r
+    SetPrintLevel(DebugLevel);\r
+  }\r
+  \r
   if (mOptions.Verbose) {\r
     fprintf (stdout, "%s tool start.\n", UTILITY_NAME);\r
-  }\r
+    }  \r
   //\r
   // If dumping an image, then do that and quit\r
   //\r
-  if (mOptions.DumpOption) {\r
-    for (FList = mOptions.FileList; FList != NULL; FList = FList->Next) {\r
-      DumpImage (FList->FileName);\r
-      goto BailOut;\r
-    }\r
-  }\r
-\r
+//  if (mOptions.DumpOption) {\r
+//    for (FList = mOptions.FileList; FList != NULL; FList = FList->Next) {\r
+//    if ((Ptr0 = strstr ((CONST CHAR8 *)FList->FileName, DEFAULT_OUTPUT_EXTENSION)) != NULL) {\r
+//    DumpImage (mOptions.FileList);\r
+//    goto BailOut;\r
+//    }\r
+//    }\r
+//    else\r
+//    printf("\n *.rom file has not been generated, so -p option should be used //after the *.rom Option Rom binary generated!");\r
+//    goto BailOut;\r
+//  }\r
   //\r
   // Determine the output filename. Either what they specified on\r
   // the command line, or the first input filename with a different extension.\r
@@ -294,15 +134,15 @@ Returns:
   for (FList = mOptions.FileList; FList != NULL; FList = FList->Next) {\r
     if (stricmp (mOptions.OutFileName, FList->FileName) == 0) {\r
       Status = STATUS_ERROR;\r
-      Error(NULL, 0, 1002, "Conflicting options", "Input and output file names must be different - %s = %s", FList->FileName, mOptions.OutFileName);\r
+      Error(NULL, 0, 1002, "Input and output file names must be different - %s = %s", FList->FileName, mOptions.OutFileName);\r
       goto BailOut;\r
     }\r
   }\r
   //\r
   // Now open our output file\r
   //\r
-  if ((FptrOut = fopen (mOptions.OutFileName, "wb")) == NULL) {\r
-    Error(NULL, 0, 0001, "Error opening file", mOptions.OutFileName);\r
+  if ((FptrOut = fopen (mOptions.OutFileName, "w+b")) == NULL) {\r
+    Error(stdout, 0, 0001, "Error opening file", mOptions.OutFileName);\r
     goto BailOut;\r
   }\r
   //\r
@@ -324,7 +164,7 @@ Returns:
 \r
       Status = ProcessBinFile (FptrOut, FList, &Size);\r
     } else {\r
-      Error(NULL, 0, 2000, "Invalid parameter", "File not specified as EFI or binary: %s", FList->FileName);\r
+      Error(stdout, 0, 2000, "Invalid parameter", "File not specified as EFI or binary: %s", FList->FileName);\r
       Status = STATUS_ERROR;\r
     }\r
 \r
@@ -342,11 +182,17 @@ Returns:
   // Check total size\r
   //\r
   if (TotalSize > MAX_OPTION_ROM_SIZE) {\r
-    Error(NULL, 0, 2000, "Invalid parameter", "Option ROM image size exceeds limit 0x%X bytes", MAX_OPTION_ROM_SIZE);\r
+    Error(NULL, 0, 2000, "Option ROM image size exceeds limit 0x%X bytes", MAX_OPTION_ROM_SIZE);\r
     Status = STATUS_ERROR;\r
   }\r
 \r
 BailOut:\r
+  if (Status == STATUS_SUCCESS) {\r
+  if (mOptions.DumpOption) {\r
+    OutFileList->FileName = mOptions.OutFileName;\r
+    DumpImage(OutFileList);\r
+  }\r
+  } else {\r
   if (FptrOut != NULL) {\r
     fclose (FptrOut);\r
   }\r
@@ -358,7 +204,7 @@ BailOut:
     free (mOptions.FileList);\r
     mOptions.FileList = FList;\r
   }\r
-\r
+  }\r
   if (mOptions.Verbose) {\r
     fprintf (stdout, "%s tool done with return code is 0x%x.\n", UTILITY_NAME, GetUtilityStatus ());  \r
   }\r
@@ -366,45 +212,6 @@ BailOut:
   return GetUtilityStatus (); \r
 }\r
 \r
-UINT8\r
-CheckSumPadff (\r
-  UINT8  *Buffer, \r
-  UINT32 DataSize,\r
-  UINT32 PaddingSize\r
-  )\r
-/*++\r
-Routine Description:\r
-  Calculate checksum from DataSize of Buffer and Add pad 0xff\r
-\r
-Arguments:\r
-  Buffer      - pointer to data buffer\r
-  DataSize    - size of data buffer in bytes\r
-\r
-Return:\r
-  UINT8       - checksum\r
---*/\r
-{\r
-  UINT8 Checksum = 0;\r
-  while (DataSize-- != 0) {\r
-    Checksum = Checksum + Buffer[DataSize];\r
-  }\r
-  while (PaddingSize-- != 0) {\r
-    Checksum = Checksum + 0xff;\r
-  }\r
-  return Checksum;\r
-}\r
-\r
-char *\r
-GetCodeTypeStr (\r
-  UINT8     CodeType\r
-  )\r
-{\r
-  if (CodeType >= sizeof (mCodeTypeStr) / sizeof (*mCodeTypeStr)) {\r
-    CodeType = sizeof (mCodeTypeStr) / sizeof (*mCodeTypeStr) - 1;\r
-  }\r
-  return mCodeTypeStr[CodeType];\r
-}\r
-\r
 static\r
 int\r
 ProcessBinFile (\r
@@ -433,13 +240,14 @@ Returns:
   FILE                      *InFptr;\r
   UINT32                    TotalSize;\r
   UINT32                    FileSize;\r
-  UINT32                    DataSize;\r
-  UINT32                    PaddingSize;\r
   UINT8                     *Buffer;\r
   UINT32                    Status;\r
   PCI_EXPANSION_ROM_HEADER  *RomHdr;\r
+  PCI_DATA_STRUCTURE        *PciDs23;\r
   PCI_3_0_DATA_STRUCTURE    *PciDs30;\r
+  UINT32                    Index;\r
   UINT8                     ByteCheckSum;\r
\r
 \r
   Status = STATUS_SUCCESS;\r
 \r
@@ -463,24 +271,39 @@ Returns:
   fseek (InFptr, 0, SEEK_SET);\r
   Buffer = (INT8 *) malloc (FileSize);\r
   if (Buffer == NULL) {\r
-    Error (NULL, 0, 4003, "Resource", "Out of memory resources.");\r
+    Error (NULL, 0, 4003, "Resource", "Out of memory resources.", NULL);\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
 \r
   if (fread (Buffer, FileSize, 1, InFptr) != 1) {\r
-    Error(NULL, 0, 2000, "Invalid parameter", "Failed to read all bytes from input file");\r
+    Error(NULL, 0, 2000, "Invalid", "Failed to read all bytes from input file");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
+  //\r
+  // Total size must be an even multiple of 512 bytes, and can't exceed\r
+  // the option ROM image size.\r
+  //\r
+  TotalSize = FileSize;\r
+  if (TotalSize & 0x1FF) {\r
+    TotalSize = (TotalSize + 0x200) &~0x1ff;\r
+  }\r
 \r
-  \r
-  RomHdr  = (PCI_EXPANSION_ROM_HEADER *) Buffer;\r
-  PciDs30 = (PCI_3_0_DATA_STRUCTURE *) (Buffer + RomHdr->PcirOffset);\r
+  if (TotalSize > MAX_OPTION_ROM_SIZE) {\r
+    Error(NULL, 0, 3001, "Option ROM image %s size exceeds limit 0x%X bytes", InFile->FileName, MAX_OPTION_ROM_SIZE);\r
+    Status = STATUS_ERROR;\r
+    goto BailOut;\r
+  }\r
+  //\r
+  // Return the size to the caller so they can keep track of the running total.\r
+  //\r
+  *Size = TotalSize;\r
 \r
   //\r
   // Crude check to make sure it's a legitimate ROM image\r
   //\r
+  RomHdr = (PCI_EXPANSION_ROM_HEADER *) Buffer;\r
   if (RomHdr->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {\r
     Error(NULL, 0, 2000, "Invalid parameter", "ROM image file has invalid ROM signature");\r
     Status = STATUS_ERROR;\r
@@ -491,82 +314,77 @@ Returns:
   // Then check it for valid signature.\r
   //\r
   if ((RomHdr->PcirOffset > FileSize) || (RomHdr->PcirOffset == 0)) {\r
-    Error (NULL, 0, 2000, "Invalid parameter", "Invalid PCI data structure offset");\r
+    Error(NULL, 0, 2000, "Invalid parameter", "Invalid PCI data structure offset");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
 \r
-  if (PciDs30->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {\r
-    Error (NULL, 0, 2000, "Invalid parameter", "PCI data structure has invalid signature\n");\r
+  //\r
+  // Check the header is conform to PCI2.3 or PCI3.0\r
+  //\r
+  if (mOptions.Pci23 == 1) {\r
+  PciDs23 = (PCI_DATA_STRUCTURE *) (Buffer + RomHdr->PcirOffset);\r
+  if (PciDs23->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {\r
+    Error(NULL, 0, 2000, "Invalid parameter", "PCI data structure has invalid signature");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
-\r
-  if ((UINT32) (PciDs30->ImageLength * 512) == FileSize) {\r
-    //\r
-    // ImageLength reflects the actual file size correctly.\r
-    //\r
-    DataSize    = FileSize - 1;\r
-    PaddingSize = 0;\r
-    TotalSize   = FileSize;\r
   } else {\r
     //\r
-    // ImageLength doesn't reflect the actual file size,\r
-    // 1). add additional 512 bytes if actual file size is multiple of 512\r
-    // 2). add additional X (X <= 512) bytes so that the result size is multiple of 512\r
+    // Default setting is PCI3.0 header\r
     //\r
-    fprintf (stdout, "WARNING: ImageLength in PCI data structure != Actual File Size\n"\r
-                     "         --> add additional padding bytes\n"\r
-                     "         --> adjust ImageLength\n"\r
-            );\r
-    TotalSize   = (FileSize + 0x200) & ~0x1ff;\r
-    DataSize    = FileSize;\r
-    PaddingSize = TotalSize - DataSize - 1;\r
-    PciDs30->ImageLength = (UINT16) (TotalSize / 512);\r
-  }\r
-\r
-  //\r
-  // Check size\r
-  //\r
-  if (TotalSize > MAX_OPTION_ROM_SIZE) {\r
-    Error (NULL, 0, 2000, "Invalid parameter", "Option ROM image %s size exceeds limit 0x%X bytes\n",\r
-      InFile->FileName, MAX_OPTION_ROM_SIZE\r
-      );\r
+    PciDs30 = (PCI_3_0_DATA_STRUCTURE *)(Buffer + RomHdr->PcirOffset);\r
+  if (PciDs30->Signature != PCI_DATA_STRUCTURE_SIGNATURE) {\r
+    Error(NULL, 0, 2000, "Invalid parameter", "PCI data structure has invalid signature");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
+  }    \r
   }\r
 \r
-  //\r
-  // Return the size to the caller so they can keep track of the running total.\r
-  //\r
-  *Size = TotalSize;\r
-\r
+  \r
   //\r
   // If this is the last image, then set the LAST bit unless requested not\r
-  // to via the command-line -l argument. Otherwise, make sure you clear it.\r
+  // to via the command-line -n argument. Otherwise, make sure you clear it.\r
   //\r
   if ((InFile->Next == NULL) && (mOptions.NoLast == 0)) {\r
-    PciDs30->Indicator |= INDICATOR_LAST;\r
+    if (mOptions.Pci23 == 1) {\r
+    PciDs23->Indicator = INDICATOR_LAST;\r
+       } else {\r
+          PciDs30->Indicator = INDICATOR_LAST;\r
+                 }\r
   } else {\r
-    PciDs30->Indicator &= ~INDICATOR_LAST;\r
+    if (mOptions.Pci23 == 1) {\r
+      PciDs23->Indicator = 0;\r
+       } else {\r
+    PciDs30->Indicator = 0;\r
+               }\r
+  }\r
+\r
+  ByteCheckSum = 0;\r
+  for (Index = 0; Index < FileSize - 1; Index++) {\r
+    ByteCheckSum = (UINT8) (ByteCheckSum + Buffer[Index]);\r
   }\r
 \r
-  ByteCheckSum = -CheckSumPadff (Buffer, DataSize, PaddingSize);\r
+  Buffer[FileSize - 1] = (UINT8) ((~ByteCheckSum) + 1);\r
+  fprintf (stdout, "Checksum = %02x\n", (UINT32) Buffer[FileSize - 1]);\r
 \r
   //\r
   // Now copy the input file contents out to the output file\r
-  // Add 0xff as pad byte, and fill checksum in the last byte.\r
   //\r
-  if (fwrite (Buffer, DataSize, 1, OutFptr) != 1) {\r
-    Error(NULL, 0, 0002, "Error writing file", "Failed to write all file bytes to output file");\r
+  if (fwrite (Buffer, FileSize, 1, OutFptr) != 1) {\r
+    Error(NULL, 0, 0005, "Failed to write all file bytes to output file");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
 \r
-  while (PaddingSize-- != 0) {\r
+  TotalSize -= FileSize;\r
+  //\r
+  // Pad the rest of the image to make it a multiple of 512 bytes\r
+  //\r
+  while (TotalSize > 0) {\r
     putc (~0, OutFptr);\r
+    TotalSize--;\r
   }\r
-  putc (ByteCheckSum, OutFptr);\r
 \r
 BailOut:\r
   if (InFptr != NULL) {\r
@@ -580,7 +398,7 @@ BailOut:
   // Print the file name if errors occurred\r
   //\r
   if (Status != STATUS_SUCCESS) {\r
-    Error (NULL, 0, 0003, "Error parsing file", InFile->FileName);\r
+    Error(NULL, 0, 0003, "Error parsing file: %s", InFile->FileName);\r
   }\r
 \r
   return Status;\r
@@ -635,7 +453,7 @@ Returns:
   // Try to open the input file\r
   //\r
   if ((InFptr = fopen (InFile->FileName, "rb")) == NULL) {\r
-    Error(NULL, 0, 0001, "Error opening file", InFile->FileName);\r
+    Error(NULL, 0, 0001, "Error opening file: %s", InFile->FileName);\r
     return STATUS_ERROR;\r
   }\r
   //\r
@@ -666,13 +484,8 @@ Returns:
   } else {\r
     HeaderPadBytes = 0;\r
   }\r
-  \r
-  if (mOptions.Pci23 == 1) {\r
-    HeaderSize = sizeof (PCI_DATA_STRUCTURE) + HeaderPadBytes + sizeof (EFI_PCI_EXPANSION_ROM_HEADER);\r
-  } else {\r
-    HeaderSize = sizeof (PCI_3_0_DATA_STRUCTURE) + HeaderPadBytes + sizeof (EFI_PCI_EXPANSION_ROM_HEADER);\r
-  }\r
-  \r
+\r
+  HeaderSize = sizeof (PCI_DATA_STRUCTURE) + HeaderPadBytes + sizeof (EFI_PCI_EXPANSION_ROM_HEADER);\r
   if (mOptions.Verbose) {\r
     fprintf (stdout, "  File size   = 0x%X\n", FileSize);\r
   }\r
@@ -740,7 +553,7 @@ Returns:
   // Check size\r
   //\r
   if (TotalSize > MAX_OPTION_ROM_SIZE) {\r
-    Error(NULL, 0, 2000, "Invalid parameter", "Option ROM image %s size exceeds limit 0x%X bytes", InFile->FileName, MAX_OPTION_ROM_SIZE);  \r
+    Error(NULL, 0, 2000, "Option ROM image %s size exceeds limit 0x%X bytes", InFile->FileName, MAX_OPTION_ROM_SIZE);  \r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
@@ -773,7 +586,7 @@ Returns:
   if (mOptions.Pci23 == 1) {\r
     memset (&PciDs23, 0, sizeof (PCI_DATA_STRUCTURE));\r
   } else {\r
-    memset (&PciDs30, 0, sizeof (PCI_3_0_DATA_STRUCTURE));\r
+  memset (&PciDs30, 0, sizeof (PCI_3_0_DATA_STRUCTURE));\r
   }\r
 \r
   if (mOptions.Pci23 == 1) {\r
@@ -781,7 +594,7 @@ Returns:
   PciDs23.VendorId  = VendId;\r
   PciDs23.DeviceId  = DevId;\r
   PciDs23.Length    = (UINT16) sizeof (PCI_DATA_STRUCTURE);\r
-  PciDs23.Revision  = 2;\r
+  PciDs23.Revision  = 0;\r
   //\r
   // Class code and code revision from the command line (optional)\r
   //\r
@@ -797,7 +610,7 @@ Returns:
   PciDs30.DeviceId  = DevId;\r
   PciDs30.DeviceListOffset = 0; // to be fixed\r
   PciDs30.Length    = (UINT16) sizeof (PCI_3_0_DATA_STRUCTURE);\r
-  PciDs30.Revision  = 3;\r
+  PciDs30.Revision  = 0;\r
   //\r
   // Class code and code revision from the command line (optional)\r
   //\r
@@ -817,22 +630,21 @@ Returns:
   //\r
   if ((InFile->Next == NULL) && (mOptions.NoLast == 0)) {\r
     if (mOptions.Pci23 == 1) {\r
-      PciDs23.Indicator |= INDICATOR_LAST;\r
-    } else {\r
-      PciDs30.Indicator |= INDICATOR_LAST;\r
-    }\r
+      PciDs23.Indicator = INDICATOR_LAST;\r
+         } else {\r
+    PciDs30.Indicator = INDICATOR_LAST;}\r
   } else {\r
     if (mOptions.Pci23 == 1) {\r
-      PciDs23.Indicator &= ~INDICATOR_LAST;\r
-    } else {\r
-      PciDs30.Indicator &= ~INDICATOR_LAST;\r
-    }\r
+      PciDs23.Indicator = 0;\r
+       } else {\r
+    PciDs30.Indicator = 0;\r
+               }\r
   }\r
   //\r
   // Write the ROM header to the output file\r
   //\r
   if (fwrite (&RomHdr, sizeof (RomHdr), 1, OutFptr) != 1) {\r
-    Error(NULL, 0, 0002, "Error writing file", "Failed to write ROM header to output file");\r
+    Error(NULL, 0, 0002, "Failed to write ROM header to output file");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
@@ -842,7 +654,7 @@ Returns:
   //\r
   while (HeaderPadBytes > 0) {\r
     if (putc (0, OutFptr) == EOF) {\r
-      Error(NULL, 0, 0002, "Error writing file", "Failed to write ROM header pad bytes to output file");\r
+      Error(NULL, 0, 0002, "Failed to write ROM header pad bytes to output file");\r
       Status = STATUS_ERROR;\r
       goto BailOut;\r
     }\r
@@ -853,17 +665,17 @@ Returns:
   // Write the PCI data structure header to the output file\r
   //\r
   if (mOptions.Pci23 == 1) {\r
-    if (fwrite (&PciDs23, sizeof (PciDs23), 1, OutFptr) != 1) {\r
-      Error(NULL, 0, 0002, "Error writing file", "Failed to write PCI ROM header to output file");\r
-      Status = STATUS_ERROR;\r
-      goto BailOut;\r
-    \r
+  if (fwrite (&PciDs23, sizeof (PciDs23), 1, OutFptr) != 1) {\r
+    Error(NULL, 0, 0002, "Failed to write PCI ROM header to output file");\r
+    Status = STATUS_ERROR;\r
+    goto BailOut;\r
+  } \r
   } else {\r
-    if (fwrite (&PciDs30, sizeof (PciDs30), 1, OutFptr) != 1) {\r
-      Error(NULL, 0, 0002, "Error writing file", "Failed to write PCI ROM header to output file");\r
-      Status = STATUS_ERROR;\r
-      goto BailOut;\r
-    \r
+  if (fwrite (&PciDs30, sizeof (PciDs30), 1, OutFptr) != 1) {\r
+    Error(NULL, 0, 0002, "Failed to write PCI ROM header to output file");\r
+    Status = STATUS_ERROR;\r
+    goto BailOut;\r
+  } \r
   }\r
   //\r
   // Keep track of how many bytes left to write\r
@@ -874,7 +686,7 @@ Returns:
   // Now dump the input file's contents to the output file\r
   //\r
   if (fwrite (Buffer, FileSize, 1, OutFptr) != 1) {\r
-    Error(NULL, 0, 0002, "Error writing file", "Failed to write all file bytes to output file");\r
+    Error(NULL, 0, 0002, "Failed to write all file bytes to output file");\r
     Status = STATUS_ERROR;\r
     goto BailOut;\r
   }\r
@@ -885,7 +697,7 @@ Returns:
   //\r
   while (TotalSize > 0) {\r
     if (putc (~0, OutFptr) == EOF) {\r
-      Error(NULL, 0, 2000, "Invalid parameter", "Failed to write trailing pad bytes output file");\r
+      Error(NULL, 0, 2000, "Failed to write trailing pad bytes output file");\r
       Status = STATUS_ERROR;\r
       goto BailOut;\r
     }\r
@@ -912,7 +724,7 @@ BailOut:
   // Print the file name if errors occurred\r
   //\r
   if (Status != STATUS_SUCCESS) {\r
-    Error(NULL, 0 , 0003, "Error parsing file", InFile->FileName);\r
+    Error(NULL, 0 , 0003, "Error parsing file: %s", InFile->FileName);\r
   }\r
 \r
   return Status;\r
@@ -959,7 +771,7 @@ Returns:
   // Read the DOS header\r
   //\r
   if (fread (&DosHeader, sizeof (DosHeader), 1, Fptr) != 1) {\r
-    Error(NULL, 0, 0004, "Error reading file", "Failed to read the DOS stub from the input file");\r
+    Error(NULL, 0, 0004, "Failed to read the DOS stub from the input file");\r
     return STATUS_ERROR;\r
   }\r
   //\r
@@ -974,7 +786,7 @@ Returns:
   //\r
   fseek (Fptr, (long) DosHeader.e_lfanew, SEEK_SET);\r
   if (fread (&PESig, sizeof (PESig), 1, Fptr) != 1) {\r
-    Error(NULL, 0, 0004, "Error reading file", "Failed to read PE signature bytes from input file");\r
+    Error(NULL, 0, 0004, "Failed to read PE signature bytes from input file");\r
     return STATUS_ERROR;\r
   }\r
   //\r
@@ -988,7 +800,7 @@ Returns:
   // Read the file header and stuff their MachineType\r
   //\r
   if (fread (&FileHdr, sizeof (FileHdr), 1, Fptr) != 1) {\r
-    Error(NULL, 0, 0004, "Error reading file", "Failed to read PE file header from input file");\r
+    Error(NULL, 0, 0004, "Failed to read PE file header from input file");\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -998,7 +810,7 @@ Returns:
   // Read the optional header so we can get the subsystem\r
   //\r
   if (fread (&OptionalHdr, sizeof (OptionalHdr), 1, Fptr) != 1) {\r
-    Error(NULL, 0, 0004, "Error reading file", "Failed to read COFF optional header from input file");\r
+    Error(NULL, 0, 0004, "Failed to read COFF optional header from input file");\r
     return STATUS_ERROR;\r
   }\r
 \r
@@ -1046,6 +858,7 @@ Returns:
   UINT32    FileFlags;\r
   UINT32    ClassCode;\r
   UINT32    CodeRevision;\r
+  EFI_STATUS Status;\r
 \r
   FileFlags = 0;\r
 \r
@@ -1089,6 +902,7 @@ Returns:
   //\r
   // Process until no more arguments\r
   //\r
+  //__asm int 3;\r
   while (Argc > 0) {\r
     if ((Argv[0][0] == '-') || (Argv[0][0] == '/')) {\r
       //\r
@@ -1108,7 +922,7 @@ Returns:
           Options->VendId       = (UINT16) strtol (Argv[1], NULL, 16);\r
           Options->VendIdValid  = 1;\r
         } else {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Missing Vendor ID with %s", Argv[0]);\r
+               Error (NULL, 0, 2000, "Invalid parameter", "Missing Vendor ID with %s", Argv[0]);\r
           Usage ();\r
           return STATUS_ERROR;\r
         }\r
@@ -1176,7 +990,24 @@ Returns:
         // -v for verbose\r
         //\r
         Options->Verbose = 1;\r
-      } else if ((stricmp (Argv[0], "--dump") == 0) || (stricmp (Argv[0], "-d") == 0)) {\r
+      } else if (stricmp (Argv[0], "--debug") == 0) {\r
+        Argv++;\r
+        Status = AsciiStringToUint64(Argv[0], FALSE, &DebugLevel);\r
+        if (DebugLevel > 9 || DebugLevel < 0) {\r
+          Error(NULL, 0, 2000, "Invalid parameter", "Unrecognized parameter %s\n", Argv[0]);\r
+          return 1;\r
+        }\r
+        if (DebugLevel>=5 && DebugLevel<=9) {\r
+          DebugMode = TRUE;\r
+        } else {\r
+          DebugMode = FALSE;\r
+        }\r
+        Argv++;\r
+      } else if ((stricmp (Argv[0], "-quiet") == 0) || (stricmp (Argv[0], "-q") == 0)) {\r
+        QuietMode = TRUE;\r
+        //Argv++;\r
+        //Argc--;\r
+      } else if ((stricmp (Argv[0], "-dump") == 0) || (stricmp (Argv[0], "-d") == 0)) {\r
         //\r
         // -dump for dumping a ROM image. In this case, say that the device id\r
         // and vendor id are valid so we don't have to specify bogus ones on the\r
@@ -1204,7 +1035,7 @@ Returns:
             return STATUS_ERROR;\r
           }\r
         } else {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Missing class code value with %s", Argv[0]);\r
+               Error (NULL, 0, 2000, "Invalid parameter", "Missing class code value with %s", Argv[0]);\r
           Usage ();\r
           return STATUS_ERROR;\r
         }\r
@@ -1229,14 +1060,14 @@ Returns:
             return STATUS_ERROR;\r
           }\r
         } else {\r
-          Error (NULL, 0, 2000, "Invalid parameter", "Missing code revision value with %s", Argv[0]);\r
+               Error (NULL, 0, 2000, "Invalid parameter", "Missing code revision value with %s", Argv[0]);\r
           Usage ();\r
           return STATUS_ERROR;\r
         }\r
 \r
         Argv++;\r
         Argc--;\r
-      } else if ((stricmp (Argv[0], "-p") == 0) || (stricmp (Argv[0], "--pci23") == 0)) {\r
+      } else if ((stricmp (Argv[0], "-p") == 0) || (stricmp (Argv[0], "-pci23") == 0)) {\r
         //\r
         // Default layout meets PCI 3.0 specifications, specifying this flag will for a PCI 2.3 layout.\r
         //\r
@@ -1278,13 +1109,6 @@ Returns:
       }\r
 \r
       PrevFileList = FileList;\r
-      //\r
-      // Set the class code and code revision for this file, then reset the values.\r
-      //\r
-      FileList->ClassCode     = ClassCode;\r
-      FileList->CodeRevision  = (UINT16) CodeRevision;\r
-      ClassCode               = 0;\r
-      CodeRevision            = 0;\r
     }\r
     //\r
     // Next argument\r
@@ -1292,31 +1116,38 @@ Returns:
     Argv++;\r
     Argc--;\r
   }\r
+\r
+  //\r
+  // Must have specified some files\r
+  //\r
+  if (Options->FileList == NULL) {\r
+    Error (NULL, 0, 2000, "Invalid parameter", "Missing input file name");\r
+    Usage ();\r
+    return STATUS_ERROR;\r
+  }  \r
+      //\r
+      // Set the class code and code revision for this file, then reset the values.\r
+      //\r
+      FileList->ClassCode     = ClassCode;\r
+      FileList->CodeRevision  = (UINT16) CodeRevision;\r
+      ClassCode               = 0;\r
+      CodeRevision            = 0;  \r
   //\r
   // Make sure they specified a device ID and vendor ID\r
   //\r
 /*  \r
   if (!Options->VendIdValid) {\r
-    Error(NULL, 0, 2000, "Invalid parameter", "Missing Vendor ID in command line");\r
+    Error(NULL, 0, 2000, "Missing Vendor ID in command line");\r
     Usage ();\r
     return STATUS_ERROR;\r
   }\r
 \r
   if (!Options->DevIdValid) {\r
-    Error(NULL, 0, 2000, "Invalid parameter", "Missing Device ID in command line");\r
+    Error(NULL, 0, 2000, "Missing Device ID in command line");\r
     Usage ();\r
     return STATUS_ERROR;\r
   }\r
 */  \r
-  //\r
-  // Must have specified some files\r
-  //\r
-  if (Options->FileList == NULL) {\r
-    Error (NULL, 0, 2000, "Invalid parameter", "Missing input file name");\r
-    Usage ();\r
-    return STATUS_ERROR;\r
-  }\r
-\r
   return 0;\r
 }\r
 \r
@@ -1406,12 +1237,16 @@ Returns:
             Show program's version number and exit.\n");\r
   fprintf (stdout, "  -h, --help\n\\r
             Show this help message and exit.\n");\r
+  fprintf (stdout, "  -q, --quiet\n\\r
+            Disable all messages except FATAL ERRORS.\n");\r
+  fprintf (stdout, "  --debug [#]\n\\r
+            Enable debug messages at level #.\n");  \r
 }\r
 \r
 static\r
 void\r
 DumpImage (\r
-  INT8 *InFileName\r
+  FILE_LIST *InFile\r
   )\r
 /*++\r
 \r
@@ -1421,7 +1256,7 @@ Routine Description:
 \r
 Arguments:\r
 \r
-  InFileName  - the file name of an existing option ROM image\r
+  InFile  - the file name of an existing option ROM image\r
 \r
 Returns:\r
 \r
@@ -1434,17 +1269,16 @@ Returns:
   UINT32                        ImageStart;\r
   UINT32                        ImageCount;\r
   EFI_PCI_EXPANSION_ROM_HEADER  EfiRomHdr;\r
+  PCI_DATA_STRUCTURE            PciDs23;\r
   PCI_3_0_DATA_STRUCTURE        PciDs30;\r
-  UINT16                        DeviceId;  \r
 \r
   //\r
   // Open the input file\r
   //\r
-  if ((InFptr = fopen (InFileName, "rb")) == NULL) {\r
-    Error (NULL, 0, 0001, "Error opening file", InFileName);\r
+  if ((InFptr = fopen (InFile->FileName, "rb")) == NULL) {\r
+    Error (NULL, 0, 0001, "Error opening file", InFile->FileName);\r
     return ;\r
   }\r
-  fprintf (stdout, "\nThe dumped option ROM image : %s.\n", InFileName);\r
   //\r
   // Go through the image and dump the header stuff for each\r
   //\r
@@ -1462,11 +1296,11 @@ Returns:
     //\r
     if (fread (&PciRomHdr, sizeof (PciRomHdr), 1, InFptr) != 1) {\r
       if (ImageStart == 0) {\r
-        Error (NULL, 0, 3001, "Not supported", "Failed to read PCI ROM header from file");\r
-        goto BailOut;\r
-      } else {\r
-        goto BailOut;\r
+      Error (NULL, 0, 3001, "Not supported", "Failed to read PCI ROM header from file");\r
+      goto BailOut;\r
       }\r
+      else\r
+      goto BailOut;\r
     }\r
 \r
     //\r
@@ -1486,76 +1320,97 @@ Returns:
     //\r
     // Read and dump the PCI data structure\r
     //\r
+    if (mOptions.Pci23 == 1) {\r
+    if (fread (&PciDs23, sizeof (PciDs23), 1, InFptr) != 1) {\r
+      Error (NULL, 0, 3001, "Not supported", "Failed to read PCI data structure from file");\r
+      goto BailOut;\r
+    }\r
+    } else {\r
     if (fread (&PciDs30, sizeof (PciDs30), 1, InFptr) != 1) {\r
       Error (NULL, 0, 3001, "Not supported", "Failed to read PCI data structure from file");\r
       goto BailOut;\r
     }\r
+    }\r
 \r
     fprintf (stdout, "  PCI Data Structure\n");\r
+    if (mOptions.Pci23 == 1) {\r
     fprintf (\r
       stdout,\r
       "    Signature              %c%c%c%c\n",\r
+      (char) PciDs23.Signature,\r
+      (char) (PciDs23.Signature >> 8),\r
+      (char) (PciDs23.Signature >> 16),\r
+      (char) (PciDs23.Signature >> 24)\r
+      );\r
+    fprintf (stdout, "    Vendor ID              0x%04X\n", PciDs23.VendorId);\r
+    fprintf (stdout, "    Device ID              0x%04X\n", PciDs23.DeviceId);\r
+    fprintf (stdout, "    Length                 0x%04X\n", PciDs23.Length);\r
+    fprintf (stdout, "    Revision               0x%04X\n", PciDs23.Revision);\r
+    fprintf (\r
+      stdout,\r
+      "    Class Code             0x%06X\n",\r
+      (UINT32) (PciDs23.ClassCode[0] | (PciDs23.ClassCode[1] << 8) | (PciDs23.ClassCode[2] << 16))\r
+      );\r
+    fprintf (stdout, "    Image size             0x%X\n", PciDs23.ImageLength * 512);\r
+    fprintf (stdout, "    Code revision:         0x%04X\n", PciDs23.CodeRevision);\r
+    fprintf (stdout, "    Indicator              0x%02X", (UINT32) PciDs23.Indicator);\r
+    } else {\r
+    fprintf (\r
+      stdout,\r
+      "    Signature               %c%c%c%c\n",\r
       (char) PciDs30.Signature,\r
       (char) (PciDs30.Signature >> 8),\r
       (char) (PciDs30.Signature >> 16),\r
       (char) (PciDs30.Signature >> 24)\r
       );\r
-    fprintf (stdout, "    Vendor ID              0x%04X\n", PciDs30.VendorId);\r
-    fprintf (stdout, "    Device ID              0x%04X\n", PciDs30.DeviceId);\r
-    fprintf (stdout, "    Length                 0x%04X\n", PciDs30.Length);\r
-    fprintf (stdout, "    Revision               0x%04X\n", PciDs30.Revision);\r
+    fprintf (stdout, "    Vendor ID               0x%04X\n", PciDs30.VendorId);\r
+    fprintf (stdout, "    Device ID               0x%04X\n", PciDs30.DeviceId);\r
+    fprintf (stdout, "    Length                  0x%04X\n", PciDs30.Length);\r
+    fprintf (stdout, "    Revision                0x%04X\n", PciDs30.Revision);\r
+    fprintf (stdout, "    DeviceListOffset        0x%02X\n", (UINT32) PciDs30.DeviceListOffset);    \r
     fprintf (\r
       stdout,\r
-      "    Class Code             0x%06X\n",\r
+      "    Class Code              0x%06X\n",\r
       (UINT32) (PciDs30.ClassCode[0] | (PciDs30.ClassCode[1] << 8) | (PciDs30.ClassCode[2] << 16))\r
       );\r
-    fprintf (stdout, "    Image size             0x%X\n", PciDs30.ImageLength * 512);\r
-    fprintf (stdout, "    Code revision:         0x%04X\n", PciDs30.CodeRevision);\r
-    fprintf (stdout, "    Indicator              0x%02X\n", (UINT32) PciDs30.Indicator);\r
+    fprintf (stdout, "    Image size              0x%X\n", PciDs30.ImageLength * 512);\r
+    fprintf (stdout, "    Code revision:          0x%04X\n", PciDs30.CodeRevision);\r
+    fprintf (stdout, "    MaxRuntimeImageLength   0x%02X\n", (UINT32) PciDs30.MaxRuntimeImageLength);\r
+    fprintf (stdout, "    ConfigUtilityCodeHeaderOffset 0x%02X\n", (UINT32) PciDs30.ConfigUtilityCodeHeaderOffset);\r
+    fprintf (stdout, "    DMTFCLPEntryPointOffset 0x%02X\n", (UINT32) PciDs30.DMTFCLPEntryPointOffset);   \r
+    fprintf (stdout, "    Indicator               0x%02X", (UINT32) PciDs30.Indicator);    \r
+    }\r
     //\r
-    // Print the code type. If EFI code, then we can provide more info.\r
+    // Print the indicator, used to flag the last image\r
     //\r
-    fprintf (stdout, "    Code type              0x%02X   (%s)\n", (UINT32) PciDs30.CodeType, GetCodeTypeStr(PciDs30.CodeType));\r
-\r
+    if (PciDs23.Indicator == INDICATOR_LAST || PciDs30.Indicator == INDICATOR_LAST) {\r
+      fprintf (stdout, "   (last image)\n");\r
+    } else {\r
+      fprintf (stdout, "\n");\r
+    }\r
     //\r
-    // Dump additional information for PCI 3.0 OpROM\r
+    // Print the code type. If EFI code, then we can provide more info.\r
     //\r
-    if (PciDs30.Revision >= 3) {\r
-      fprintf (stdout, "  Extended for PCI 3.0\n");\r
-      \r
-      if (PciDs30.DeviceListOffset != 0) {\r
-        if (fseek (InFptr, ImageStart + PciRomHdr.PcirOffset + PciDs30.DeviceListOffset, SEEK_SET)) {\r
-          Error (NULL, 0, 3001, "Not supported", "Failed to seek to supported Device List");\r
-          goto BailOut;\r
-        }\r
-        fprintf (stdout, "    Device ID List         ");\r
-        while (TRUE) {\r
-          if (fread (&DeviceId, sizeof (DeviceId), 1, InFptr) != 1) {\r
-            Error (NULL, 0, 3001, "Not supported", "Failed to read supported DeviceId from DeviceId List");\r
-            goto BailOut;\r
-          }\r
-          if (DeviceId == 0) {\r
-            break;\r
-          }\r
-          fprintf (stdout, "0x%04X ", DeviceId);\r
-        }\r
-        fprintf (stdout, "\n");\r
-      }\r
-      fprintf (stdout, "    Max Runtime Image Length 0x%08X\n", PciDs30.MaxRuntimeImageLength * 512);\r
-      if (PciDs30.Length == sizeof (PCI_3_0_DATA_STRUCTURE)) {\r
-        fprintf (stdout, "    Config Utility Header  0x%04X\n", PciDs30.ConfigUtilityCodeHeaderOffset);\r
-        fprintf (stdout, "    DMTF CLP Entry Point   0x%04X\n", PciDs30.DMTFCLPEntryPointOffset);\r
-      } else {\r
-        fprintf (stdout, "WARNING: Oprom declars 3.0 revision with wrong structure length 0x%04X\n", PciDs30.Length);\r
-      }\r
+    if (mOptions.Pci23 == 1) {\r
+      fprintf (stdout, "    Code type              0x%02X", (UINT32) PciDs23.CodeType);\r
+    } else {\r
+      fprintf (stdout, "    Code type               0x%02X", (UINT32) PciDs30.CodeType); \r
     }\r
-\r
-    if (PciDs30.CodeType == PCI_CODE_TYPE_EFI_IMAGE) {\r
+    if (PciDs23.CodeType == PCI_CODE_TYPE_EFI_IMAGE || PciDs30.CodeType == PCI_CODE_TYPE_EFI_IMAGE) {\r
+      fprintf (stdout, "   (EFI image)\n");\r
       //\r
       // Re-read the header as an EFI ROM header, then dump more info\r
       //\r
       fprintf (stdout, "  EFI ROM header contents\n");\r
-      memcpy (&EfiRomHdr, &PciRomHdr, sizeof (EfiRomHdr));\r
+      if (fseek (InFptr, ImageStart, SEEK_SET)) {\r
+        Error(NULL, 0, 5001, "Failed to re-seek to ROM header structure");\r
+        goto BailOut;\r
+      }\r
+\r
+      if (fread (&EfiRomHdr, sizeof (EfiRomHdr), 1, InFptr) != 1) {\r
+        Error(NULL, 0, 5001, "Failed to read EFI PCI ROM header from file");\r
+        goto BailOut;\r
+      }\r
       //\r
       // Now dump more info\r
       //\r
@@ -1589,22 +1444,38 @@ Returns:
         (UINT32) EfiRomHdr.EfiImageHeaderOffset,\r
         (UINT32) (EfiRomHdr.EfiImageHeaderOffset + ImageStart)\r
         );\r
-    }\r
 \r
+    } else {\r
+      //\r
+      // Not an EFI image\r
+      //\r
+      fprintf (stdout, "\n");\r
+    }\r
+    //\r
+    // If code type is EFI image, then dump it as well?\r
+    //\r
+    // if (PciDs.CodeType == PCI_CODE_TYPE_EFI_IMAGE) {\r
+    // }\r
     //\r
     // If last image, then we're done\r
     //\r
-    if ((PciDs30.Indicator & INDICATOR_LAST) == INDICATOR_LAST) {\r
-      fprintf (stdout, "  (last image)\n");\r
+    if (PciDs23.Indicator == INDICATOR_LAST || PciDs30.Indicator == INDICATOR_LAST) {\r
       goto BailOut;\r
     }\r
     //\r
     // Seek to the start of the next image\r
     //\r
+    if (mOptions.Pci23 == 1) {\r
+    if (fseek (InFptr, ImageStart + (PciDs23.ImageLength * 512), SEEK_SET)) {\r
+      Error (NULL, 0, 3001, "Not supported", "Failed to seek to next image");\r
+      goto BailOut;\r
+    }    \r
+    } else {\r
     if (fseek (InFptr, ImageStart + (PciDs30.ImageLength * 512), SEEK_SET)) {\r
       Error (NULL, 0, 3001, "Not supported", "Failed to seek to next image");\r
       goto BailOut;\r
     }\r
+    }\r
   }\r
 \r
 BailOut:\r