Clean up GenBootSector source code, make logic more sense.
authorklu2 <klu2@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 7 May 2008 05:08:49 +0000 (05:08 +0000)
committerklu2 <klu2@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 7 May 2008 05:08:49 +0000 (05:08 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1197 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenBootSector/GenBootSector.c

index 4a589b3..1a0e060 100644 (file)
@@ -55,14 +55,24 @@ typedef enum {
   PatchTypeFloppy,\r
   PatchTypeIde,\r
   PatchTypeUsb,\r
+  PatchTypeFileImage   // input and output are all file image, patching action is same as PatchTypeFloppy\r
 } PATCH_TYPE;\r
 \r
+typedef enum {\r
+  PathUnknown,\r
+  PathFile,\r
+  PathFloppy,\r
+  PathUsb,\r
+  PathIde\r
+} PATH_TYPE;\r
+\r
 typedef enum {\r
   ErrorSuccess,\r
   ErrorFileCreate,\r
   ErrorFileReadWrite,\r
   ErrorNoMbr,\r
-  ErrorFatType\r
+  ErrorFatType,\r
+  ErrorPath,\r
 } ERROR_STATUS;\r
 \r
 CHAR *ErrorStatusDesc[] = {\r
@@ -70,7 +80,8 @@ CHAR *ErrorStatusDesc[] = {
   "Failed to create files",\r
   "Failed to read/write files",\r
   "No MBR exists",\r
-  "Failed to detect Fat type"\r
+  "Failed to detect Fat type",\r
+  "Inavlid path"\r
 };\r
 \r
 typedef struct _DRIVE_TYPE_DESC {\r
@@ -96,6 +107,13 @@ typedef struct _DRIVE_INFO {
   UINT              DiskNumber;\r
 } DRIVE_INFO;\r
 \r
+typedef struct _PATH_INFO {\r
+  CHAR             *Path;\r
+  CHAR             PhysicalPath[260];\r
+  PATH_TYPE        Type;\r
+  BOOL             Input;\r
+} PATH_INFO;\r
+\r
 #define BOOT_SECTOR_LBA_OFFSET 0x1FA\r
 \r
 #define IsLetter(x) (((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z'))\r
@@ -256,8 +274,7 @@ Routine Description:
 INT\r
 GetBootSectorOffset (\r
   HANDLE     DiskHandle,\r
-  BOOL       WriteToDisk,\r
-  PATCH_TYPE PatchType\r
+  PATH_INFO  *PathInfo\r
   )\r
 /*++\r
 Description:\r
@@ -269,8 +286,8 @@ Description:
 \r
 Arguments:\r
   DiskHandle  : HANDLE of disk\r
+  PathInfo    : PATH_INFO structure.\r
   WriteToDisk : TRUE indicates writing\r
-  PatchType   : PatchTypeFloppy, PatchTypeIde, PatchTypeUsb\r
 \r
 Return:\r
   -1   : failed\r
@@ -331,7 +348,7 @@ Return:
     //\r
     if (Index == PARTITION_ENTRY_NUM) {\r
       DbrOffset = *(DWORD *)&DiskPartition[PARTITION_TABLE_OFFSET + PARTITION_ENTRY_STARTLBA_OFFSET];\r
-      if (WriteToDisk && (PatchType == PatchTypeUsb)) {\r
+      if (!PathInfo->Input && (PathInfo->Type == PathUsb)) {\r
         SetFilePointer(DiskHandle, 0, NULL, FILE_BEGIN);\r
         DiskPartition[PARTITION_TABLE_OFFSET] = 0x80;\r
         WriteFile (DiskHandle, DiskPartition, 0x200, &BytesReturn, NULL);\r
@@ -342,84 +359,51 @@ Return:
   return DbrOffset;\r
 }\r
 \r
+/**\r
+ * Get window file handle for input/ouput disk/file. \r
+ *  \r
+ * @param PathInfo\r
+ * @param ProcessMbr\r
+ * @param FileHandle\r
+ * \r
+ * @return ERROR_STATUS\r
+ */\r
 ERROR_STATUS\r
-ProcessBsOrMbr (\r
-  CHAR        *DiskName,\r
-  CHAR        *FileName,\r
-  BOOL        WriteToDisk,\r
-  PATCH_TYPE  PatchType,\r
-  BOOL        ProcessMbr\r
+GetFileHandle (\r
+  PATH_INFO  *PathInfo,\r
+  BOOL       ProcessMbr,\r
+  HANDLE     *FileHandle,\r
+  DWORD      *DbrOffset\r
   )\r
-/*++\r
-Routine Description:\r
-  Writing or reading boot sector or MBR according to the argument.\r
-\r
-Arguments:\r
-  DiskName    : Win32 API recognized string name of disk\r
-  FileName    : file name\r
-  WriteToDisk : TRUE is to write content of file to disk, otherwise, reading content of disk to file\r
-  PatchType   : PatchTypeFloppy, PatchTypeIde, PatchTypeUsb\r
-  ProcessMbr  : TRUE is to process MBR, otherwise, processing boot sector\r
-\r
-Return:\r
-  ErrorSuccess\r
-  ErrorFileCreate\r
-  ErrorFileReadWrite\r
-  ErrorNoMbr\r
-  ErrorFatType\r
---*/\r
 {\r
-  BYTE    DiskPartition[0x200];\r
-  BYTE    DiskPartitionBackup[0x200];\r
-  HANDLE  DiskHandle;\r
-  HANDLE  FileHandle;\r
-  DWORD   BytesReturn;\r
-  DWORD   DbrOffset;\r
-  INT     DrvNumOffset;\r
-\r
-  DiskHandle = CreateFile (\r
-                 DiskName, \r
-                 GENERIC_READ | GENERIC_WRITE, \r
-                 FILE_SHARE_READ, \r
-                 NULL, \r
-                 OPEN_EXISTING, \r
-                 FILE_ATTRIBUTE_NORMAL, \r
-                 NULL\r
-                 );\r
-  if (DiskHandle == INVALID_HANDLE_VALUE) {\r
-    return ErrorFileCreate;\r
+  DWORD  OpenFlag;\r
+\r
+  OpenFlag = OPEN_ALWAYS;\r
+  if (PathInfo->Input || PathInfo->Type != PathFile) {\r
+    OpenFlag = OPEN_EXISTING;\r
   }\r
 \r
-  FileHandle = CreateFile (\r
-                 FileName,\r
-                 GENERIC_READ | GENERIC_WRITE,\r
-                 0,\r
-                 NULL,\r
-                 OPEN_ALWAYS,\r
-                 FILE_ATTRIBUTE_NORMAL,\r
-                 NULL\r
-                 );\r
-  if (FileHandle == INVALID_HANDLE_VALUE) {\r
+  *FileHandle = CreateFile(\r
+                   PathInfo->PhysicalPath,\r
+                   GENERIC_READ | GENERIC_WRITE, \r
+                   FILE_SHARE_READ, \r
+                   NULL, \r
+                   OpenFlag, \r
+                   FILE_ATTRIBUTE_NORMAL, \r
+                   NULL\r
+                   );\r
+  if (*FileHandle == INVALID_HANDLE_VALUE) {\r
     return ErrorFileCreate;\r
   }\r
 \r
-  DbrOffset = 0;\r
-  //\r
-  // Skip potential MBR for Ide & USB disk\r
-  //\r
-  if ((PatchType == PatchTypeIde) || (PatchType == PatchTypeUsb)) {\r
-    //\r
-    // Even user just wants to process MBR, we get offset of boot sector here to validate the disk\r
-    //  if disk have MBR, DbrOffset should be greater than 0\r
-    //\r
-    DbrOffset = GetBootSectorOffset (DiskHandle, WriteToDisk, PatchType);\r
-\r
+  if ((PathInfo->Type == PathIde) || (PathInfo->Type == PathUsb)){\r
+    *DbrOffset = GetBootSectorOffset (*FileHandle, PathInfo);\r
     if (!ProcessMbr) {\r
       //\r
       // 1. Process boot sector, set file pointer to the beginning of boot sector\r
       //\r
-      SetFilePointer (DiskHandle, DbrOffset * 0x200, NULL, FILE_BEGIN);\r
-    } else if(DbrOffset == 0) {\r
+      SetFilePointer (*FileHandle, *DbrOffset * 0x200, NULL, FILE_BEGIN);\r
+    } else if(*DbrOffset == 0) {\r
       //\r
       // If user want to process Mbr, but no Mbr exists, simply return FALSE\r
       //\r
@@ -428,44 +412,65 @@ Return:
       //\r
       // 2. Process MBR, set file pointer to 0\r
       //\r
-      SetFilePointer (DiskHandle, 0, NULL, FILE_BEGIN);\r
+      SetFilePointer (*FileHandle, 0, NULL, FILE_BEGIN);\r
     }\r
   }\r
 \r
+  return ErrorSuccess;\r
+}\r
+\r
+/**\r
+  Writing or reading boot sector or MBR according to the argument. \r
+   \r
+  @param InputInfo PATH_INFO instance for input path\r
+  @param OutputInfo PATH_INFO instance for output path\r
+  @param ProcessMbr TRUE is to process MBR, otherwise, processing boot sector\r
+  \r
+  @return ERROR_STATUS\r
+ **/\r
+ERROR_STATUS\r
+ProcessBsOrMbr (\r
+  PATH_INFO     *InputInfo,\r
+  PATH_INFO     *OutputInfo,\r
+  BOOL         ProcessMbr\r
+  )\r
+{\r
+  BYTE              DiskPartition[0x200] = {0};\r
+  BYTE              DiskPartitionBackup[0x200] = {0};\r
+  DWORD             BytesReturn;\r
+  DWORD             DbrOffset;\r
+  INT               DrvNumOffset;\r
+  HANDLE            InputHandle;\r
+  HANDLE            OutputHandle;\r
+  BOOL              WriteToDisk;\r
+  ERROR_STATUS      Status;\r
+  DWORD             InputDbrOffset;\r
+  DWORD             OutputDbrOffset;\r
+\r
   //\r
-  // [File Pointer is pointed to beginning of Mbr or Dbr]\r
+  // Create file Handle and move file Pointer is pointed to beginning of Mbr or Dbr\r
   //\r
-  if (WriteToDisk) {\r
-    //\r
-    // Write\r
-    //\r
-    if (!ReadFile (FileHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
-      return ErrorFileReadWrite;\r
-    }\r
-    if (ProcessMbr) {\r
-      //\r
-      // Use original partition table\r
-      //\r
-      if (!ReadFile (DiskHandle, DiskPartitionBackup, 0x200, &BytesReturn, NULL)) {\r
-        return ErrorFileReadWrite;\r
-      }\r
-      memcpy (DiskPartition + 0x1BE, DiskPartitionBackup + 0x1BE, 0x40);\r
-      SetFilePointer (DiskHandle, 0, NULL, FILE_BEGIN);\r
-    }\r
+  Status =  GetFileHandle(InputInfo, ProcessMbr, &InputHandle, &InputDbrOffset);\r
+  if (Status != ErrorSuccess) {\r
+    return Status;\r
+  }\r
 \r
-    if (!WriteFile (DiskHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
-      return ErrorFileReadWrite;\r
-    }\r
+  //\r
+  // Create file Handle and move file Pointer is pointed to beginning of Mbr or Dbr\r
+  //\r
+  Status = GetFileHandle(OutputInfo, ProcessMbr, &OutputHandle, &OutputDbrOffset);\r
+  if (Status != ErrorSuccess) {\r
+    return Status;\r
+  }\r
 \r
-  } else {\r
-    //\r
-    // Read\r
-    //\r
-    if (!ReadFile (DiskHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
-      return ErrorFileReadWrite;\r
-    }\r
+  //\r
+  // Read boot sector from source disk/file\r
+  // \r
+  if (!ReadFile (InputHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
+    return ErrorFileReadWrite;\r
+  }\r
 \r
-    if (PatchType == PatchTypeUsb) {\r
+  if (InputInfo->Type == PathUsb) {\r
       // Manually set BS_DrvNum to 0x80 as window's format.exe has a bug which will clear this field discarding USB disk's MBR. \r
       // offset of BS_DrvNum is 0x24 for FAT12/16\r
       //                        0x40 for FAT32\r
@@ -478,22 +483,40 @@ Return:
       // Some legacy BIOS require 0x80 discarding MBR.\r
       // Question left here: is it needed to check Mbr before set 0x80?\r
       //\r
-      DiskPartition[DrvNumOffset] = ((DbrOffset > 0) ? 0x80 : 0);\r
+      DiskPartition[DrvNumOffset] = ((InputDbrOffset > 0) ? 0x80 : 0);\r
   }\r
 \r
-\r
-    if (PatchType == PatchTypeIde) {\r
+  if (InputInfo->Type == PathIde) {\r
       //\r
       // Patch LBAOffsetForBootSector\r
       //\r
-      *(DWORD *)&DiskPartition [BOOT_SECTOR_LBA_OFFSET] = DbrOffset;\r
-    }\r
-    if (!WriteFile (FileHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
-      return ErrorFileReadWrite;\r
+      *(DWORD *)&DiskPartition [BOOT_SECTOR_LBA_OFFSET] = InputDbrOffset;\r
+  }\r
+\r
+  if (OutputInfo->Type != PathFile) {\r
+    if (ProcessMbr) {\r
+      //\r
+      // Use original partition table\r
+      //\r
+      if (!ReadFile (OutputHandle, DiskPartitionBackup, 0x200, &BytesReturn, NULL)) {\r
+        return ErrorFileReadWrite;\r
+      }\r
+      memcpy (DiskPartition + 0x1BE, DiskPartitionBackup + 0x1BE, 0x40);\r
+      SetFilePointer (OutputHandle, 0, NULL, FILE_BEGIN);\r
+\r
     }\r
   }\r
-  CloseHandle (FileHandle);\r
-  CloseHandle (DiskHandle);\r
+\r
+  //\r
+  // Write boot sector to taget disk/file\r
+  // \r
+  if (!WriteFile (OutputHandle, DiskPartition, 0x200, &BytesReturn, NULL)) {\r
+    return ErrorFileReadWrite;\r
+  }\r
+\r
+  CloseHandle (InputHandle);\r
+  CloseHandle (OutputHandle);\r
+\r
   return ErrorSuccess;\r
 }\r
 \r
@@ -542,41 +565,74 @@ PrintUsage (
 }\r
 \r
 /**\r
-  Judget the type of file path and valid it.\r
-  \r
-  @param  FilePath  the string of file path, maybe a disk volume or file\r
-  \r
-  @retval -1  Invalid Path\r
-  @retval  0  Path is valid and is disk volume.\r
-  @retval  1  Path is valid and is file path.\r
-  \r
+  Get path information, including physical path for windows platform.\r
+\r
+  @param PathInfo   Point to PATH_INFO structure.\r
+\r
+  @return whether path is valid.\r
 **/\r
-INT\r
-ValidFilePath (\r
-  CHAR *FilePath\r
+ERROR_STATUS\r
+GetPathInfo (\r
+  PATH_INFO   *PathInfo\r
   )\r
 {\r
-  INT   retval;\r
-  FILE  *f;\r
-  \r
-  if (FilePath == NULL) {\r
-    return -1;\r
-  }\r
-  \r
-  if (IsLetter(FilePath[0]) && (FilePath[1] == ':') && (FilePath[2] == '\0')) {\r
-    fprintf (stderr, "error E2003: File was not provided!\n");\r
-    return 0;\r
+  DRIVE_INFO  DriveInfo;\r
+  CHAR        VolumeLetter;\r
+  CHAR        DiskPathTemplate[]   = "\\\\.\\PHYSICALDRIVE%u";\r
+  CHAR        FloppyPathTemplate[] = "\\\\.\\%c:";\r
+  FILE        *f;\r
+\r
+  //\r
+  // If path is disk path\r
+  //\r
+  if (IsLetter(PathInfo->Path[0]) && (PathInfo->Path[1] == ':') && (PathInfo->Path[2] == '\0')) {\r
+    VolumeLetter = PathInfo->Path[0];\r
+    if ((VolumeLetter == 'A') || (VolumeLetter == 'a') || \r
+        (VolumeLetter == 'B') || (VolumeLetter == 'b')) {\r
+      PathInfo->Type = PathFloppy;\r
+      sprintf (PathInfo->PhysicalPath, FloppyPathTemplate, VolumeLetter);\r
+      return ErrorSuccess;\r
+    }\r
+\r
+    if (!GetDriveInfo(VolumeLetter, &DriveInfo)) {\r
+      fprintf (stderr, "ERROR: GetDriveInfo - 0x%x\n", GetLastError ());\r
+      return ErrorPath;\r
+    }\r
+\r
+    if (!PathInfo->Input && (DriveInfo.DriveType->Type == DRIVE_FIXED)) {\r
+      fprintf (stderr, "ERROR: Could patch own IDE disk!\n");\r
+      return ErrorPath;\r
+    }\r
+\r
+    sprintf(PathInfo->PhysicalPath, DiskPathTemplate, DriveInfo.DiskNumber);\r
+    if (DriveInfo.DriveType->Type == DRIVE_REMOVABLE) {\r
+      PathInfo->Type = PathUsb;\r
+    } else if (DriveInfo.DriveType->Type == DRIVE_FIXED) {\r
+      PathInfo->Type = PathIde;\r
+    } else {\r
+      fprintf (stderr, "ERROR, Invalid disk path - %s", PathInfo->Path);\r
+      return ErrorPath;\r
+    }\r
+\r
+       return ErrorSuccess;\r
   } \r
-  \r
-  f = fopen (FilePath, "r");\r
-  if (f == NULL) {\r
-    fprintf (stderr, "error E2003: File was not provided!\n");\r
-    return -1;\r
+\r
+  PathInfo->Type = PathFile;\r
+  if (PathInfo->Input) {\r
+    //\r
+    // If path is file path, check whether file is valid.\r
+    //\r
+    f = fopen (PathInfo->Path, "r");\r
+    if (f == NULL) {\r
+      fprintf (stderr, "error E2003: File was not provided!\n");\r
+      return ErrorPath;\r
+    }  \r
   }\r
-  \r
-  fclose(f);\r
-  return 1;\r
-}\r
+  PathInfo->Type = PathFile;\r
+  strcpy(PathInfo->PhysicalPath, PathInfo->Path);\r
+\r
+  return ErrorSuccess;\r
+}    \r
 \r
 INT\r
 main (\r
@@ -587,33 +643,21 @@ main (
   CHAR          *AppName;\r
   INT           Index;\r
   BOOL          ProcessMbr;\r
-  CHAR          VolumeLetter;\r
-  CHAR          *OutputFilePath;\r
-  CHAR          *InputFilePath;\r
-  BOOL          WriteToDisk;\r
-  DRIVE_INFO    DriveInfo;\r
-  PATCH_TYPE    PatchType;\r
   ERROR_STATUS  Status;\r
-\r
-  CHAR        FloppyPathTemplate[] = "\\\\.\\%c:";\r
-  CHAR        DiskPathTemplate[]   = "\\\\.\\PHYSICALDRIVE%u";\r
-  CHAR        DiskPath[MAX_PATH];\r
+  PATH_INFO     InputPathInfo = {0};\r
+  PATH_INFO     OutputPathInfo = {0};\r
 \r
   AppName = *argv;\r
   argv ++;\r
   argc --;\r
   \r
   ProcessMbr    = FALSE;\r
-  WriteToDisk   = TRUE;\r
-  VolumeLetter  = 0;\r
 \r
   if (argc == 0) {\r
     PrintUsage();\r
     return 0;\r
   }\r
-\r
-  InputFilePath = NULL;\r
-    \r
+   \r
   //\r
   // Parse command line\r
   //\r
@@ -622,16 +666,17 @@ main (
       ListDrive ();\r
       return 0;\r
     }\r
-    else if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
+    else if ((stricmp (argv[Index], "-m") == 0) || (stricmp (argv[Index], "--mbr") == 0)) {\r
       ProcessMbr = TRUE;\r
     }\r
     else if ((stricmp (argv[Index], "-i") == 0) || (stricmp (argv[Index], "--input") == 0)) {\r
-      InputFilePath = argv[Index + 1];\r
-         WriteToDisk = FALSE;\r
+      InputPathInfo.Path  = argv[Index + 1];\r
+      InputPathInfo.Input = TRUE;\r
       ++Index;\r
     }\r
     else if ((stricmp (argv[Index], "-o") == 0) || (stricmp (argv[Index], "--output") == 0)) {\r
-      OutputFilePath = argv[Index + 1];\r
+      OutputPathInfo.Path  = argv[Index + 1];\r
+      OutputPathInfo.Input = FALSE;\r
       ++Index;\r
     }\r
     else {\r
@@ -640,78 +685,22 @@ main (
     }\r
   }\r
 \r
-  PatchType = PatchTypeUnknown;\r
-  \r
-  if (ValidFilePath (InputFilePath) == 0) {\r
-    VolumeLetter = InputFilePath[0];\r
-    \r
-    if (VolumeLetter == 0) {\r
-      fprintf (stderr, "error E2003: Volume was not provided!\n");\r
-      return 1;\r
-    }    \r
-  } else if (ValidFilePath(InputFilePath) == 1) {\r
-    strcpy (DiskPath, InputFilePath);\r
-    // \r
-    // file simulated floppy\r
-    //\r
-    PatchType = PatchTypeFloppy;\r
-  }\r
-  \r
-  //if (ValidFilePath(OutputFilePath) != 1) {\r
-  //  fprintf (stderr, "error E2003: File was not provided!\n");\r
-  //  return 1;\r
-  //}\r
-    \r
-  if ((VolumeLetter == 'A') || (VolumeLetter == 'a') || \r
-      (VolumeLetter == 'B') || (VolumeLetter == 'b')\r
-      ) {\r
-    //\r
-    // Floppy\r
-    //\r
-    sprintf (DiskPath, FloppyPathTemplate, VolumeLetter);\r
-    PatchType = PatchTypeFloppy;\r
-  }\r
-  else if (PatchType != PatchTypeFloppy) {\r
-    //\r
-    // Hard/USB disk\r
-    //\r
-    if (!GetDriveInfo (VolumeLetter, &DriveInfo)) {\r
-      fprintf (stderr, "error E2004: GetDriveInfo - 0x%x\n", GetLastError ());\r
-      return 1;\r
-    }\r
-\r
-    //\r
-    // Shouldn't patch my own hard disk, but can read it.\r
-    // very safe then:)\r
-    //\r
-    if (DriveInfo.DriveType->Type == DRIVE_FIXED && WriteToDisk) {\r
-      fprintf (stderr, "error E0002: Error writing to local harddisk - permission denied!\n");\r
-      return 1;\r
-    }\r
-    \r
-    sprintf (DiskPath, DiskPathTemplate, DriveInfo.DiskNumber);\r
-    if (DriveInfo.DriveType->Type == DRIVE_REMOVABLE) {\r
-      PatchType = PatchTypeUsb;\r
-    }\r
-    else if (DriveInfo.DriveType->Type == DRIVE_FIXED) {\r
-      PatchType = PatchTypeIde;\r
-    }\r
-  }\r
 \r
-  if (PatchType == PatchTypeUnknown) {\r
-    fprintf (stderr, "error E3002: PatchType unknown!\n");\r
+  if ((GetPathInfo(&InputPathInfo)  != ErrorSuccess) ||\r
+      (GetPathInfo(&OutputPathInfo) != ErrorSuccess)) {\r
     return 1;\r
   }\r
-\r
+  \r
   //\r
   // Process DBR (Patch or Read)\r
   //\r
-  Status = ProcessBsOrMbr (DiskPath, OutputFilePath, WriteToDisk, PatchType, ProcessMbr);\r
+  Status = ProcessBsOrMbr (&InputPathInfo, &OutputPathInfo, ProcessMbr);\r
+\r
   if (Status == ErrorSuccess) {\r
     fprintf (\r
       stdout, \r
       "%s %s: successful!\n", \r
-      WriteToDisk ? "Write" : "Read", \r
+      (OutputPathInfo.Type != PathFile) ? "Write" : "Read", \r
       ProcessMbr ? "MBR" : "DBR"\r
       );\r
     return 0;\r
@@ -720,7 +709,7 @@ main (
       stderr, \r
       "%s: %s %s: failed - %s (LastError: 0x%x)!\n",\r
       (Status == ErrorNoMbr) ? "WARNING" : "ERROR",\r
-      WriteToDisk ? "Write" : "Read", \r
+      (OutputPathInfo.Type != PathFile) ? "Write" : "Read", \r
       ProcessMbr ? "MBR" : "DBR", \r
       ErrorStatusDesc[Status],\r
       GetLastError ()\r