2 Main file for Comp shell Debug1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDebug1CommandsLib.h"
19 Function for 'comp' command.
21 @param[in] ImageHandle Handle to the Image (NULL if Internal).
22 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
27 IN EFI_HANDLE ImageHandle
,
28 IN EFI_SYSTEM_TABLE
*SystemTable
34 SHELL_STATUS ShellStatus
;
36 SHELL_FILE_HANDLE FileHandle1
;
37 SHELL_FILE_HANDLE FileHandle2
;
49 UINTN DataSizeFromFile1
;
50 UINTN DataSizeFromFile2
;
53 CONST CHAR16
*TempParam
;
57 ShellStatus
= SHELL_SUCCESS
;
66 // initialize the shell lib (we must be in non-auto-init...)
68 Status
= ShellInitialize();
69 ASSERT_EFI_ERROR(Status
);
71 Status
= CommandInit();
72 ASSERT_EFI_ERROR(Status
);
75 // parse the command line
77 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
78 if (EFI_ERROR(Status
)) {
79 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
80 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"comp", ProblemParam
);
81 FreePool(ProblemParam
);
82 ShellStatus
= SHELL_INVALID_PARAMETER
;
87 if (ShellCommandLineGetCount(Package
) > 3) {
88 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"comp");
89 ShellStatus
= SHELL_INVALID_PARAMETER
;
90 } else if (ShellCommandLineGetCount(Package
) < 3) {
91 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
, L
"comp");
92 ShellStatus
= SHELL_INVALID_PARAMETER
;
94 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
95 ASSERT(TempParam
!= NULL
);
96 FileName1
= ShellFindFilePath(TempParam
);
97 if (FileName1
== NULL
) {
98 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, L
"comp", TempParam
);
99 ShellStatus
= SHELL_NOT_FOUND
;
101 Status
= ShellOpenFileByName(FileName1
, &FileHandle1
, EFI_FILE_MODE_READ
, 0);
102 if (EFI_ERROR(Status
)) {
103 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"comp", TempParam
);
104 ShellStatus
= SHELL_NOT_FOUND
;
107 TempParam
= ShellCommandLineGetRawValue(Package
, 2);
108 ASSERT(TempParam
!= NULL
);
109 FileName2
= ShellFindFilePath(TempParam
);
110 if (FileName2
== NULL
) {
111 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, L
"comp", TempParam
);
112 ShellStatus
= SHELL_NOT_FOUND
;
114 Status
= ShellOpenFileByName(FileName2
, &FileHandle2
, EFI_FILE_MODE_READ
, 0);
115 if (EFI_ERROR(Status
)) {
116 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, L
"comp", TempParam
);
117 ShellStatus
= SHELL_NOT_FOUND
;
120 if (ShellStatus
== SHELL_SUCCESS
) {
121 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_HEADER
), gShellDebug1HiiHandle
, FileName1
, FileName2
);
122 Status
= gEfiShellProtocol
->GetFileSize(FileHandle1
, &Size1
);
123 ASSERT_EFI_ERROR(Status
);
124 Status
= gEfiShellProtocol
->GetFileSize(FileHandle2
, &Size2
);
125 ASSERT_EFI_ERROR(Status
);
126 if (Size1
!= Size2
) {
127 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_SIZE_FAIL
), gShellDebug1HiiHandle
);
129 ShellStatus
= SHELL_NOT_EQUAL
;
132 if (ShellStatus
== SHELL_SUCCESS
) {
133 for (LoopVar
= 0 ; LoopVar
< Size1
&& ErrorCount
<= 10 ; LoopVar
++) {
134 DataSizeFromFile1
= 1;
135 DataSizeFromFile2
= 1;
136 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &DataFromFile1
);
137 ASSERT_EFI_ERROR(Status
);
138 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &DataFromFile2
);
139 ASSERT_EFI_ERROR(Status
);
140 if (DataFromFile1
!= DataFromFile2
) {
141 ErrorAddress
= LoopVar
;
150 // Now check the next 3 bytes if possible. This will make output
151 // cleaner when there are a sequence of differences.
153 if (LoopVar
+ 1 < Size1
) {
155 DataSizeFromFile1
= 1;
156 DataSizeFromFile2
= 1;
157 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File11
);
158 ASSERT_EFI_ERROR(Status
);
159 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File21
);
160 ASSERT_EFI_ERROR(Status
);
161 if (LoopVar
+ 1 < Size1
) {
163 DataSizeFromFile1
= 1;
164 DataSizeFromFile2
= 1;
165 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File12
);
166 ASSERT_EFI_ERROR(Status
);
167 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File22
);
168 ASSERT_EFI_ERROR(Status
);
169 if (LoopVar
+ 1 < Size1
) {
171 DataSizeFromFile1
= 1;
172 DataSizeFromFile2
= 1;
173 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File13
);
174 ASSERT_EFI_ERROR(Status
);
175 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File23
);
176 ASSERT_EFI_ERROR(Status
);
182 // Print out based on highest of the 4 bytes that are different.
184 if (ADF_File13
!= ADF_File23
) {
189 STRING_TOKEN (STR_COMP_SPOT_FAIL4
),
190 gShellDebug1HiiHandle
,
194 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
195 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
198 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
,
199 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
201 } else if (ADF_File12
!= ADF_File22
) {
206 STRING_TOKEN (STR_COMP_SPOT_FAIL3
),
207 gShellDebug1HiiHandle
,
211 DataFromFile1
, ADF_File11
, ADF_File12
,
212 DataFromFile1
, ADF_File11
, ADF_File12
,
215 DataFromFile2
, ADF_File21
, ADF_File22
,
216 DataFromFile2
, ADF_File21
, ADF_File22
218 } else if (ADF_File11
!= ADF_File21
) {
223 STRING_TOKEN (STR_COMP_SPOT_FAIL2
),
224 gShellDebug1HiiHandle
,
228 DataFromFile1
, ADF_File11
,
229 DataFromFile1
, ADF_File11
,
232 DataFromFile2
, ADF_File21
,
233 DataFromFile2
, ADF_File21
240 STRING_TOKEN (STR_COMP_SPOT_FAIL1
),
241 gShellDebug1HiiHandle
,
253 ShellStatus
= SHELL_NOT_EQUAL
;
256 if (ErrorCount
== 0) {
257 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_PASS
), gShellDebug1HiiHandle
);
259 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_FAIL
), gShellDebug1HiiHandle
);
264 ShellCommandLineFreeVarList (Package
);
266 SHELL_FREE_NON_NULL(FileName1
);
267 SHELL_FREE_NON_NULL(FileName2
);
269 if (FileHandle1
!= NULL
) {
270 gEfiShellProtocol
->CloseFile(FileHandle1
);
272 if (FileHandle2
!= NULL
) {
273 gEfiShellProtocol
->CloseFile(FileHandle2
);
276 return (ShellStatus
);