2 Internal file explorer functions for SecureBoot configuration module.
4 Copyright (c) 2012 - 2016, 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 "SecureBootConfigImpl.h"
17 VOID
*mStartOpCodeHandle
= NULL
;
18 VOID
*mEndOpCodeHandle
= NULL
;
19 EFI_IFR_GUID_LABEL
*mStartLabel
= NULL
;
20 EFI_IFR_GUID_LABEL
*mEndLabel
= NULL
;
23 Refresh the global UpdateData structure.
32 // Free current updated date
34 if (mStartOpCodeHandle
!= NULL
) {
35 HiiFreeOpCodeHandle (mStartOpCodeHandle
);
39 // Create new OpCode Handle
41 mStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
44 // Create Hii Extend Label OpCode as the start opcode
46 mStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
50 sizeof (EFI_IFR_GUID_LABEL
)
52 mStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
56 Clean up the dynamic opcode at label and form specified by both LabelId.
58 @param[in] LabelId It is both the Form ID and Label ID for opcode deletion.
59 @param[in] PrivateData Module private data.
65 IN SECUREBOOT_CONFIG_PRIVATE_DATA
*PrivateData
71 // Remove all op-codes from dynamic page
73 mStartLabel
->Number
= LabelId
;
75 PrivateData
->HiiHandle
,
76 &gSecureBootConfigFormSetGuid
,
78 mStartOpCodeHandle
, // Label LabelId
79 mEndOpCodeHandle
// LABEL_END
84 This function will open a file or directory referenced by DevicePath.
86 This function opens a file with the open mode according to the file path. The
87 Attributes is valid only for EFI_FILE_MODE_CREATE.
89 @param[in, out] FilePath On input, the device path to the file.
90 On output, the remaining device path.
91 @param[out] FileHandle Pointer to the file handle.
92 @param[in] OpenMode The mode to open the file with.
93 @param[in] Attributes The file's file attributes.
95 @retval EFI_SUCCESS The information was set.
96 @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
97 @retval EFI_UNSUPPORTED Could not open the file path.
98 @retval EFI_NOT_FOUND The specified file could not be found on the
99 device or the file system could not be found on
101 @retval EFI_NO_MEDIA The device has no medium.
102 @retval EFI_MEDIA_CHANGED The device has a different medium in it or the
103 medium is no longer supported.
104 @retval EFI_DEVICE_ERROR The device reported an error.
105 @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
106 @retval EFI_WRITE_PROTECTED The file or medium is write protected.
107 @retval EFI_ACCESS_DENIED The file was opened read only.
108 @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
110 @retval EFI_VOLUME_FULL The volume is full.
114 OpenFileByDevicePath(
115 IN OUT EFI_DEVICE_PATH_PROTOCOL
**FilePath
,
116 OUT EFI_FILE_HANDLE
*FileHandle
,
122 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
*EfiSimpleFileSystemProtocol
;
123 EFI_FILE_PROTOCOL
*Handle1
;
124 EFI_FILE_PROTOCOL
*Handle2
;
125 EFI_HANDLE DeviceHandle
;
129 if ((FilePath
== NULL
|| FileHandle
== NULL
)) {
130 return EFI_INVALID_PARAMETER
;
133 Status
= gBS
->LocateDevicePath (
134 &gEfiSimpleFileSystemProtocolGuid
,
138 if (EFI_ERROR (Status
)) {
142 Status
= gBS
->OpenProtocol(
144 &gEfiSimpleFileSystemProtocolGuid
,
145 (VOID
**)&EfiSimpleFileSystemProtocol
,
148 EFI_OPEN_PROTOCOL_GET_PROTOCOL
150 if (EFI_ERROR (Status
)) {
154 Status
= EfiSimpleFileSystemProtocol
->OpenVolume(EfiSimpleFileSystemProtocol
, &Handle1
);
155 if (EFI_ERROR (Status
)) {
161 // go down directories one node at a time.
163 while (!IsDevicePathEnd (*FilePath
)) {
165 // For file system access each node should be a file path component
167 if (DevicePathType (*FilePath
) != MEDIA_DEVICE_PATH
||
168 DevicePathSubType (*FilePath
) != MEDIA_FILEPATH_DP
171 return (EFI_INVALID_PARAMETER
);
174 // Open this file path node
178 PathLength
= DevicePathNodeLength (*FilePath
) - sizeof (EFI_DEVICE_PATH_PROTOCOL
);
179 PathName
= AllocateCopyPool (PathLength
, ((FILEPATH_DEVICE_PATH
*)*FilePath
)->PathName
);
180 if (PathName
== NULL
) {
181 return EFI_OUT_OF_RESOURCES
;
185 // Try to test opening an existing file
187 Status
= Handle2
->Open (
191 OpenMode
&~EFI_FILE_MODE_CREATE
,
196 // see if the error was that it needs to be created
198 if ((EFI_ERROR (Status
)) && (OpenMode
!= (OpenMode
&~EFI_FILE_MODE_CREATE
))) {
199 Status
= Handle2
->Open (
208 // Close the last node
210 Handle2
->Close (Handle2
);
214 if (EFI_ERROR(Status
)) {
221 *FilePath
= NextDevicePathNode (*FilePath
);
225 // This is a weak spot since if the undefined SHELL_FILE_HANDLE format changes this must change also!
227 *FileHandle
= (VOID
*)Handle1
;
233 Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.
234 The caller is responsible for freeing the allocated buffer using FreePool(). If return NULL
235 means not enough memory resource.
237 @param DevicePath Device path.
239 @retval NULL Not enough memory resourece for AllocateCopyPool.
240 @retval Other A new allocated string that represents the file name.
244 ExtractFileNameFromDevicePath (
245 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
254 ASSERT(DevicePath
!= NULL
);
256 String
= DevicePathToStr(DevicePath
);
257 MatchString
= String
;
261 while(MatchString
!= NULL
){
262 LastMatch
= MatchString
+ 1;
263 MatchString
= StrStr(LastMatch
,L
"\\");
266 Length
= StrLen(LastMatch
);
267 FileName
= AllocateCopyPool ((Length
+ 1) * sizeof(CHAR16
), LastMatch
);
268 if (FileName
!= NULL
) {
269 *(FileName
+ Length
) = 0;
279 Update the form base on the selected file.
281 @param FilePath Point to the file path.
282 @param FormId The form need to display.
284 @retval TRUE Exit caller function.
285 @retval FALSE Not exit caller function.
290 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
,
291 IN EFI_FORM_ID FormId
295 EFI_STRING_ID StringToken
;
299 if (FilePath
!= NULL
) {
300 FileName
= ExtractFileNameFromDevicePath(FilePath
);
302 if (FileName
== NULL
) {
304 // FileName = NULL has two case:
305 // 1. FilePath == NULL, not select file.
306 // 2. FilePath != NULL, but ExtractFileNameFromDevicePath return NULL not enough memory resource.
307 // In these two case, no need to update the form, and exit the caller function.
311 StringToken
= HiiSetString (gSecureBootPrivateData
->HiiHandle
, 0, FileName
, NULL
);
313 gSecureBootPrivateData
->FileContext
->FileName
= FileName
;
315 OpenFileByDevicePath(
317 &gSecureBootPrivateData
->FileContext
->FHandle
,
322 // Create Subtitle op-code for the display string of the option.
324 RefreshUpdateData ();
325 mStartLabel
->Number
= FormId
;
327 HiiCreateSubTitleOpCode (
336 gSecureBootPrivateData
->HiiHandle
,
337 &gSecureBootConfigFormSetGuid
,
339 mStartOpCodeHandle
, // Label FormId
340 mEndOpCodeHandle
// LABEL_END
347 Update the PK form base on the input file path info.
349 @param FilePath Point to the file path.
351 @retval TRUE Exit caller function.
352 @retval FALSE Not exit caller function.
357 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
360 return UpdatePage(FilePath
, FORMID_ENROLL_PK_FORM
);
365 Update the KEK form base on the input file path info.
367 @param FilePath Point to the file path.
369 @retval TRUE Exit caller function.
370 @retval FALSE Not exit caller function.
375 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
378 return UpdatePage(FilePath
, FORMID_ENROLL_KEK_FORM
);
382 Update the DB form base on the input file path info.
384 @param FilePath Point to the file path.
386 @retval TRUE Exit caller function.
387 @retval FALSE Not exit caller function.
392 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
395 return UpdatePage(FilePath
, SECUREBOOT_ENROLL_SIGNATURE_TO_DB
);
399 Update the DBX form base on the input file path info.
401 @param FilePath Point to the file path.
403 @retval TRUE Exit caller function.
404 @retval FALSE Not exit caller function.
409 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
412 return UpdatePage(FilePath
, SECUREBOOT_ENROLL_SIGNATURE_TO_DBX
);
416 Update the DBT form base on the input file path info.
418 @param FilePath Point to the file path.
420 @retval TRUE Exit caller function.
421 @retval FALSE Not exit caller function.
426 IN EFI_DEVICE_PATH_PROTOCOL
*FilePath
429 return UpdatePage(FilePath
, SECUREBOOT_ENROLL_SIGNATURE_TO_DBT
);