+++ /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