]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/C/GenCrc32/GenCrc32.c
3 Copyright (c) 2007 - 2008, Intel Corporation
4 All rights reserved. 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 1
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\n", UTILITY_NAME
, UTILITY_MAJOR_VERSION
, UTILITY_MINOR_VERSION
);
69 Displays the utility usage syntax to STDOUT
84 fprintf (stdout
, "\nUsage: %s -e|-d [options] <input_file>\n\n", UTILITY_NAME
);
87 // Copyright declaration
89 fprintf (stdout
, "Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.\n\n");
94 fprintf (stdout
, "Options:\n");
95 fprintf (stdout
, " -o FileName, --output FileName\n\
96 File will be created to store the ouput content.\n");
97 fprintf (stdout
, " -e, --encode Calculate CRC32 value for the input file.\n");
98 fprintf (stdout
, " -d, --decode Verify CRC32 value for the input file.\n");
99 fprintf (stdout
, " -v, --verbose Turn on verbose output with informational messages.\n");
100 fprintf (stdout
, " -q, --quiet Disable all messages except key message and fatal error\n");
101 fprintf (stdout
, " --debug level Enable debug messages, at input debug level.\n");
102 fprintf (stdout
, " --version Show program's version number and exit.\n");
103 fprintf (stdout
, " -h, --help Show this help message and exit.\n");
119 argc - Number of command line parameters.
120 argv - Array of pointers to parameter strings.
123 STATUS_SUCCESS - Utility exits successfully.
124 STATUS_ERROR - Some error occurred during execution.
129 CHAR8
*OutputFileName
;
130 CHAR8
*InputFileName
;
140 // Init local variables
143 Status
= EFI_SUCCESS
;
144 InputFileName
= NULL
;
145 OutputFileName
= NULL
;
146 FileAction
= CRC32_NULL
;
152 SetUtilityName (UTILITY_NAME
);
155 Error (NULL
, 0, 1001, "Missing options", "no options input");
161 // Parse command line
166 if ((stricmp (argv
[0], "-h") == 0) || (stricmp (argv
[0], "--help") == 0)) {
169 return STATUS_SUCCESS
;
172 if (stricmp (argv
[0], "--version") == 0) {
174 return STATUS_SUCCESS
;
178 if ((stricmp (argv
[0], "-o") == 0) || (stricmp (argv
[0], "--output") == 0)) {
179 if (argv
[1] == NULL
|| argv
[1][0] == '-') {
180 Error (NULL
, 0, 1003, "Invalid option value", "Output File name is missing for -o option");
183 OutputFileName
= argv
[1];
189 if ((stricmp (argv
[0], "-e") == 0) || (stricmp (argv
[0], "--encode") == 0)) {
190 FileAction
= CRC32_ENCODE
;
196 if ((stricmp (argv
[0], "-d") == 0) || (stricmp (argv
[0], "--decode") == 0)) {
197 FileAction
= CRC32_DECODE
;
203 if ((stricmp (argv
[0], "-v") == 0) || (stricmp (argv
[0], "--verbose") == 0)) {
204 SetPrintLevel (VERBOSE_LOG_LEVEL
);
205 VerboseMsg ("Verbose output Mode Set!");
211 if ((stricmp (argv
[0], "-q") == 0) || (stricmp (argv
[0], "--quiet") == 0)) {
212 SetPrintLevel (KEY_LOG_LEVEL
);
213 KeyMsg ("Quiet output Mode Set!");
219 if (stricmp (argv
[0], "--debug") == 0) {
220 Status
= AsciiStringToUint64 (argv
[1], FALSE
, &LogLevel
);
221 if (EFI_ERROR (Status
)) {
222 Error (NULL
, 0, 1003, "Invalid option value", "%s = %s", argv
[0], argv
[1]);
226 Error (NULL
, 0, 1003, "Invalid option value", "Debug Level range is 0-9, current input level is %d", (int) LogLevel
);
229 SetPrintLevel (LogLevel
);
230 DebugMsg (NULL
, 0, 9, "Debug Mode Set", "Debug Output Mode Level %s is set!", argv
[1]);
236 if (argv
[0][0] == '-') {
237 Error (NULL
, 0, 1000, "Unknown option", argv
[0]);
242 // Get Input file file name.
244 InputFileName
= argv
[0];
249 VerboseMsg ("%s tool start.", UTILITY_NAME
);
252 // Check Input paramters
254 if (FileAction
== CRC32_NULL
) {
255 Error (NULL
, 0, 1001, "Missing option", "either the encode or the decode option must be specified!");
257 } else if (FileAction
== CRC32_ENCODE
) {
258 VerboseMsg ("File will be encoded by Crc32");
259 } else if (FileAction
== CRC32_DECODE
) {
260 VerboseMsg ("File will be decoded by Crc32");
263 if (InputFileName
== NULL
) {
264 Error (NULL
, 0, 1001, "Missing option", "Input files are not specified");
267 VerboseMsg ("Input file name is %s", InputFileName
);
270 if (OutputFileName
== NULL
) {
271 Error (NULL
, 0, 1001, "Missing option", "Output file are not specified");
274 VerboseMsg ("Output file name is %s", OutputFileName
);
278 // Open Input file and read file data.
280 InFile
= fopen (InputFileName
, "rb");
281 if (InFile
== NULL
) {
282 Error (NULL
, 0, 0001, "Error opening file", InputFileName
);
286 fseek (InFile
, 0, SEEK_END
);
287 FileSize
= ftell (InFile
);
288 fseek (InFile
, 0, SEEK_SET
);
290 FileBuffer
= (UINT8
*) malloc (FileSize
);
291 if (FileBuffer
== NULL
) {
292 Error (NULL
, 0, 4001, "Resource", "memory cannot be allcoated!");
296 fread (FileBuffer
, 1, FileSize
, InFile
);
298 VerboseMsg ("the size of the input file is %u bytes", (unsigned) FileSize
);
303 OutFile
= fopen (OutputFileName
, "wb");
304 if (OutFile
== NULL
) {
305 Error (NULL
, 0, 0001, "Error opening file", OutputFileName
);
310 // Calculate Crc32 value
312 if (FileAction
== CRC32_ENCODE
) {
313 Status
= CalculateCrc32 (FileBuffer
, FileSize
, &Crc32Value
);
314 if (Status
!= EFI_SUCCESS
) {
315 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
319 // Done, write output file.
321 fwrite (&Crc32Value
, 1, sizeof (Crc32Value
), OutFile
);
322 VerboseMsg ("The calculated CRC32 value is 0x%08x", (unsigned) Crc32Value
);
323 fwrite (FileBuffer
, 1, FileSize
, OutFile
);
324 VerboseMsg ("the size of the encoded file is %u bytes", (unsigned) FileSize
+ sizeof (UINT32
));
327 // Verify Crc32 Value
329 Status
= CalculateCrc32 (FileBuffer
+ sizeof (UINT32
), FileSize
- sizeof (UINT32
), &Crc32Value
);
330 if (Status
!= EFI_SUCCESS
) {
331 Error (NULL
, 0, 3000, "Invalid", "Calculate CRC32 value failed!");
334 VerboseMsg ("The calculated CRC32 value is 0x%08x and File Crc32 value is 0x%08x", (unsigned) Crc32Value
, (unsigned) (*(UINT32
*)FileBuffer
));
335 if (Crc32Value
!= *(UINT32
*)FileBuffer
) {
336 Error (NULL
, 0, 3000, "Invalid", "CRC32 value of input file is not correct!");
337 Status
= STATUS_ERROR
;
341 // Done, write output file.
343 fwrite (FileBuffer
+ sizeof (UINT32
), 1, FileSize
- sizeof (UINT32
), OutFile
);
344 VerboseMsg ("the size of the decoded file is %u bytes", (unsigned) FileSize
- sizeof (UINT32
));
348 if (FileBuffer
!= NULL
) {
352 if (OutFile
!= NULL
) {
356 VerboseMsg ("%s tool done with return code is 0x%x.", UTILITY_NAME
, GetUtilityStatus ());
358 return GetUtilityStatus ();