2 Main file for Comp shell Debug1 function.
4 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDebug1CommandsLib.h"
18 Function for 'comp' command.
20 @param[in] ImageHandle Handle to the Image (NULL if Internal).
21 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
26 IN EFI_HANDLE ImageHandle
,
27 IN EFI_SYSTEM_TABLE
*SystemTable
33 SHELL_STATUS ShellStatus
;
35 SHELL_FILE_HANDLE FileHandle1
;
36 SHELL_FILE_HANDLE FileHandle2
;
48 UINTN DataSizeFromFile1
;
49 UINTN DataSizeFromFile2
;
52 CONST CHAR16
*TempParam
;
56 ShellStatus
= SHELL_SUCCESS
;
65 // initialize the shell lib (we must be in non-auto-init...)
67 Status
= ShellInitialize();
68 ASSERT_EFI_ERROR(Status
);
70 Status
= CommandInit();
71 ASSERT_EFI_ERROR(Status
);
74 // parse the command line
76 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
77 if (EFI_ERROR(Status
)) {
78 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
79 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
80 FreePool(ProblemParam
);
81 ShellStatus
= SHELL_INVALID_PARAMETER
;
86 if (ShellCommandLineGetCount(Package
) > 3) {
87 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
88 ShellStatus
= SHELL_INVALID_PARAMETER
;
89 } else if (ShellCommandLineGetCount(Package
) < 3) {
90 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
91 ShellStatus
= SHELL_INVALID_PARAMETER
;
93 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
94 ASSERT(TempParam
!= NULL
);
95 FileName1
= ShellFindFilePath(TempParam
);
96 if (FileName1
== NULL
) {
97 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, TempParam
);
98 ShellStatus
= SHELL_NOT_FOUND
;
100 Status
= ShellOpenFileByName(FileName1
, &FileHandle1
, EFI_FILE_MODE_READ
, 0);
101 if (EFI_ERROR(Status
)) {
102 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, TempParam
, Status
);
103 ShellStatus
= SHELL_NOT_FOUND
;
106 TempParam
= ShellCommandLineGetRawValue(Package
, 2);
107 ASSERT(TempParam
!= NULL
);
108 FileName2
= ShellFindFilePath(TempParam
);
109 if (FileName2
== NULL
) {
110 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, TempParam
);
111 ShellStatus
= SHELL_NOT_FOUND
;
113 Status
= ShellOpenFileByName(FileName2
, &FileHandle2
, EFI_FILE_MODE_READ
, 0);
114 if (EFI_ERROR(Status
)) {
115 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, TempParam
, Status
);
116 ShellStatus
= SHELL_NOT_FOUND
;
119 if (ShellStatus
== SHELL_SUCCESS
) {
120 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_HEADER
), gShellDebug1HiiHandle
, FileName1
, FileName2
);
121 Status
= gEfiShellProtocol
->GetFileSize(FileHandle1
, &Size1
);
122 ASSERT_EFI_ERROR(Status
);
123 Status
= gEfiShellProtocol
->GetFileSize(FileHandle2
, &Size2
);
124 ASSERT_EFI_ERROR(Status
);
125 if (Size1
!= Size2
) {
126 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_SIZE_FAIL
), gShellDebug1HiiHandle
);
128 ShellStatus
= SHELL_NOT_EQUAL
;
131 if (ShellStatus
== SHELL_SUCCESS
) {
132 for (LoopVar
= 0 ; LoopVar
< Size1
&& ErrorCount
<= 10 ; LoopVar
++) {
133 DataSizeFromFile1
= 1;
134 DataSizeFromFile2
= 1;
135 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &DataFromFile1
);
136 ASSERT_EFI_ERROR(Status
);
137 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &DataFromFile2
);
138 ASSERT_EFI_ERROR(Status
);
139 if (DataFromFile1
!= DataFromFile2
) {
140 ErrorAddress
= LoopVar
;
149 // Now check the next 3 bytes if possible. This will make output
150 // cleaner when there are a sequence of differences.
152 if (LoopVar
+ 1 < Size1
) {
154 DataSizeFromFile1
= 1;
155 DataSizeFromFile2
= 1;
156 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File11
);
157 ASSERT_EFI_ERROR(Status
);
158 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File21
);
159 ASSERT_EFI_ERROR(Status
);
160 if (LoopVar
+ 1 < Size1
) {
162 DataSizeFromFile1
= 1;
163 DataSizeFromFile2
= 1;
164 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File12
);
165 ASSERT_EFI_ERROR(Status
);
166 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File22
);
167 ASSERT_EFI_ERROR(Status
);
168 if (LoopVar
+ 1 < Size1
) {
170 DataSizeFromFile1
= 1;
171 DataSizeFromFile2
= 1;
172 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File13
);
173 ASSERT_EFI_ERROR(Status
);
174 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File23
);
175 ASSERT_EFI_ERROR(Status
);
181 // Print out based on highest of the 4 bytes that are different.
183 if (ADF_File13
!= ADF_File23
) {
188 STRING_TOKEN (STR_COMP_SPOT_FAIL4
),
189 gShellDebug1HiiHandle
,
193 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
194 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
197 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
,
198 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
200 } else if (ADF_File12
!= ADF_File22
) {
205 STRING_TOKEN (STR_COMP_SPOT_FAIL3
),
206 gShellDebug1HiiHandle
,
210 DataFromFile1
, ADF_File11
, ADF_File12
,
211 DataFromFile1
, ADF_File11
, ADF_File12
,
214 DataFromFile2
, ADF_File21
, ADF_File22
,
215 DataFromFile2
, ADF_File21
, ADF_File22
217 } else if (ADF_File11
!= ADF_File21
) {
222 STRING_TOKEN (STR_COMP_SPOT_FAIL2
),
223 gShellDebug1HiiHandle
,
227 DataFromFile1
, ADF_File11
,
228 DataFromFile1
, ADF_File11
,
231 DataFromFile2
, ADF_File21
,
232 DataFromFile2
, ADF_File21
239 STRING_TOKEN (STR_COMP_SPOT_FAIL1
),
240 gShellDebug1HiiHandle
,
252 ShellStatus
= SHELL_NOT_EQUAL
;
255 if (ErrorCount
== 0) {
256 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_PASS
), gShellDebug1HiiHandle
);
258 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_FAIL
), gShellDebug1HiiHandle
);
263 ShellCommandLineFreeVarList (Package
);
265 SHELL_FREE_NON_NULL(FileName1
);
266 SHELL_FREE_NON_NULL(FileName2
);
268 if (FileHandle1
!= NULL
) {
269 gEfiShellProtocol
->CloseFile(FileHandle1
);
271 if (FileHandle2
!= NULL
) {
272 gEfiShellProtocol
->CloseFile(FileHandle2
);
275 return (ShellStatus
);