2 Main file for Comp shell Debug1 function.
4 Copyright (c) 2010 - 2011, 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
;
55 ShellStatus
= SHELL_SUCCESS
;
64 // initialize the shell lib (we must be in non-auto-init...)
66 Status
= ShellInitialize();
67 ASSERT_EFI_ERROR(Status
);
69 Status
= CommandInit();
70 ASSERT_EFI_ERROR(Status
);
73 // parse the command line
75 Status
= ShellCommandLineParse (EmptyParamList
, &Package
, &ProblemParam
, TRUE
);
76 if (EFI_ERROR(Status
)) {
77 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
78 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
79 FreePool(ProblemParam
);
80 ShellStatus
= SHELL_INVALID_PARAMETER
;
85 if (ShellCommandLineGetCount(Package
) > 3) {
86 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
87 ShellStatus
= SHELL_INVALID_PARAMETER
;
88 } else if (ShellCommandLineGetCount(Package
) < 3) {
89 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
90 ShellStatus
= SHELL_INVALID_PARAMETER
;
92 TempParam
= ShellCommandLineGetRawValue(Package
, 1);
93 ASSERT(TempParam
!= NULL
);
94 FileName1
= ShellFindFilePath(TempParam
);
95 if (FileName1
== NULL
) {
96 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, TempParam
);
97 ShellStatus
= SHELL_NOT_FOUND
;
99 Status
= ShellOpenFileByName(FileName1
, &FileHandle1
, EFI_FILE_MODE_READ
, 0);
100 if (EFI_ERROR(Status
)) {
101 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, TempParam
, Status
);
102 ShellStatus
= SHELL_NOT_FOUND
;
105 TempParam
= ShellCommandLineGetRawValue(Package
, 2);
106 ASSERT(TempParam
!= NULL
);
107 FileName2
= ShellFindFilePath(TempParam
);
108 if (FileName2
== NULL
) {
109 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_FIND_FAIL
), gShellDebug1HiiHandle
, TempParam
);
110 ShellStatus
= SHELL_NOT_FOUND
;
112 Status
= ShellOpenFileByName(FileName2
, &FileHandle2
, EFI_FILE_MODE_READ
, 0);
113 if (EFI_ERROR(Status
)) {
114 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_FILE_OPEN_FAIL
), gShellDebug1HiiHandle
, TempParam
, Status
);
115 ShellStatus
= SHELL_NOT_FOUND
;
118 if (ShellStatus
== SHELL_SUCCESS
) {
119 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_HEADER
), gShellDebug1HiiHandle
, FileName1
, FileName2
);
120 Status
= gEfiShellProtocol
->GetFileSize(FileHandle1
, &Size1
);
121 ASSERT_EFI_ERROR(Status
);
122 Status
= gEfiShellProtocol
->GetFileSize(FileHandle2
, &Size2
);
123 ASSERT_EFI_ERROR(Status
);
124 if (Size1
!= Size2
) {
125 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_SIZE_FAIL
), gShellDebug1HiiHandle
);
127 ShellStatus
= SHELL_NOT_EQUAL
;
130 if (ShellStatus
== SHELL_SUCCESS
) {
131 for (LoopVar
= 0 ; LoopVar
< Size1
&& ErrorCount
<= 10 ; LoopVar
++) {
132 DataSizeFromFile1
= 1;
133 DataSizeFromFile2
= 1;
134 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &DataFromFile1
);
135 ASSERT_EFI_ERROR(Status
);
136 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &DataFromFile2
);
137 ASSERT_EFI_ERROR(Status
);
138 if (DataFromFile1
!= DataFromFile2
) {
145 if (LoopVar
+ 1 < Size1
) {
147 DataSizeFromFile1
= 1;
148 DataSizeFromFile2
= 1;
149 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File11
);
150 ASSERT_EFI_ERROR(Status
);
151 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File21
);
152 ASSERT_EFI_ERROR(Status
);
153 if (LoopVar
+ 1 < Size1
) {
155 DataSizeFromFile1
= 1;
156 DataSizeFromFile2
= 1;
157 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File12
);
158 ASSERT_EFI_ERROR(Status
);
159 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File22
);
160 ASSERT_EFI_ERROR(Status
);
161 if (LoopVar
+ 1 < Size1
) {
163 DataSizeFromFile1
= 1;
164 DataSizeFromFile2
= 1;
165 Status
= gEfiShellProtocol
->ReadFile(FileHandle1
, &DataSizeFromFile1
, &ADF_File13
);
166 ASSERT_EFI_ERROR(Status
);
167 Status
= gEfiShellProtocol
->ReadFile(FileHandle2
, &DataSizeFromFile2
, &ADF_File23
);
168 ASSERT_EFI_ERROR(Status
);
172 if (ADF_File13
!= ADF_File23
) {
177 STRING_TOKEN (STR_COMP_SPOT_FAIL4
),
178 gShellDebug1HiiHandle
,
182 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
183 DataFromFile1
, ADF_File11
, ADF_File12
, ADF_File13
,
186 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
,
187 DataFromFile2
, ADF_File21
, ADF_File22
, ADF_File23
189 } else if (ADF_File12
!= ADF_File22
) {
194 STRING_TOKEN (STR_COMP_SPOT_FAIL3
),
195 gShellDebug1HiiHandle
,
199 DataFromFile1
, ADF_File11
, ADF_File12
,
200 DataFromFile1
, ADF_File11
, ADF_File12
,
203 DataFromFile2
, ADF_File21
, ADF_File22
,
204 DataFromFile2
, ADF_File21
, ADF_File22
206 } else if (ADF_File11
!= ADF_File21
) {
211 STRING_TOKEN (STR_COMP_SPOT_FAIL2
),
212 gShellDebug1HiiHandle
,
216 DataFromFile1
, ADF_File11
,
217 DataFromFile1
, ADF_File11
,
220 DataFromFile2
, ADF_File21
,
221 DataFromFile2
, ADF_File21
228 STRING_TOKEN (STR_COMP_SPOT_FAIL1
),
229 gShellDebug1HiiHandle
,
241 ShellStatus
= SHELL_NOT_EQUAL
;
244 if (ErrorCount
== 0) {
245 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_PASS
), gShellDebug1HiiHandle
);
247 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_COMP_FOOTER_FAIL
), gShellDebug1HiiHandle
);
252 ShellCommandLineFreeVarList (Package
);
254 SHELL_FREE_NON_NULL(FileName1
);
255 SHELL_FREE_NON_NULL(FileName2
);
257 if (FileHandle1
!= NULL
) {
258 gEfiShellProtocol
->CloseFile(FileHandle1
);
260 if (FileHandle2
!= NULL
) {
261 gEfiShellProtocol
->CloseFile(FileHandle2
);
264 return (ShellStatus
);