--- /dev/null
+/*++\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