]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/EfildrImage/efildrimage.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / EfildrImage / efildrimage.c
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/EfildrImage/efildrimage.c b/EdkCompatibilityPkg/Sample/Tools/Source/EfildrImage/efildrimage.c
new file mode 100644 (file)
index 0000000..c072dd7
--- /dev/null
@@ -0,0 +1,188 @@
+/*++\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 <windows.h>\r
+#include <stdio.h>\r
+#include "Tiano.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
+\r
+VOID\r
+Usage (\r
+  VOID\r
+  )\r
+{\r
+  printf ("Usage: EfiLdrImage OutImage LoaderImage PeImage1 PeImage2 ... PeImageN");\r
+  exit (1);\r
+}\r
+\r
+ULONG\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
+  ULONG : file size of input file\r
+--*/\r
+{\r
+  ULONG           filesize, offset, length;\r
+  UCHAR           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
+  ULONG         i;\r
+  ULONG         filesize;\r
+  FILE          *fpIn, *fpOut;\r
+  EFILDR_HEADER EfiLdrHeader;\r
+  EFILDR_IMAGE  EfiLdrImage[MAX_PE_IMAGES];\r
+\r
+  if (argc < 4) {\r
+    Usage();\r
+  }\r
+\r
+  //\r
+  // Open output file for write\r
+  //\r
+  fpOut = fopen(argv[1], "w+b");\r
+  if (!fpOut) {\r
+    printf ("efildrimage: Could not open output file %s\n", argv[1]);\r
+    exit(1);\r
+  }\r
+\r
+  memset (&EfiLdrHeader, 0, sizeof (EfiLdrHeader));\r
+  memset (&EfiLdrImage, 0, sizeof (EFILDR_IMAGE) * (argc - 2));\r
+\r
+  memcpy (&EfiLdrHeader.Signature, "EFIL", 4);\r
+  EfiLdrHeader.FileLength = sizeof(EFILDR_HEADER) + sizeof(EFILDR_IMAGE)*(argc-2);\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=2;i<(ULONG)argc;i++) {\r
+    //\r
+    // Copy the content of PeImage file to output file\r
+    //\r
+    fpIn = fopen (argv[i], "rb");\r
+    if (!fpIn) {\r
+      printf ("efildrimage: Could not open input file %s\n", argv[i-2]);\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-2].Offset = EfiLdrHeader.FileLength;\r
+    EfiLdrImage[i-2].Length = filesize;\r
+    strncpy (EfiLdrImage[i-2].FileName, argv[i], sizeof (EfiLdrImage[i-2].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)*(argc-2), 1, fpOut);\r
+\r
+  fclose (fpOut);\r
+  printf ("Created %s\n", argv[1]);\r
+  return 0;\r
+}\r
+\r