]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/EfildrImage/efildrimage.c
1) Sync EdkCompatibilityPkg with EDK 1.04. The changes includes:
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / EfildrImage / efildrimage.c
CommitLineData
3eb9473e 1/*++\r
2\r
3Copyright 2006 - 2007, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 efildrimage.c\r
15\r
16Abstract:\r
17\r
18 Creates and EFILDR image.\r
19 This tool combines several PE Image files together using following format denoted as EBNF:\r
20 FILE := EFILDR_HEADER\r
21 EFILDR_IMAGE +\r
22 <PeImageFileContent> +\r
23 The order of EFILDR_IMAGE is same as the order of placing PeImageFileContent.\r
24\r
25Revision History\r
26\r
27--*/\r
28\r
29\r
30#include <windows.h>\r
31#include <stdio.h>\r
32#include "Tiano.h"\r
33\r
34#define MAX_PE_IMAGES 63\r
35#define FILE_TYPE_FIXED_LOADER 0\r
36#define FILE_TYPE_RELOCATABLE_PE_IMAGE 1\r
37\r
38typedef struct {\r
39 UINT32 CheckSum;\r
40 UINT32 Offset;\r
41 UINT32 Length;\r
42 UINT8 FileName[52];\r
43} EFILDR_IMAGE;\r
44\r
45typedef struct { \r
46 UINT32 Signature; \r
47 UINT32 HeaderCheckSum;\r
48 UINT32 FileLength;\r
49 UINT32 NumberOfImages;\r
50} EFILDR_HEADER;\r
51\r
52\r
53\r
54VOID\r
55Usage (\r
56 VOID\r
57 )\r
58{\r
59 printf ("Usage: EfiLdrImage OutImage LoaderImage PeImage1 PeImage2 ... PeImageN");\r
60 exit (1);\r
61}\r
62\r
63ULONG\r
64FCopyFile (\r
65 FILE *in,\r
66 FILE *out\r
67 )\r
68/*++\r
69Routine Description:\r
70 Write all the content of input file to output file.\r
71\r
72Arguments:\r
73 in - input file pointer\r
74 out - output file pointer\r
75\r
76Return:\r
77 ULONG : file size of input file\r
78--*/\r
79{\r
80 ULONG filesize, offset, length;\r
81 UCHAR Buffer[8*1024];\r
82\r
83 fseek (in, 0, SEEK_END);\r
84 filesize = ftell(in);\r
85\r
86 fseek (in, 0, SEEK_SET);\r
87\r
88 offset = 0;\r
89 while (offset < filesize) {\r
90 length = sizeof(Buffer);\r
91 if (filesize-offset < length) {\r
92 length = filesize-offset;\r
93 }\r
94\r
95 fread (Buffer, length, 1, in);\r
96 fwrite (Buffer, length, 1, out);\r
97 offset += length;\r
98 }\r
99\r
100 return filesize;\r
101}\r
102\r
103\r
104int\r
105main (\r
106 int argc,\r
107 char *argv[]\r
108 )\r
109/*++\r
110\r
111Routine Description:\r
112\r
113\r
114Arguments:\r
115\r
116\r
117Returns:\r
118\r
119\r
120--*/\r
121{\r
122 ULONG i;\r
123 ULONG filesize;\r
124 FILE *fpIn, *fpOut;\r
125 EFILDR_HEADER EfiLdrHeader;\r
126 EFILDR_IMAGE EfiLdrImage[MAX_PE_IMAGES];\r
127\r
128 if (argc < 4) {\r
129 Usage();\r
130 }\r
131\r
132 //\r
133 // Open output file for write\r
134 //\r
135 fpOut = fopen(argv[1], "w+b");\r
136 if (!fpOut) {\r
137 printf ("efildrimage: Could not open output file %s\n", argv[1]);\r
138 exit(1);\r
139 }\r
140\r
141 memset (&EfiLdrHeader, 0, sizeof (EfiLdrHeader));\r
142 memset (&EfiLdrImage, 0, sizeof (EFILDR_IMAGE) * (argc - 2));\r
143\r
144 memcpy (&EfiLdrHeader.Signature, "EFIL", 4);\r
145 EfiLdrHeader.FileLength = sizeof(EFILDR_HEADER) + sizeof(EFILDR_IMAGE)*(argc-2);\r
146\r
147 //\r
148 // Skip the file header first\r
149 //\r
150 fseek (fpOut, EfiLdrHeader.FileLength, SEEK_SET);\r
151\r
152 //\r
153 // copy all the input files to the output file\r
154 //\r
155 for(i=2;i<(ULONG)argc;i++) {\r
156 //\r
157 // Copy the content of PeImage file to output file\r
158 //\r
159 fpIn = fopen (argv[i], "rb");\r
160 if (!fpIn) {\r
161 printf ("efildrimage: Could not open input file %s\n", argv[i-2]);\r
162 exit(1);\r
163 }\r
164 filesize = FCopyFile (fpIn, fpOut);\r
165 fclose(fpIn);\r
166\r
167 //\r
168 // And in the same time update the EfiLdrHeader and EfiLdrImage array\r
169 //\r
170 EfiLdrImage[i-2].Offset = EfiLdrHeader.FileLength;\r
171 EfiLdrImage[i-2].Length = filesize;\r
172 strncpy (EfiLdrImage[i-2].FileName, argv[i], sizeof (EfiLdrImage[i-2].FileName) - 1);\r
173 EfiLdrHeader.FileLength += filesize;\r
174 EfiLdrHeader.NumberOfImages++;\r
175 }\r
176\r
177 //\r
178 // Write the image header to the output file finally\r
179 //\r
180 fseek (fpOut, 0, SEEK_SET);\r
181 fwrite (&EfiLdrHeader, sizeof(EFILDR_HEADER) , 1, fpOut);\r
182 fwrite (&EfiLdrImage , sizeof(EFILDR_IMAGE)*(argc-2), 1, fpOut);\r
183\r
184 fclose (fpOut);\r
185 printf ("Created %s\n", argv[1]);\r
186 return 0;\r
187}\r
188\r