check in EfiLdrImage code and documents.
authorjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 13 Aug 2007 09:17:47 +0000 (09:17 +0000)
committerjlin16 <jlin16@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 13 Aug 2007 09:17:47 +0000 (09:17 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@560 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/EfiLdrImage/EfiLdrImage.c [new file with mode: 0644]
Source/C/EfiLdrImage/Makefile [new file with mode: 0644]
UserManuals/EfiLdrImage_HLD.doc [new file with mode: 0644]
UserManuals/EfiLdrImage_Utility_Users_Guide.doc [new file with mode: 0644]

diff --git a/Source/C/EfiLdrImage/EfiLdrImage.c b/Source/C/EfiLdrImage/EfiLdrImage.c
new file mode 100644 (file)
index 0000000..6151aaf
--- /dev/null
@@ -0,0 +1,314 @@
+/*++\r
+\r
+Copyright 2006 - 2007, 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
+  efildrimage.c\r
+\r
+Abstract:\r
+\r
+  Creates and EFILDR image.\r
+  This tool combines several PE Image files together using following format denoted as EBNF:\r
+  FILE := EFILDR_HEADER\r
+          EFILDR_IMAGE +\r
+          <PeImageFileContent> +\r
+  The order of EFILDR_IMAGE is same as the order of placing PeImageFileContent.\r
+\r
+Revision History\r
+\r
+--*/\r
+\r
+\r
+#include <stdio.h>\r
+#include "CommonLib.h"\r
+#include "EfiUtilityMsgs.h"\r
+\r
+#define MAX_PE_IMAGES                  63\r
+#define FILE_TYPE_FIXED_LOADER         0\r
+#define FILE_TYPE_RELOCATABLE_PE_IMAGE 1\r
+\r
+typedef struct {\r
+  UINT32 CheckSum;\r
+  UINT32 Offset;\r
+  UINT32 Length;\r
+  UINT8  FileName[52];\r
+} EFILDR_IMAGE;\r
+\r
+typedef struct {          \r
+  UINT32       Signature;     \r
+  UINT32       HeaderCheckSum;\r
+  UINT32       FileLength;\r
+  UINT32       NumberOfImages;\r
+} EFILDR_HEADER;\r
+\r
+//\r
+// Utility Name\r
+//\r
+#define UTILITY_NAME  "EfiLdrImage"\r
+\r
+//\r
+// Utility version information\r
+//\r
+#define UTILITY_MAJOR_VERSION 0\r
+#define UTILITY_MINOR_VERSION 1\r
+\r
+void\r
+Version (\r
+  void\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Displays the standard utility information to SDTOUT\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  printf ("%s v%d.%d -Utility to break a file into two pieces at the request offset.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
+  printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
+}\r
+\r
+VOID\r
+Usage (\r
+  VOID\r
+  )\r
+{\r
+  printf ("Usage: EfiLdrImage -o OutImage LoaderImage PeImage1 PeImage2 ... PeImageN");\r
+  exit (1);\r
+}\r
+\r
+EFI_STATUS\r
+CountVerboseLevel (\r
+  IN CONST CHAR8* VerboseLevelString,\r
+  IN CONST UINT64 Length,\r
+  OUT UINT64 *ReturnValue\r
+)\r
+{\r
+  UINT64 i = 0;\r
+  for (;i < Length; ++i) {\r
+    if (VerboseLevelString[i] != 'v' && VerboseLevelString[i] != 'V') {\r
+      return EFI_ABORTED;\r
+    }\r
+    ++(*ReturnValue);\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+UINT64\r
+FCopyFile (\r
+  FILE    *in,\r
+  FILE    *out\r
+  )\r
+/*++\r
+Routine Description:\r
+  Write all the content of input file to output file.\r
+\r
+Arguments:\r
+  in  - input file pointer\r
+  out - output file pointer\r
+\r
+Return:\r
+  UINT64 : file size of input file\r
+--*/\r
+{\r
+  UINT64           filesize, offset, length;\r
+  CHAR8           Buffer[8*1024];\r
+\r
+  fseek (in, 0, SEEK_END);\r
+  filesize = ftell(in);\r
+\r
+  fseek (in, 0, SEEK_SET);\r
+\r
+  offset = 0;\r
+  while (offset < filesize)  {\r
+    length = sizeof(Buffer);\r
+    if (filesize-offset < length) {\r
+      length = filesize-offset;\r
+    }\r
+\r
+    fread (Buffer, length, 1, in);\r
+    fwrite (Buffer, length, 1, out);\r
+    offset += length;\r
+  }\r
+\r
+  return filesize;\r
+}\r
+\r
+\r
+int\r
+main (\r
+  int argc,\r
+  char *argv[]\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+\r
+Arguments:\r
+\r
+\r
+Returns:\r
+\r
+\r
+--*/\r
+{\r
+  UINT64         i;\r
+  UINT64         filesize;\r
+  FILE          *fpIn, *fpOut;\r
+  EFILDR_HEADER EfiLdrHeader;\r
+  EFILDR_IMAGE  EfiLdrImage[MAX_PE_IMAGES];\r
+  CHAR8* OutputFileName = NULL;\r
+  CHAR8* InputFileNames[MAX_PE_IMAGES + 1];\r
+  UINT8 InputFileCount = 0;\r
+  BOOLEAN QuietFlag = FALSE;\r
+  UINT64        DebugLevel = 0;\r
+  UINT64        VerboseLevel = 0;\r
+  EFI_STATUS Status = EFI_SUCCESS;\r
+\r
+  if (argc < 4) {\r
+    Usage();\r
+    return STATUS_ERROR;\r
+  }\r
+  \r
+  argc --;\r
+  argv ++;\r
+\r
+  if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
+    Usage();\r
+    return STATUS_SUCCESS;    \r
+  }\r
+\r
+  if (stricmp (argv[0], "--version") == 0) {\r
+    Version();\r
+    return STATUS_SUCCESS;    \r
+  }\r
+\r
+  while (argc > 0) {\r
+   \r
+    if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--output") == 0)) {\r
+      OutputFileName = argv[1];\r
+      if (OutputFileName == NULL) {\r
+        Error (NULL, 0, 0, "NO Output file specified.", NULL);\r
+        return STATUS_ERROR;\r
+      }\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+    \r
+    if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
+      QuietFlag = TRUE;\r
+      argc --;\r
+      argv ++;\r
+      continue; \r
+    }\r
+    \r
+    if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) {\r
+      VerboseLevel = 1;\r
+      if (strlen(argv[0]) > 2) {\r
+        Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel);\r
+        if (EFI_ERROR (Status)) {\r
+          Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);\r
+          return STATUS_ERROR;        \r
+        }\r
+      }\r
+      \r
+      argc --;\r
+      argv ++;\r
+      continue; \r
+    }\r
+    \r
+    if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {\r
+      Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel);\r
+      if (EFI_ERROR (Status)) {\r
+        Error (NULL, 0, 0, "Input debug level is not one valid integrator.", NULL);\r
+        return STATUS_ERROR;        \r
+      }\r
+      argc -= 2;\r
+      argv += 2;\r
+      continue; \r
+    }\r
+    //\r
+    // Don't recognize the paramter.\r
+    //\r
+    InputFileNames[InputFileCount] = argv[0];\r
+    InputFileCount++;\r
+    argc--;\r
+    argv++;\r
+  }\r
+\r
+  //\r
+  // Open output file for write\r
+  //\r
+  fpOut = fopen(OutputFileName, "w+b");\r
+  if (!fpOut) {\r
+    printf ("efildrimage: Could not open output file %s\n", OutputFileName);\r
+    exit(1);\r
+  }\r
+\r
+  memset (&EfiLdrHeader, 0, sizeof (EfiLdrHeader));\r
+  memset (&EfiLdrImage, 0, sizeof (EFILDR_IMAGE) * (InputFileCount+1));\r
+\r
+  memcpy (&EfiLdrHeader.Signature, "EFIL", 4);\r
+  EfiLdrHeader.FileLength = sizeof(EFILDR_HEADER) + sizeof(EFILDR_IMAGE)*(InputFileCount+1);\r
+\r
+  //\r
+  // Skip the file header first\r
+  //\r
+  fseek (fpOut, EfiLdrHeader.FileLength, SEEK_SET);\r
+\r
+  //\r
+  // copy all the input files to the output file\r
+  //\r
+  for(i=0;i<= InputFileCount;i++) {\r
+    //\r
+    // Copy the content of PeImage file to output file\r
+    //\r
+    fpIn = fopen (InputFileNames[i], "rb");\r
+    if (!fpIn) {\r
+      printf ("efildrimage: Could not open input file %s\n", InputFileNames[i]);\r
+      exit(1);\r
+    }\r
+    filesize = FCopyFile (fpIn, fpOut);\r
+    fclose(fpIn);\r
+\r
+    //\r
+    //  And in the same time update the EfiLdrHeader and EfiLdrImage array\r
+    //\r
+    EfiLdrImage[i].Offset = EfiLdrHeader.FileLength;\r
+    EfiLdrImage[i].Length = filesize;\r
+    strncpy (EfiLdrImage[i].FileName, InputFileNames[i], sizeof (EfiLdrImage[i].FileName) - 1);\r
+    EfiLdrHeader.FileLength += filesize;\r
+    EfiLdrHeader.NumberOfImages++;\r
+  }\r
+\r
+  //\r
+  // Write the image header to the output file finally\r
+  //\r
+  fseek (fpOut, 0, SEEK_SET);\r
+  fwrite (&EfiLdrHeader, sizeof(EFILDR_HEADER)        , 1, fpOut);\r
+  fwrite (&EfiLdrImage , sizeof(EFILDR_IMAGE)*(InputFileCount+1), 1, fpOut);\r
+\r
+  fclose (fpOut);\r
+  printf ("Created %s\n", OutputFileName);\r
+  return 0;\r
+}\r
+\r
diff --git a/Source/C/EfiLdrImage/Makefile b/Source/C/EfiLdrImage/Makefile
new file mode 100644 (file)
index 0000000..894b887
--- /dev/null
@@ -0,0 +1,10 @@
+!INCLUDE ..\MSmakefile.common
+
+APPNAME = EfiLdrImage
+
+LIBS = Common.lib
+
+OBJECTS = EfiLdrImage.obj
+
+!INCLUDE ..\MSmakefile.app
+
diff --git a/UserManuals/EfiLdrImage_HLD.doc b/UserManuals/EfiLdrImage_HLD.doc
new file mode 100644 (file)
index 0000000..b229d26
Binary files /dev/null and b/UserManuals/EfiLdrImage_HLD.doc differ
diff --git a/UserManuals/EfiLdrImage_Utility_Users_Guide.doc b/UserManuals/EfiLdrImage_Utility_Users_Guide.doc
new file mode 100644 (file)
index 0000000..0853b9f
Binary files /dev/null and b/UserManuals/EfiLdrImage_Utility_Users_Guide.doc differ