]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/GenCrc32/GenCrc32.c
bc245fc94e9f7f5db3d826c99f9c3e4ab609f0d4
3 Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 Calculate Crc32 value and Verify Crc32 value for input data.
26 #include "EfiUtilityMsgs.h"
27 #include "CommonLib.h"
30 #define UTILITY_NAME "GenCrc32"
31 #define UTILITY_MAJOR_VERSION 0
32 #define UTILITY_MINOR_VERSION 2
35 #define CRC32_ENCODE 1
36 #define CRC32_DECODE 2
46 Displays the standard utility information to SDTOUT
58 fprintf (stdout
, "%s Version %d.%d %s \n", UTILITY_NAME
, UTILITY_MAJOR_VERSION
, UTILITY_MINOR_VERSION
, __BUILD_VERSION
);
69 Displays the utility usage syntax to STDOUT
84 fprintf (stdout
, "Usage: GenCrc32 -e|-d [options] <input_file>\n\n");
87 // Copyright declaration
89 fprintf (stdout
, "Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.\n\n");
94 fprintf (stdout
, "optional arguments:\n");
95 fprintf (stdout
, " -h, --help Show this help message and exit\n");
96 fprintf (stdout
, " --version Show program's version number and exit\n");
97 fprintf (stdout
, " --debug [DEBUG] Output DEBUG statements, where DEBUG_LEVEL is 0 (min)\n\
99 fprintf (stdout
, " -v, --verbose Print informational statements\n");
100 fprintf (stdout
, " -q, --quiet Returns the exit code, error messages will be\n\
102 fprintf (stdout
, " -s, --silent Returns only the exit code; informational and error\n\
103 messages are not displayed\n");
104 fprintf (stdout
, " -e, --encode Calculate CRC32 value for the input file\n");
105 fprintf (stdout
, " -d, --decode Verify CRC32 value for the input file\n");
106 fprintf (stdout
, " -o OUTPUT_FILENAME, --output OUTPUT_FILENAME\n\
107 Output file name\n");
108 fprintf (stdout
, " --sfo Reserved for future use\n");
125 argc - Number of command line parameters.
126 argv - Array of pointers to parameter strings.
129 STATUS_SUCCESS - Utility exits successfully.
130 STATUS_ERROR - Some error occurred during execution.
135 CHAR8
*OutputFileName
;
136 CHAR8
*InputFileName
;
146 // Init local variables
149 Status
= EFI_SUCCESS
;
150 InputFileName
= NULL
;
151 OutputFileName
= NULL
;
152 FileAction
= CRC32_NULL
;
158 SetUtilityName (UTILITY_NAME
);
161 Error (NULL
, 0, 1001, "Missing options", "no options input");
167 // Parse command line
172 if ((stricmp (argv
[0], "-h") == 0) || (stricmp (argv
[0], "--help") == 0)) {
174 return STATUS_SUCCESS
;
177 if (stricmp (argv
[0], "--version") == 0) {
179 return STATUS_SUCCESS
;
183 if ((stricmp (argv
[0], "-o") == 0) || (stricmp (argv
[0], "--output") == 0)) {
184 if (argv
[1] == NULL
|| argv
[1][0] == '-') {
185 Error (NULL
, 0, 1003, "Invalid option value", "Output File name is missing for -o option");
188 OutputFileName
= argv
[1];
194 if ((stricmp (argv
[0], "-e") == 0) || (stricmp (argv
[0], "--encode") == 0)) {
195 FileAction
= CRC32_ENCODE
;
201 if ((stricmp (argv
[0], "-d") == 0) || (stricmp (argv
[0], "--decode") == 0)) {
202 FileAction
= CRC32_DECODE
;
208 if ((stricmp (argv
[0], "-v") == 0) || (stricmp (argv
[0], "--verbose") == 0)) {
209 SetPrintLevel (VERBOSE_LOG_LEVEL
);
210 VerboseMsg ("Verbose output Mode Set!");
216 if ((stricmp (argv
[0], "-q") == 0) || (stricmp (argv
[0], "--quiet") == 0)) {
217 SetPrintLevel (KEY_LOG_LEVEL
);
218 KeyMsg ("Quiet output Mode Set!");
224 if (stricmp (argv
[0], "--debug") == 0) {
225 Status
= AsciiStringToUint64 (argv
[1], FALSE
, &LogLevel
);
226 if (EFI_ERROR (Status
)) {
227 Error (NULL
, 0, 1003, "Invalid option value", "%s = %s", argv
[0], argv
[1]);
231 Error (NULL
, 0, 1003, "Invalid option value", "Debug Level range is 0-9, current input level is %d", (int) LogLevel
);
234 SetPrintLevel (LogLevel
);
235 DebugMsg (NULL
, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv
[1]);
241 if (argv
[0][0] == '-') {
242 Error (NULL
, 0, 1000, "Unknown option", argv
[0]);
247 // Get Input file file name.
249 InputFileName
= argv
[0];
254 VerboseMsg ("%s tool start.", UTILITY_NAME
);
257 // Check Input paramters
259 if (FileAction
== CRC32_NULL
) {
260 Error (NULL
, 0, 1001, "Missing option", "either the encode or the decode option must be specified!");
262 } else if (FileAction
== CRC32_ENCODE
) {
263 VerboseMsg ("File will be encoded by Crc32");
264 } else if (FileAction
== CRC32_DECODE
) {
265 VerboseMsg ("File will be decoded by Crc32");
268 if (InputFileName
== NULL
) {
269 Error (NULL
, 0, 1001, "Missing option", "Input files are not specified");
272 VerboseMsg ("Input file name is %s", InputFileName
);
275 if (OutputFileName
== NULL
) {
276 Error (NULL
, 0, 1001, "Missing option", "Output file are not specified");
279 VerboseMsg ("Output file name is %s", OutputFileName
);
283 // Open Input file and read file data.
285 InFile
= fopen (LongFilePath (InputFileName
), "rb");
286 if (InFile
== NULL
) {
287 Error (NULL
, 0, 0001, "Error opening file", InputFileName
);
291 fseek (InFile
, 0, SEEK_END
);
292 FileSize
= ftell (InFile
);
293 fseek (InFile
, 0, SEEK_SET
);
295 FileBuffer
= (UINT8
*) malloc (FileSize
);
296 if (FileBuffer
== NULL
) {
297 Error (NULL
, 0, 4001, "Resource", "memory cannot be allcoated!");
301 fread (FileBuffer
, 1, FileSize
, InFile
);
303 VerboseMsg ("the size of the input file is %u bytes", (unsigned) FileSize
);
308 OutFile
= fopen (LongFilePath (OutputFileName
), "wb");
309 if (OutFile
== NULL
) {
310 Error (NULL
, 0, 0001, "Error opening file", OutputFileName
);
315 // Calculate Crc32 value
317 if (FileAction
== CRC32_ENCODE
) {
318 Status
= CalculateCrc32 (FileBuffer
, FileSize
, &Crc32Value
);
319 if (Status
!= EFI_SUCCESS
) {
320 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
324 // Done, write output file.
326 fwrite (&Crc32Value
, 1, sizeof (Crc32Value
), OutFile
);
327 VerboseMsg ("The calculated CRC32 value is 0x%08x", (unsigned) Crc32Value
);
328 fwrite (FileBuffer
, 1, FileSize
, OutFile
);
329 VerboseMsg ("the size of the encoded file is %u bytes", (unsigned) FileSize
+ sizeof (UINT32
));
332 // Verify Crc32 Value
334 Status
= CalculateCrc32 (FileBuffer
+ sizeof (UINT32
), FileSize
- sizeof (UINT32
), &Crc32Value
);
335 if (Status
!= EFI_SUCCESS
) {
336 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
339 VerboseMsg ("The calculated CRC32 value is 0x%08x and File Crc32 value is 0x%08x", (unsigned) Crc32Value
, (unsigned) (*(UINT32
*)FileBuffer
));
340 if (Crc32Value
!= *(UINT32
*)FileBuffer
) {
341 Error (NULL
, 0, 3000, "Invalid", "CRC32 value of input file is not correct!");
342 Status
= STATUS_ERROR
;
346 // Done, write output file.
348 fwrite (FileBuffer
+ sizeof (UINT32
), 1, FileSize
- sizeof (UINT32
), OutFile
);
349 VerboseMsg ("the size of the decoded file is %u bytes", (unsigned) FileSize
- sizeof (UINT32
));
353 if (FileBuffer
!= NULL
) {
357 if (OutFile
!= NULL
) {
361 VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME
, GetUtilityStatus ());
363 return GetUtilityStatus ();