2 Implementation for EFI_HII_DATABASE_PROTOCOL.
4 Copyright (c) 2007 - 2017, 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.
16 #include "HiiDatabase.h"
18 #define BASE_NUMBER 10
20 EFI_HII_PACKAGE_LIST_HEADER
*gRTDatabaseInfoBuffer
= NULL
;
21 EFI_STRING gRTConfigRespBuffer
= NULL
;
22 UINTN gDatabaseInfoSize
= 0;
23 UINTN gConfigRespSize
= 0;
24 BOOLEAN gExportConfigResp
= TRUE
;
25 UINTN gNvDefaultStoreSize
= 0;
26 SKU_ID gSkuId
= 0xFFFFFFFFFFFFFFFF;
27 LIST_ENTRY gVarStorageList
= INITIALIZE_LIST_HEAD_VARIABLE (gVarStorageList
);
30 This function generates a HII_DATABASE_RECORD node and adds into hii database.
31 This is a internal function.
33 @param Private hii database private structure
34 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
37 @retval EFI_SUCCESS A database record is generated successfully.
38 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
40 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
44 GenerateHiiDatabaseRecord (
45 IN HII_DATABASE_PRIVATE_DATA
*Private
,
46 OUT HII_DATABASE_RECORD
**DatabaseNode
49 HII_DATABASE_RECORD
*DatabaseRecord
;
50 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
51 HII_HANDLE
*HiiHandle
;
53 if (Private
== NULL
|| DatabaseNode
== NULL
) {
54 return EFI_INVALID_PARAMETER
;
57 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
58 if (DatabaseRecord
== NULL
) {
59 return EFI_OUT_OF_RESOURCES
;
61 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
63 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
64 if (DatabaseRecord
->PackageList
== NULL
) {
65 FreePool (DatabaseRecord
);
66 return EFI_OUT_OF_RESOURCES
;
69 PackageList
= DatabaseRecord
->PackageList
;
71 InitializeListHead (&PackageList
->GuidPkgHdr
);
72 InitializeListHead (&PackageList
->FormPkgHdr
);
73 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
74 InitializeListHead (&PackageList
->StringPkgHdr
);
75 InitializeListHead (&PackageList
->FontPkgHdr
);
76 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
77 PackageList
->ImagePkg
= NULL
;
78 PackageList
->DevicePathPkg
= NULL
;
81 // Create a new hii handle
83 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
84 if (HiiHandle
== NULL
) {
85 FreePool (DatabaseRecord
->PackageList
);
86 FreePool (DatabaseRecord
);
87 return EFI_OUT_OF_RESOURCES
;
89 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
91 // Backup the number of Hii handles
93 Private
->HiiHandleCount
++;
94 HiiHandle
->Key
= (UINTN
) Private
->HiiHandleCount
;
96 // Insert the handle to hii handle list of the whole database.
98 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
100 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
103 // Insert the Package List node to Package List link of the whole database.
105 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
107 *DatabaseNode
= DatabaseRecord
;
115 This function checks whether a handle is a valid EFI_HII_HANDLE
116 This is a internal function.
118 @param Handle Pointer to a EFI_HII_HANDLE
121 @retval FALSE Invalid
126 EFI_HII_HANDLE Handle
129 HII_HANDLE
*HiiHandle
;
131 HiiHandle
= (HII_HANDLE
*) Handle
;
133 if (HiiHandle
== NULL
) {
137 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
146 This function invokes the matching registered function.
147 This is a internal function.
149 @param Private HII Database driver private structure.
150 @param NotifyType The type of change concerning the database.
151 @param PackageInstance Points to the package referred to by the
153 @param PackageType Package type
154 @param Handle The handle of the package list which contains the
157 @retval EFI_SUCCESS Already checked all registered function and
159 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
163 InvokeRegisteredFunction (
164 IN HII_DATABASE_PRIVATE_DATA
*Private
,
165 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
166 IN VOID
*PackageInstance
,
167 IN UINT8 PackageType
,
168 IN EFI_HII_HANDLE Handle
171 HII_DATABASE_NOTIFY
*Notify
;
173 EFI_HII_PACKAGE_HEADER
*Package
;
177 UINT32 ImageBlockSize
;
178 UINT32 PaletteInfoSize
;
180 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
181 return EFI_INVALID_PARAMETER
;
183 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
184 return EFI_INVALID_PARAMETER
;
186 if (!IsHiiHandleValid (Handle
)) {
187 return EFI_INVALID_PARAMETER
;
194 // Convert the incoming package from hii database storage format to UEFI
195 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
197 switch (PackageType
) {
198 case EFI_HII_PACKAGE_TYPE_GUID
:
199 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
202 case EFI_HII_PACKAGE_FORMS
:
203 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
204 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
205 ASSERT (Buffer
!= NULL
);
208 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
209 sizeof (EFI_HII_PACKAGE_HEADER
)
212 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
213 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
214 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
216 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
219 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
220 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
223 case EFI_HII_PACKAGE_STRINGS
:
224 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
225 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
226 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
227 ASSERT (Buffer
!= NULL
);
230 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
235 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
236 BufferSize
- HeaderSize
238 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
241 case EFI_HII_PACKAGE_FONTS
:
242 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
243 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
244 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
245 ASSERT (Buffer
!= NULL
);
248 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
253 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
254 BufferSize
- HeaderSize
256 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
259 case EFI_HII_PACKAGE_IMAGES
:
260 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
261 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
262 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
263 ASSERT (Buffer
!= NULL
);
267 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
271 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
276 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
277 if (ImageBlockSize
!= 0) {
280 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
285 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
286 if (PaletteInfoSize
!= 0) {
288 Buffer
+ HeaderSize
+ ImageBlockSize
,
289 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
292 HeaderSize
+= ImageBlockSize
;
294 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
299 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
302 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
303 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
304 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
305 ASSERT (Buffer
!= NULL
);
308 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
311 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
314 case EFI_HII_PACKAGE_DEVICE_PATH
:
315 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
319 return EFI_INVALID_PARAMETER
;
322 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
323 Link
!= &Private
->DatabaseNotifyList
;
324 Link
= Link
->ForwardLink
326 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
327 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
329 // Check in case PackageGuid is not NULL when Package is GUID package
331 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
332 Notify
->PackageGuid
= NULL
;
335 // Status of Registered Function is unknown so did not check it
337 Notify
->PackageNotifyFn (
347 if (Buffer
!= NULL
) {
356 This function insert a GUID package to a package list node.
357 This is a internal function.
359 @param PackageHdr Pointer to a buffer stored with GUID package
361 @param NotifyType The type of change concerning the database.
362 @param PackageList Pointer to a package list which will be inserted
364 @param Package Created GUID package
366 @retval EFI_SUCCESS Guid Package is inserted successfully.
367 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
369 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
375 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
376 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
377 OUT HII_GUID_PACKAGE_INSTANCE
**Package
380 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
381 EFI_HII_PACKAGE_HEADER PackageHeader
;
383 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
384 return EFI_INVALID_PARAMETER
;
387 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
390 // Create a GUID package node
392 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
393 if (GuidPackage
== NULL
) {
394 return EFI_OUT_OF_RESOURCES
;
396 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
397 if (GuidPackage
->GuidPkg
== NULL
) {
398 FreePool (GuidPackage
);
399 return EFI_OUT_OF_RESOURCES
;
402 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
403 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
404 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
405 *Package
= GuidPackage
;
407 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
408 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
416 This function exports GUID packages to a buffer.
417 This is a internal function.
419 @param Private Hii database private structure.
420 @param Handle Identification of a package list.
421 @param PackageList Pointer to a package list which will be exported.
422 @param UsedSize The length of buffer be used.
423 @param BufferSize Length of the Buffer.
424 @param Buffer Allocated space for storing exported data.
425 @param ResultSize The size of the already exported content of this
428 @retval EFI_SUCCESS Guid Packages are exported successfully.
429 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
434 IN HII_DATABASE_PRIVATE_DATA
*Private
,
435 IN EFI_HII_HANDLE Handle
,
436 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
440 IN OUT UINTN
*ResultSize
443 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
446 EFI_HII_PACKAGE_HEADER PackageHeader
;
449 if (PackageList
== NULL
|| ResultSize
== NULL
) {
450 return EFI_INVALID_PARAMETER
;
453 if (BufferSize
> 0 && Buffer
== NULL
) {
454 return EFI_INVALID_PARAMETER
;
458 Status
= EFI_SUCCESS
;
460 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
461 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
462 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
463 PackageLength
+= PackageHeader
.Length
;
464 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
465 Status
= InvokeRegisteredFunction (
467 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
468 (VOID
*) GuidPackage
,
469 EFI_HII_PACKAGE_TYPE_GUID
,
472 ASSERT_EFI_ERROR (Status
);
473 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
474 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
478 *ResultSize
+= PackageLength
;
484 This function deletes all GUID packages from a package list node.
485 This is a internal function.
487 @param Private Hii database private data.
488 @param Handle Handle of the package list which contains the to
489 be removed GUID packages.
490 @param PackageList Pointer to a package list that contains removing
493 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
494 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
499 IN HII_DATABASE_PRIVATE_DATA
*Private
,
500 IN EFI_HII_HANDLE Handle
,
501 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
504 LIST_ENTRY
*ListHead
;
505 HII_GUID_PACKAGE_INSTANCE
*Package
;
507 EFI_HII_PACKAGE_HEADER PackageHeader
;
509 ListHead
= &PackageList
->GuidPkgHdr
;
511 while (!IsListEmpty (ListHead
)) {
513 ListHead
->ForwardLink
,
514 HII_GUID_PACKAGE_INSTANCE
,
516 HII_GUID_PACKAGE_SIGNATURE
518 Status
= InvokeRegisteredFunction (
520 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
522 EFI_HII_PACKAGE_TYPE_GUID
,
525 if (EFI_ERROR (Status
)) {
529 RemoveEntryList (&Package
->GuidEntry
);
530 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
531 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
532 FreePool (Package
->GuidPkg
);
540 Check the input question related to EFI variable
542 @param IfrQuestionHdr Point to Question header
543 @param EfiVarStoreList Point to EFI VarStore List
544 @param EfiVarStoreNumber The number of EFI VarStore
546 @retval Index The index of the found EFI varstore in EFI varstore list
547 EfiVarStoreNumber will return if no EFI varstore is found.
550 IsEfiVarStoreQuestion (
551 EFI_IFR_QUESTION_HEADER
*IfrQuestionHdr
,
552 EFI_IFR_VARSTORE_EFI
**EfiVarStoreList
,
553 UINTN EfiVarStoreNumber
557 for (Index
= 0; Index
< EfiVarStoreNumber
; Index
++) {
558 if (IfrQuestionHdr
->VarStoreId
== EfiVarStoreList
[Index
]->VarStoreId
) {
563 return EfiVarStoreNumber
;
567 Find the matched variable from the input variable storage.
569 @param[in] VariableStorage Point to the variable storage header.
570 @param[in] VarGuid A unique identifier for the variable.
571 @param[in] VarAttribute The attributes bitmask for the variable.
572 @param[in] VarName A Null-terminated ascii string that is the name of the variable.
574 @return Pointer to the matched variable header or NULL if not found.
578 IN VARIABLE_STORE_HEADER
*VariableStorage
,
579 IN EFI_GUID
*VarGuid
,
580 IN UINT32 VarAttribute
,
584 VARIABLE_HEADER
*VariableHeader
;
585 VARIABLE_HEADER
*VariableEnd
;
587 VariableEnd
= (VARIABLE_HEADER
*) ((UINT8
*) VariableStorage
+ VariableStorage
->Size
);
588 VariableHeader
= (VARIABLE_HEADER
*) (VariableStorage
+ 1);
589 VariableHeader
= (VARIABLE_HEADER
*) HEADER_ALIGN (VariableHeader
);
590 while (VariableHeader
< VariableEnd
) {
591 if (CompareGuid (&VariableHeader
->VendorGuid
, VarGuid
) &&
592 VariableHeader
->Attributes
== VarAttribute
&&
593 StrCmp (VarName
, (CHAR16
*) (VariableHeader
+ 1)) == 0) {
594 return VariableHeader
;
596 VariableHeader
= (VARIABLE_HEADER
*) ((UINT8
*) VariableHeader
+ sizeof (VARIABLE_HEADER
) + VariableHeader
->NameSize
+ VariableHeader
->DataSize
);
597 VariableHeader
= (VARIABLE_HEADER
*) HEADER_ALIGN (VariableHeader
);
604 Find question default value from PcdNvStoreDefaultValueBuffer
606 @param DefaultId Default store ID
607 @param EfiVarStore Point to EFI VarStore header
608 @param IfrQuestionHdr Point to Question header
609 @param ValueBuffer Point to Buffer includes the found default setting
610 @param Width Width of the default value
611 @param BitFieldQuestion Whether the Question is stored in Bit field.
613 @retval EFI_SUCCESS Question default value is found.
614 @retval EFI_NOT_FOUND Question default value is not found.
617 FindQuestionDefaultSetting (
619 IN EFI_IFR_VARSTORE_EFI
*EfiVarStore
,
620 IN EFI_IFR_QUESTION_HEADER
*IfrQuestionHdr
,
621 OUT VOID
*ValueBuffer
,
623 IN BOOLEAN BitFieldQuestion
626 VARIABLE_HEADER
*VariableHeader
;
627 VARIABLE_STORE_HEADER
*VariableStorage
;
629 VARSTORAGE_DEFAULT_DATA
*Entry
;
630 VARIABLE_STORE_HEADER
*NvStoreBuffer
;
642 PCD_DEFAULT_DATA
*DataHeader
;
643 PCD_DEFAULT_INFO
*DefaultInfo
;
644 PCD_DATA_DELTA
*DeltaData
;
646 if (gSkuId
== 0xFFFFFFFFFFFFFFFF) {
647 gSkuId
= LibPcdGetSku ();
651 // Find the DefaultId setting from the full DefaultSetting
653 VariableStorage
= NULL
;
654 Link
= gVarStorageList
.ForwardLink
;
655 while (Link
!= &gVarStorageList
) {
656 Entry
= BASE_CR (Link
, VARSTORAGE_DEFAULT_DATA
, Entry
);
657 if (Entry
->DefaultId
== DefaultId
) {
658 VariableStorage
= Entry
->VariableStorage
;
661 Link
= Link
->ForwardLink
;
664 if (Link
== &gVarStorageList
) {
665 DataBuffer
= (UINT8
*) PcdGetPtr (PcdNvStoreDefaultValueBuffer
);
666 gNvDefaultStoreSize
= ((PCD_NV_STORE_DEFAULT_BUFFER_HEADER
*)DataBuffer
)->Length
;
668 // The first section data includes NV storage default setting.
670 DataHeader
= (PCD_DEFAULT_DATA
*) (DataBuffer
+ sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER
));
671 NvStoreBuffer
= (VARIABLE_STORE_HEADER
*) ((UINT8
*) DataHeader
+ sizeof (DataHeader
->DataSize
) + DataHeader
->HeaderSize
);
672 VariableStorage
= AllocatePool (NvStoreBuffer
->Size
);
673 ASSERT (VariableStorage
!= NULL
);
674 CopyMem (VariableStorage
, NvStoreBuffer
, NvStoreBuffer
->Size
);
677 // Find the matched SkuId and DefaultId in the first section
680 DefaultInfo
= &(DataHeader
->DefaultInfo
[0]);
681 BufferEnd
= (UINT8
*) DataHeader
+ sizeof (DataHeader
->DataSize
) + DataHeader
->HeaderSize
;
682 while ((UINT8
*) DefaultInfo
< BufferEnd
) {
683 if (DefaultInfo
->DefaultId
== DefaultId
&& DefaultInfo
->SkuId
== gSkuId
) {
690 // Find the matched SkuId and DefaultId in the remaining section
692 Index
= sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER
) + ((DataHeader
->DataSize
+ 7) & (~7));
693 DataHeader
= (PCD_DEFAULT_DATA
*) (DataBuffer
+ Index
);
694 while (!IsFound
&& Index
< gNvDefaultStoreSize
&& DataHeader
->DataSize
!= 0xFFFF) {
695 DefaultInfo
= &(DataHeader
->DefaultInfo
[0]);
696 BufferEnd
= (UINT8
*) DataHeader
+ sizeof (DataHeader
->DataSize
) + DataHeader
->HeaderSize
;
697 while ((UINT8
*) DefaultInfo
< BufferEnd
) {
698 if (DefaultInfo
->DefaultId
== DefaultId
&& DefaultInfo
->SkuId
== gSkuId
) {
705 DeltaData
= (PCD_DATA_DELTA
*) BufferEnd
;
706 BufferEnd
= (UINT8
*) DataHeader
+ DataHeader
->DataSize
;
707 while ((UINT8
*) DeltaData
< BufferEnd
) {
708 *((UINT8
*) VariableStorage
+ DeltaData
->Offset
) = (UINT8
) DeltaData
->Value
;
713 Index
= (Index
+ DataHeader
->DataSize
+ 7) & (~7);
714 DataHeader
= (PCD_DEFAULT_DATA
*) (DataBuffer
+ Index
);
717 // Cache the found result in VarStorageList
720 FreePool (VariableStorage
);
721 VariableStorage
= NULL
;
723 Entry
= AllocatePool (sizeof (VARSTORAGE_DEFAULT_DATA
));
724 Entry
->DefaultId
= DefaultId
;
725 Entry
->VariableStorage
= VariableStorage
;
726 InsertTailList (&gVarStorageList
, &Entry
->Entry
);
729 // The matched variable storage is not found.
731 if (VariableStorage
== NULL
) {
732 return EFI_NOT_FOUND
;
736 // Find the question default value from the variable storage
738 VariableHeader
= FindVariableData (VariableStorage
, &EfiVarStore
->Guid
, EfiVarStore
->Attributes
, (CHAR16
*) EfiVarStore
->Name
);
739 if (VariableHeader
== NULL
) {
740 return EFI_NOT_FOUND
;
742 ByteOffset
= IfrQuestionHdr
->VarStoreInfo
.VarOffset
;
743 if (BitFieldQuestion
) {
744 BitOffset
= IfrQuestionHdr
->VarStoreInfo
.VarOffset
;
745 ByteOffset
= BitOffset
/ 8;
747 StartBit
= BitOffset
% 8;
748 EndBit
= StartBit
+ BitWidth
- 1;
749 Width
= EndBit
/ 8 + 1;
751 if (VariableHeader
->DataSize
< ByteOffset
+ Width
) {
752 return EFI_INVALID_PARAMETER
;
756 // Copy the question value
758 if (ValueBuffer
!= NULL
) {
759 if (BitFieldQuestion
) {
760 CopyMem (&BufferValue
, (UINT8
*) VariableHeader
+ sizeof (VARIABLE_HEADER
) + VariableHeader
->NameSize
+ ByteOffset
, Width
);
761 BitFieldVal
= BitFieldRead32 (BufferValue
, StartBit
, EndBit
);
762 CopyMem (ValueBuffer
, &BitFieldVal
, Width
);
764 CopyMem (ValueBuffer
, (UINT8
*) VariableHeader
+ sizeof (VARIABLE_HEADER
) + VariableHeader
->NameSize
+ IfrQuestionHdr
->VarStoreInfo
.VarOffset
, Width
);
772 Update IFR default setting in Form Package.
774 @param FormPackage Form Package to be updated
778 UpdateDefaultSettingInFormPackage (
779 HII_IFR_PACKAGE_INSTANCE
*FormPackage
784 EFI_IFR_VARSTORE_EFI
*IfrEfiVarStore
;
785 EFI_IFR_OP_HEADER
*IfrOpHdr
;
786 EFI_IFR_ONE_OF_OPTION
*IfrOneOfOption
;
787 UINT8 IfrQuestionType
;
789 EFI_IFR_QUESTION_HEADER
*IfrQuestionHdr
;
790 EFI_IFR_VARSTORE_EFI
**EfiVarStoreList
;
791 UINTN EfiVarStoreMaxNum
;
792 UINTN EfiVarStoreNumber
;
793 UINT16
*DefaultIdList
;
794 UINTN DefaultIdNumber
;
795 UINTN DefaultIdMaxNum
;
797 UINTN EfiVarStoreIndex
;
798 EFI_IFR_TYPE_VALUE IfrValue
;
799 EFI_IFR_TYPE_VALUE IfrManufactValue
;
800 BOOLEAN StandardDefaultIsSet
;
801 BOOLEAN ManufactDefaultIsSet
;
802 EFI_IFR_CHECKBOX
*IfrCheckBox
;
804 EFI_IFR_DEFAULT
*IfrDefault
;
806 EFI_IFR_QUESTION_HEADER VarStoreQuestionHeader
;
807 BOOLEAN QuestionReferBitField
;
810 // If no default setting, do nothing
812 if (gNvDefaultStoreSize
== 0) {
813 gNvDefaultStoreSize
= PcdGetSize (PcdNvStoreDefaultValueBuffer
);
815 if (gNvDefaultStoreSize
< sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER
)) {
819 ZeroMem (&VarStoreQuestionHeader
, sizeof (VarStoreQuestionHeader
));
820 PackageLength
= FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
823 IfrOpHdr
= (EFI_IFR_OP_HEADER
*) FormPackage
->IfrData
;
824 IfrQuestionHdr
= NULL
;
826 EfiVarStoreMaxNum
= 0;
827 EfiVarStoreNumber
= 0;
830 EfiVarStoreList
= NULL
;
831 DefaultIdList
= NULL
;
832 StandardDefaultIsSet
= FALSE
;
833 ManufactDefaultIsSet
= FALSE
;
834 QuestionReferBitField
= FALSE
;
836 while (IfrOffset
< PackageLength
) {
837 switch (IfrOpHdr
->OpCode
) {
838 case EFI_IFR_VARSTORE_EFI_OP
:
839 if (EfiVarStoreNumber
>= EfiVarStoreMaxNum
) {
841 // Reallocate EFI VarStore Buffer
843 EfiVarStoreList
= ReallocatePool (EfiVarStoreMaxNum
* sizeof (UINTN
), (EfiVarStoreMaxNum
+ BASE_NUMBER
) * sizeof (UINTN
), EfiVarStoreList
);
844 EfiVarStoreMaxNum
= EfiVarStoreMaxNum
+ BASE_NUMBER
;
846 IfrEfiVarStore
= (EFI_IFR_VARSTORE_EFI
*) IfrOpHdr
;
848 // Convert VarStore Name from ASCII string to Unicode string.
850 EfiVarStoreList
[EfiVarStoreNumber
] = AllocatePool (IfrEfiVarStore
->Header
.Length
+ AsciiStrSize ((CHAR8
*)IfrEfiVarStore
->Name
));
851 CopyMem (EfiVarStoreList
[EfiVarStoreNumber
], IfrEfiVarStore
, IfrEfiVarStore
->Header
.Length
);
852 AsciiStrToUnicodeStrS ((CHAR8
*)IfrEfiVarStore
->Name
, (CHAR16
*) &(EfiVarStoreList
[EfiVarStoreNumber
]->Name
[0]), AsciiStrSize ((CHAR8
*)IfrEfiVarStore
->Name
) * sizeof (CHAR16
));
853 Status
= FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_STANDARD
, EfiVarStoreList
[EfiVarStoreNumber
], &VarStoreQuestionHeader
, NULL
, IfrEfiVarStore
->Size
, FALSE
);
854 if (!EFI_ERROR (Status
)) {
855 EfiVarStoreNumber
++;
857 FreePool (EfiVarStoreList
[EfiVarStoreNumber
]);
858 EfiVarStoreList
[EfiVarStoreNumber
] = NULL
;
861 case EFI_IFR_DEFAULTSTORE_OP
:
862 if (DefaultIdNumber
>= DefaultIdMaxNum
) {
864 // Reallocate DefaultIdNumber
866 DefaultIdList
= ReallocatePool (DefaultIdMaxNum
* sizeof (UINT16
), (DefaultIdMaxNum
+ BASE_NUMBER
) * sizeof (UINT16
), DefaultIdList
);
867 DefaultIdMaxNum
= DefaultIdMaxNum
+ BASE_NUMBER
;
869 DefaultIdList
[DefaultIdNumber
++] = ((EFI_IFR_DEFAULTSTORE
*) IfrOpHdr
)->DefaultId
;
871 case EFI_IFR_FORM_OP
:
872 case EFI_IFR_FORM_MAP_OP
:
874 // No EFI varstore is found and directly return.
876 if (EfiVarStoreNumber
== 0 || DefaultIdNumber
== 0) {
880 case EFI_IFR_CHECKBOX_OP
:
881 IfrScope
= IfrOpHdr
->Scope
;
882 IfrQuestionType
= IfrOpHdr
->OpCode
;
883 IfrQuestionHdr
= (EFI_IFR_QUESTION_HEADER
*) (IfrOpHdr
+ 1);
884 IfrCheckBox
= (EFI_IFR_CHECKBOX
*) (IfrOpHdr
+ 1);
885 EfiVarStoreIndex
= IsEfiVarStoreQuestion (IfrQuestionHdr
, EfiVarStoreList
, EfiVarStoreNumber
);
886 Width
= sizeof (BOOLEAN
);
887 if (EfiVarStoreIndex
< EfiVarStoreNumber
) {
888 for (Index
= 0; Index
< DefaultIdNumber
; Index
++) {
889 if (DefaultIdList
[Index
] == EFI_HII_DEFAULT_CLASS_STANDARD
) {
890 Status
= FindQuestionDefaultSetting (DefaultIdList
[Index
], EfiVarStoreList
[EfiVarStoreIndex
], IfrQuestionHdr
, &IfrValue
, sizeof (BOOLEAN
), QuestionReferBitField
);
891 if (!EFI_ERROR (Status
)) {
893 IfrCheckBox
->Flags
= IfrCheckBox
->Flags
| EFI_IFR_CHECKBOX_DEFAULT
;
895 IfrCheckBox
->Flags
= IfrCheckBox
->Flags
& (~EFI_IFR_CHECKBOX_DEFAULT
);
898 } else if (DefaultIdList
[Index
] == EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
899 Status
= FindQuestionDefaultSetting (DefaultIdList
[Index
], EfiVarStoreList
[EfiVarStoreIndex
], IfrQuestionHdr
, &IfrValue
, sizeof (BOOLEAN
), QuestionReferBitField
);
900 if (!EFI_ERROR (Status
)) {
902 IfrCheckBox
->Flags
= IfrCheckBox
->Flags
| EFI_IFR_CHECKBOX_DEFAULT_MFG
;
904 IfrCheckBox
->Flags
= IfrCheckBox
->Flags
& (~EFI_IFR_CHECKBOX_DEFAULT_MFG
);
911 case EFI_IFR_NUMERIC_OP
:
912 IfrScope
= IfrOpHdr
->Scope
;
913 IfrQuestionType
= IfrOpHdr
->OpCode
;
914 IfrQuestionHdr
= (EFI_IFR_QUESTION_HEADER
*) (IfrOpHdr
+ 1);
915 if (QuestionReferBitField
) {
916 Width
= (UINTN
) (((EFI_IFR_ONE_OF
*) IfrOpHdr
)->Flags
& EDKII_IFR_NUMERIC_SIZE_BIT
);
918 Width
= (UINTN
) ((UINT32
) 1 << (((EFI_IFR_ONE_OF
*) IfrOpHdr
)->Flags
& EFI_IFR_NUMERIC_SIZE
));
921 case EFI_IFR_ONE_OF_OP
:
922 IfrScope
= IfrOpHdr
->Scope
;
923 IfrQuestionType
= IfrOpHdr
->OpCode
;
924 IfrQuestionHdr
= (EFI_IFR_QUESTION_HEADER
*) (IfrOpHdr
+ 1);
925 if (QuestionReferBitField
) {
926 Width
= (UINTN
) (((EFI_IFR_ONE_OF
*) IfrOpHdr
)->Flags
& EDKII_IFR_NUMERIC_SIZE_BIT
);
928 Width
= (UINTN
) ((UINT32
) 1 << (((EFI_IFR_ONE_OF
*) IfrOpHdr
)->Flags
& EFI_IFR_NUMERIC_SIZE
));
930 EfiVarStoreIndex
= IsEfiVarStoreQuestion (IfrQuestionHdr
, EfiVarStoreList
, EfiVarStoreNumber
);
931 StandardDefaultIsSet
= FALSE
;
932 ManufactDefaultIsSet
= FALSE
;
934 // Find Default and Manufacturing default for OneOf question
936 if (EfiVarStoreIndex
< EfiVarStoreNumber
) {
937 for (Index
= 0; Index
< DefaultIdNumber
; Index
++) {
938 if (DefaultIdList
[Index
] == EFI_HII_DEFAULT_CLASS_STANDARD
) {
939 Status
= FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_STANDARD
, EfiVarStoreList
[EfiVarStoreIndex
], IfrQuestionHdr
, &IfrValue
, Width
, QuestionReferBitField
);
940 if (!EFI_ERROR (Status
)) {
941 StandardDefaultIsSet
= TRUE
;
943 } else if (DefaultIdList
[Index
] == EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
944 Status
= FindQuestionDefaultSetting (EFI_HII_DEFAULT_CLASS_MANUFACTURING
, EfiVarStoreList
[EfiVarStoreIndex
], IfrQuestionHdr
, &IfrManufactValue
, Width
, QuestionReferBitField
);
945 if (!EFI_ERROR (Status
)) {
946 ManufactDefaultIsSet
= TRUE
;
952 case EFI_IFR_ORDERED_LIST_OP
:
953 IfrScope
= IfrOpHdr
->Scope
;
954 IfrQuestionType
= IfrOpHdr
->OpCode
;
955 IfrQuestionHdr
= (EFI_IFR_QUESTION_HEADER
*) (IfrOpHdr
+ 1);
957 case EFI_IFR_ONE_OF_OPTION_OP
:
958 if (IfrQuestionHdr
!= NULL
&& IfrScope
> 0) {
959 IfrOneOfOption
= (EFI_IFR_ONE_OF_OPTION
*) IfrOpHdr
;
960 if (IfrQuestionType
== EFI_IFR_ONE_OF_OP
) {
961 Width
= (UINTN
) ((UINT32
) 1 << (IfrOneOfOption
->Flags
& EFI_IFR_NUMERIC_SIZE
));
962 if (StandardDefaultIsSet
) {
963 if (CompareMem (&IfrOneOfOption
->Value
, &IfrValue
, Width
) == 0) {
964 IfrOneOfOption
->Flags
|= EFI_IFR_OPTION_DEFAULT
;
966 IfrOneOfOption
->Flags
&= ~EFI_IFR_OPTION_DEFAULT
;
969 if (ManufactDefaultIsSet
) {
970 if (CompareMem (&IfrOneOfOption
->Value
, &IfrManufactValue
, Width
) == 0) {
971 IfrOneOfOption
->Flags
|= EFI_IFR_OPTION_DEFAULT_MFG
;
973 IfrOneOfOption
->Flags
&= ~EFI_IFR_OPTION_DEFAULT_MFG
;
979 case EFI_IFR_DEFAULT_OP
:
980 if (IfrQuestionHdr
!= NULL
&& IfrScope
> 0) {
981 IfrDefault
= (EFI_IFR_DEFAULT
*) IfrOpHdr
;
983 // Collect default value width
985 if (!QuestionReferBitField
) {
987 if (IfrDefault
->Type
== EFI_IFR_TYPE_NUM_SIZE_8
|| IfrDefault
->Type
== EFI_IFR_TYPE_BOOLEAN
) {
989 } else if (IfrDefault
->Type
== EFI_IFR_TYPE_NUM_SIZE_16
) {
991 } else if (IfrDefault
->Type
== EFI_IFR_TYPE_NUM_SIZE_32
) {
993 } else if (IfrDefault
->Type
== EFI_IFR_TYPE_NUM_SIZE_64
) {
995 } else if (IfrDefault
->Type
== EFI_IFR_TYPE_BUFFER
) {
996 Width
= IfrDefault
->Header
.Length
- OFFSET_OF (EFI_IFR_DEFAULT
, Value
);
1000 // Update the default value
1003 EfiVarStoreIndex
= IsEfiVarStoreQuestion (IfrQuestionHdr
, EfiVarStoreList
, EfiVarStoreNumber
);
1004 if (EfiVarStoreIndex
< EfiVarStoreNumber
) {
1005 Status
= FindQuestionDefaultSetting (IfrDefault
->DefaultId
, EfiVarStoreList
[EfiVarStoreIndex
], IfrQuestionHdr
, &IfrDefault
->Value
, Width
, QuestionReferBitField
);
1010 case EFI_IFR_END_OP
:
1011 if (IfrQuestionHdr
!= NULL
) {
1015 if (IfrScope
== 0) {
1016 IfrQuestionHdr
= NULL
;
1017 QuestionReferBitField
= FALSE
;
1021 case EFI_IFR_GUID_OP
:
1022 if (CompareGuid ((EFI_GUID
*)((UINT8
*)IfrOpHdr
+ sizeof (EFI_IFR_OP_HEADER
)), &gEdkiiIfrBitVarstoreGuid
)) {
1023 QuestionReferBitField
= TRUE
;
1029 IfrOffset
= IfrOffset
+ IfrOpHdr
->Length
;
1030 IfrOpHdr
= (EFI_IFR_OP_HEADER
*) ((UINT8
*) IfrOpHdr
+ IfrOpHdr
->Length
);
1032 IfrScope
+= IfrOpHdr
->Scope
;
1037 for (Index
= 0; Index
< EfiVarStoreNumber
; Index
++) {
1038 FreePool (EfiVarStoreList
[Index
]);
1044 This function insert a Form package to a package list node.
1045 This is a internal function.
1047 @param PackageHdr Pointer to a buffer stored with Form package
1049 @param NotifyType The type of change concerning the database.
1050 @param PackageList Pointer to a package list which will be inserted
1052 @param Package Created Form package
1054 @retval EFI_SUCCESS Form Package is inserted successfully.
1055 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1057 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1062 IN VOID
*PackageHdr
,
1063 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1064 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1065 OUT HII_IFR_PACKAGE_INSTANCE
**Package
1068 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
1069 EFI_HII_PACKAGE_HEADER PackageHeader
;
1071 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1072 return EFI_INVALID_PARAMETER
;
1076 // Get the length of the package, including package header itself
1078 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1081 // Create a Form package node
1083 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
1084 if (FormPackage
== NULL
) {
1085 return EFI_OUT_OF_RESOURCES
;
1088 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
1089 if (FormPackage
->IfrData
== NULL
) {
1090 FreePool (FormPackage
);
1091 return EFI_OUT_OF_RESOURCES
;
1094 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
1096 // Copy Package Header
1098 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
1101 // Copy Ifr contents
1104 FormPackage
->IfrData
,
1105 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1106 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
1109 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
1110 *Package
= FormPackage
;
1113 // Update FormPackage with the default setting
1115 UpdateDefaultSettingInFormPackage (FormPackage
);
1117 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1118 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
1125 This function exports Form packages to a buffer.
1126 This is a internal function.
1128 @param Private Hii database private structure.
1129 @param Handle Identification of a package list.
1130 @param PackageList Pointer to a package list which will be exported.
1131 @param UsedSize The length of buffer be used.
1132 @param BufferSize Length of the Buffer.
1133 @param Buffer Allocated space for storing exported data.
1134 @param ResultSize The size of the already exported content of this
1137 @retval EFI_SUCCESS Form Packages are exported successfully.
1138 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1142 ExportFormPackages (
1143 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1144 IN EFI_HII_HANDLE Handle
,
1145 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1147 IN UINTN BufferSize
,
1148 IN OUT VOID
*Buffer
,
1149 IN OUT UINTN
*ResultSize
1152 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
1153 UINTN PackageLength
;
1157 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1158 return EFI_INVALID_PARAMETER
;
1161 if (BufferSize
> 0 && Buffer
== NULL
) {
1162 return EFI_INVALID_PARAMETER
;
1166 Status
= EFI_SUCCESS
;
1169 // Export Form packages.
1171 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
1172 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
1173 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
1174 if ((Buffer
!= NULL
) && (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
)) {
1176 // Invoke registered notification if exists
1178 Status
= InvokeRegisteredFunction (
1180 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1181 (VOID
*) FormPackage
,
1182 EFI_HII_PACKAGE_FORMS
,
1185 ASSERT_EFI_ERROR (Status
);
1187 // Copy the Form package content.
1189 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
1190 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
1193 (VOID
*) FormPackage
->IfrData
,
1194 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
1196 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
1200 *ResultSize
+= PackageLength
;
1208 This function deletes all Form packages from a package list node.
1209 This is a internal function.
1211 @param Private Hii database private data.
1212 @param Handle Handle of the package list which contains the to
1213 be removed Form packages.
1214 @param PackageList Pointer to a package list that contains removing
1217 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
1218 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1222 RemoveFormPackages (
1223 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1224 IN EFI_HII_HANDLE Handle
,
1225 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1228 LIST_ENTRY
*ListHead
;
1229 HII_IFR_PACKAGE_INSTANCE
*Package
;
1232 ListHead
= &PackageList
->FormPkgHdr
;
1234 while (!IsListEmpty (ListHead
)) {
1236 ListHead
->ForwardLink
,
1237 HII_IFR_PACKAGE_INSTANCE
,
1239 HII_IFR_PACKAGE_SIGNATURE
1241 Status
= InvokeRegisteredFunction (
1243 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1245 EFI_HII_PACKAGE_FORMS
,
1248 if (EFI_ERROR (Status
)) {
1252 RemoveEntryList (&Package
->IfrEntry
);
1253 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
1254 FreePool (Package
->IfrData
);
1257 // If Hii runtime support feature is enabled,
1258 // will export Hii info for runtime use after ReadyToBoot event triggered.
1259 // If some driver add/update/remove packages from HiiDatabase after ReadyToBoot,
1260 // will need to export the content of HiiDatabase.
1261 // But if form packages removed, also need to export the ConfigResp string
1263 if (gExportAfterReadyToBoot
) {
1264 gExportConfigResp
= TRUE
;
1274 This function insert a String package to a package list node.
1275 This is a internal function.
1277 @param Private Hii database private structure.
1278 @param PackageHdr Pointer to a buffer stored with String package
1280 @param NotifyType The type of change concerning the database.
1281 @param PackageList Pointer to a package list which will be inserted
1283 @param Package Created String package
1285 @retval EFI_SUCCESS String Package is inserted successfully.
1286 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1288 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1289 @retval EFI_UNSUPPORTED A string package with the same language already
1290 exists in current package list.
1294 InsertStringPackage (
1295 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1296 IN VOID
*PackageHdr
,
1297 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1298 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1299 OUT HII_STRING_PACKAGE_INSTANCE
**Package
1302 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1305 EFI_HII_PACKAGE_HEADER PackageHeader
;
1307 UINT32 LanguageSize
;
1310 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1311 return EFI_INVALID_PARAMETER
;
1313 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
1314 return EFI_INVALID_PARAMETER
;
1317 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1318 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1321 // It is illegal to have two string packages with same language within one packagelist
1322 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
1324 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
1325 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
1326 if (Language
== NULL
) {
1327 return EFI_OUT_OF_RESOURCES
;
1329 AsciiStrCpyS (Language
, LanguageSize
/ sizeof (CHAR8
), (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
1330 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1331 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1332 if (HiiCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
1333 FreePool (Language
);
1334 return EFI_UNSUPPORTED
;
1337 FreePool (Language
);
1340 // Create a String package node
1342 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
1343 if (StringPackage
== NULL
) {
1344 Status
= EFI_OUT_OF_RESOURCES
;
1348 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1349 if (StringPackage
->StringPkgHdr
== NULL
) {
1350 Status
= EFI_OUT_OF_RESOURCES
;
1354 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1355 if (StringPackage
->StringBlock
== NULL
) {
1356 Status
= EFI_OUT_OF_RESOURCES
;
1360 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
1361 StringPackage
->FontId
= 0;
1362 InitializeListHead (&StringPackage
->FontInfoList
);
1365 // Copy the String package header.
1367 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
1370 // Copy the String blocks
1373 StringPackage
->StringBlock
,
1374 (UINT8
*) PackageHdr
+ HeaderSize
,
1375 PackageHeader
.Length
- HeaderSize
1379 // Collect all font block info
1381 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, &StringPackage
->MaxStringId
, NULL
);
1382 if (EFI_ERROR (Status
)) {
1387 // Insert to String package array
1389 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
1390 *Package
= StringPackage
;
1392 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1393 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1400 if (StringPackage
!= NULL
) {
1401 if (StringPackage
->StringBlock
!= NULL
) {
1402 FreePool (StringPackage
->StringBlock
);
1404 if (StringPackage
->StringPkgHdr
!= NULL
) {
1405 FreePool (StringPackage
->StringPkgHdr
);
1407 FreePool (StringPackage
);
1414 Adjust all string packages in a single package list to have the same max string ID.
1416 @param PackageList Pointer to a package list which will be adjusted.
1418 @retval EFI_SUCCESS Adjust all string packages successfully.
1419 @retval others Can't adjust string packages.
1423 AdjustStringPackage (
1424 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1428 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1429 UINT32 Skip2BlockSize
;
1430 UINT32 OldBlockSize
;
1433 EFI_STRING_ID MaxStringId
;
1437 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
1438 Link
!= &PackageList
->StringPkgHdr
;
1439 Link
= Link
->ForwardLink
1441 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1442 if (MaxStringId
< StringPackage
->MaxStringId
) {
1443 MaxStringId
= StringPackage
->MaxStringId
;
1447 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
1448 Link
!= &PackageList
->StringPkgHdr
;
1449 Link
= Link
->ForwardLink
1451 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1452 if (StringPackage
->MaxStringId
< MaxStringId
) {
1453 OldBlockSize
= StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1455 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.
1457 SkipCount
= (UINT16
) (MaxStringId
- StringPackage
->MaxStringId
);
1458 Skip2BlockSize
= (UINT32
) sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
1460 StringBlock
= (UINT8
*) AllocateZeroPool (OldBlockSize
+ Skip2BlockSize
);
1461 if (StringBlock
== NULL
) {
1462 return EFI_OUT_OF_RESOURCES
;
1465 // Copy original string blocks, except the EFI_HII_SIBT_END.
1467 CopyMem (StringBlock
, StringPackage
->StringBlock
, OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
));
1469 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks
1471 BlockPtr
= StringBlock
+ OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
);
1472 *BlockPtr
= EFI_HII_SIBT_SKIP2
;
1473 CopyMem (BlockPtr
+ 1, &SkipCount
, sizeof (UINT16
));
1474 BlockPtr
+= sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
1477 // Append a EFI_HII_SIBT_END block to the end.
1479 *BlockPtr
= EFI_HII_SIBT_END
;
1480 FreePool (StringPackage
->StringBlock
);
1481 StringPackage
->StringBlock
= StringBlock
;
1482 StringPackage
->StringPkgHdr
->Header
.Length
+= Skip2BlockSize
;
1483 PackageList
->PackageListHdr
.PackageLength
+= Skip2BlockSize
;
1484 StringPackage
->MaxStringId
= MaxStringId
;
1492 This function exports String packages to a buffer.
1493 This is a internal function.
1495 @param Private Hii database private structure.
1496 @param Handle Identification of a package list.
1497 @param PackageList Pointer to a package list which will be exported.
1498 @param UsedSize The length of buffer be used.
1499 @param BufferSize Length of the Buffer.
1500 @param Buffer Allocated space for storing exported data.
1501 @param ResultSize The size of the already exported content of this
1504 @retval EFI_SUCCESS String Packages are exported successfully.
1505 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1509 ExportStringPackages (
1510 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1511 IN EFI_HII_HANDLE Handle
,
1512 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1514 IN UINTN BufferSize
,
1515 IN OUT VOID
*Buffer
,
1516 IN OUT UINTN
*ResultSize
1520 UINTN PackageLength
;
1522 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1524 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1525 return EFI_INVALID_PARAMETER
;
1528 if (BufferSize
> 0 && Buffer
== NULL
) {
1529 return EFI_INVALID_PARAMETER
;
1533 Status
= EFI_SUCCESS
;
1535 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1536 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1537 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1538 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1540 // Invoke registered notification function with EXPORT_PACK notify type
1542 Status
= InvokeRegisteredFunction (
1544 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1545 (VOID
*) StringPackage
,
1546 EFI_HII_PACKAGE_STRINGS
,
1549 ASSERT_EFI_ERROR (Status
);
1551 // Copy String package header
1553 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
1554 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
1557 // Copy String blocks information
1561 StringPackage
->StringBlock
,
1562 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
1564 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1568 *ResultSize
+= PackageLength
;
1574 This function deletes all String packages from a package list node.
1575 This is a internal function.
1577 @param Private Hii database private data.
1578 @param Handle Handle of the package list which contains the to
1579 be removed String packages.
1580 @param PackageList Pointer to a package list that contains removing
1583 @retval EFI_SUCCESS String Package(s) is deleted successfully.
1584 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1588 RemoveStringPackages (
1589 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1590 IN EFI_HII_HANDLE Handle
,
1591 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1594 LIST_ENTRY
*ListHead
;
1595 HII_STRING_PACKAGE_INSTANCE
*Package
;
1596 HII_FONT_INFO
*FontInfo
;
1599 ListHead
= &PackageList
->StringPkgHdr
;
1601 while (!IsListEmpty (ListHead
)) {
1603 ListHead
->ForwardLink
,
1604 HII_STRING_PACKAGE_INSTANCE
,
1606 HII_STRING_PACKAGE_SIGNATURE
1608 Status
= InvokeRegisteredFunction (
1610 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1612 EFI_HII_PACKAGE_STRINGS
,
1615 if (EFI_ERROR (Status
)) {
1619 RemoveEntryList (&Package
->StringEntry
);
1620 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1621 FreePool (Package
->StringBlock
);
1622 FreePool (Package
->StringPkgHdr
);
1624 // Delete font information
1626 while (!IsListEmpty (&Package
->FontInfoList
)) {
1628 Package
->FontInfoList
.ForwardLink
,
1631 HII_FONT_INFO_SIGNATURE
1633 RemoveEntryList (&FontInfo
->Entry
);
1634 FreePool (FontInfo
);
1645 This function insert a Font package to a package list node.
1646 This is a internal function.
1648 @param Private Hii database private structure.
1649 @param PackageHdr Pointer to a buffer stored with Font package
1651 @param NotifyType The type of change concerning the database.
1652 @param PackageList Pointer to a package list which will be inserted
1654 @param Package Created Font package
1656 @retval EFI_SUCCESS Font Package is inserted successfully.
1657 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1659 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1660 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1661 exists in current hii database.
1666 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1667 IN VOID
*PackageHdr
,
1668 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1669 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1670 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1673 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1674 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1677 EFI_HII_PACKAGE_HEADER PackageHeader
;
1678 EFI_FONT_INFO
*FontInfo
;
1679 UINT32 FontInfoSize
;
1680 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1682 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1683 return EFI_INVALID_PARAMETER
;
1686 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1687 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1694 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1695 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1696 // attributes and identify a font uniquely.
1698 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1699 if (FontPkgHdr
== NULL
) {
1700 Status
= EFI_OUT_OF_RESOURCES
;
1703 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1705 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1706 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1707 if (FontInfo
== NULL
) {
1708 Status
= EFI_OUT_OF_RESOURCES
;
1711 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1712 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1713 StrCpyS (FontInfo
->FontName
, (FontInfoSize
- OFFSET_OF(EFI_FONT_INFO
,FontName
)) / sizeof (CHAR16
), FontPkgHdr
->FontFamily
);
1715 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1716 Status
= EFI_UNSUPPORTED
;
1721 // Create a Font package node
1723 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1724 if (FontPackage
== NULL
) {
1725 Status
= EFI_OUT_OF_RESOURCES
;
1728 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1729 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1730 InitializeListHead (&FontPackage
->GlyphInfoList
);
1732 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1733 if (FontPackage
->GlyphBlock
== NULL
) {
1734 Status
= EFI_OUT_OF_RESOURCES
;
1737 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1740 // Collect all default character cell information and backup in GlyphInfoList.
1742 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1743 if (EFI_ERROR (Status
)) {
1748 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1751 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1752 if (GlobalFont
== NULL
) {
1753 Status
= EFI_OUT_OF_RESOURCES
;
1756 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1757 GlobalFont
->FontPackage
= FontPackage
;
1758 GlobalFont
->FontInfoSize
= FontInfoSize
;
1759 GlobalFont
->FontInfo
= FontInfo
;
1760 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1763 // Insert this font package to Font package array
1765 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1766 *Package
= FontPackage
;
1768 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1769 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1776 if (FontPkgHdr
!= NULL
) {
1777 FreePool (FontPkgHdr
);
1779 if (FontInfo
!= NULL
) {
1780 FreePool (FontInfo
);
1782 if (FontPackage
!= NULL
) {
1783 if (FontPackage
->GlyphBlock
!= NULL
) {
1784 FreePool (FontPackage
->GlyphBlock
);
1786 FreePool (FontPackage
);
1788 if (GlobalFont
!= NULL
) {
1789 FreePool (GlobalFont
);
1798 This function exports Font packages to a buffer.
1799 This is a internal function.
1801 @param Private Hii database private structure.
1802 @param Handle Identification of a package list.
1803 @param PackageList Pointer to a package list which will be exported.
1804 @param UsedSize The length of buffer be used.
1805 @param BufferSize Length of the Buffer.
1806 @param Buffer Allocated space for storing exported data.
1807 @param ResultSize The size of the already exported content of this
1810 @retval EFI_SUCCESS Font Packages are exported successfully.
1811 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1815 ExportFontPackages (
1816 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1817 IN EFI_HII_HANDLE Handle
,
1818 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1820 IN UINTN BufferSize
,
1821 IN OUT VOID
*Buffer
,
1822 IN OUT UINTN
*ResultSize
1826 UINTN PackageLength
;
1828 HII_FONT_PACKAGE_INSTANCE
*Package
;
1831 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1832 return EFI_INVALID_PARAMETER
;
1835 if (BufferSize
> 0 && Buffer
== NULL
) {
1836 return EFI_INVALID_PARAMETER
;
1840 Status
= EFI_SUCCESS
;
1842 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1843 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1844 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1845 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1847 // Invoke registered notification function with EXPORT_PACK notify type
1849 Status
= InvokeRegisteredFunction (
1851 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1853 EFI_HII_PACKAGE_FONTS
,
1856 ASSERT_EFI_ERROR (Status
);
1858 // Copy Font package header
1860 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1861 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1864 // Copy Glyph blocks information
1868 Package
->GlyphBlock
,
1869 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1871 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1875 *ResultSize
+= PackageLength
;
1881 This function deletes all Font packages from a package list node.
1882 This is a internal function.
1884 @param Private Hii database private data.
1885 @param Handle Handle of the package list which contains the to
1886 be removed Font packages.
1887 @param PackageList Pointer to a package list that contains removing
1890 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1891 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1895 RemoveFontPackages (
1896 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1897 IN EFI_HII_HANDLE Handle
,
1898 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1901 LIST_ENTRY
*ListHead
;
1902 HII_FONT_PACKAGE_INSTANCE
*Package
;
1904 HII_GLYPH_INFO
*GlyphInfo
;
1906 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1908 ListHead
= &PackageList
->FontPkgHdr
;
1910 while (!IsListEmpty (ListHead
)) {
1912 ListHead
->ForwardLink
,
1913 HII_FONT_PACKAGE_INSTANCE
,
1915 HII_FONT_PACKAGE_SIGNATURE
1917 Status
= InvokeRegisteredFunction (
1919 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1921 EFI_HII_PACKAGE_FONTS
,
1924 if (EFI_ERROR (Status
)) {
1928 RemoveEntryList (&Package
->FontEntry
);
1929 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1931 if (Package
->GlyphBlock
!= NULL
) {
1932 FreePool (Package
->GlyphBlock
);
1934 FreePool (Package
->FontPkgHdr
);
1936 // Delete default character cell information
1938 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1940 Package
->GlyphInfoList
.ForwardLink
,
1943 HII_GLYPH_INFO_SIGNATURE
1945 RemoveEntryList (&GlyphInfo
->Entry
);
1946 FreePool (GlyphInfo
);
1950 // Remove corresponding global font info
1952 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1953 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1954 if (GlobalFont
->FontPackage
== Package
) {
1955 RemoveEntryList (&GlobalFont
->Entry
);
1956 FreePool (GlobalFont
->FontInfo
);
1957 FreePool (GlobalFont
);
1970 This function insert a Image package to a package list node.
1971 This is a internal function.
1973 @param PackageHdr Pointer to a buffer stored with Image package
1975 @param NotifyType The type of change concerning the database.
1976 @param PackageList Pointer to a package list which will be inserted
1978 @param Package Created Image package
1980 @retval EFI_SUCCESS Image Package is inserted successfully.
1981 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1983 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1987 InsertImagePackage (
1988 IN VOID
*PackageHdr
,
1989 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1990 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1991 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1994 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1998 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1999 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
2000 UINT32 PaletteInfoOffset
;
2001 UINT32 ImageInfoOffset
;
2004 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2005 return EFI_INVALID_PARAMETER
;
2009 // Less than one image package is allowed in one package list.
2011 if (PackageList
->ImagePkg
!= NULL
) {
2012 return EFI_INVALID_PARAMETER
;
2016 // Create a Image package node
2018 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
2019 if (ImagePackage
== NULL
) {
2020 return EFI_OUT_OF_RESOURCES
;
2024 // Copy the Image package header.
2026 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
2028 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
2029 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
2032 // If PaletteInfoOffset is zero, there are no palettes in this image package.
2035 ImagePackage
->PaletteBlock
= NULL
;
2036 if (PaletteInfoOffset
!= 0) {
2037 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
2038 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
2039 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
2041 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
2042 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
2043 CurrentSize
+= sizeof (UINT16
);
2044 PaletteSize
+= (UINT32
) CurrentSize
;
2045 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
2048 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
2049 if (ImagePackage
->PaletteBlock
== NULL
) {
2050 FreePool (ImagePackage
);
2051 return EFI_OUT_OF_RESOURCES
;
2054 ImagePackage
->PaletteBlock
,
2055 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
2061 // If ImageInfoOffset is zero, there are no images in this package.
2064 ImagePackage
->ImageBlock
= NULL
;
2065 if (ImageInfoOffset
!= 0) {
2066 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
2067 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
2068 ImagePackage
->ImageBlock
= AllocateZeroPool (ImageSize
);
2069 if (ImagePackage
->ImageBlock
== NULL
) {
2070 FreePool (ImagePackage
->PaletteBlock
);
2071 FreePool (ImagePackage
);
2072 return EFI_OUT_OF_RESOURCES
;
2075 ImagePackage
->ImageBlock
,
2076 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
2081 ImagePackage
->ImageBlockSize
= ImageSize
;
2082 ImagePackage
->PaletteInfoSize
= PaletteSize
;
2083 PackageList
->ImagePkg
= ImagePackage
;
2084 *Package
= ImagePackage
;
2086 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2087 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
2095 This function exports Image packages to a buffer.
2096 This is a internal function.
2098 @param Private Hii database private structure.
2099 @param Handle Identification of a package list.
2100 @param PackageList Pointer to a package list which will be exported.
2101 @param UsedSize The length of buffer be used.
2102 @param BufferSize Length of the Buffer.
2103 @param Buffer Allocated space for storing exported data.
2104 @param ResultSize The size of the already exported content of this
2107 @retval EFI_SUCCESS Image Packages are exported successfully.
2108 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2112 ExportImagePackages (
2113 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2114 IN EFI_HII_HANDLE Handle
,
2115 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2117 IN UINTN BufferSize
,
2118 IN OUT VOID
*Buffer
,
2119 IN OUT UINTN
*ResultSize
2122 UINTN PackageLength
;
2124 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
2127 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2128 return EFI_INVALID_PARAMETER
;
2131 if (BufferSize
> 0 && Buffer
== NULL
) {
2132 return EFI_INVALID_PARAMETER
;
2135 Package
= PackageList
->ImagePkg
;
2137 if (Package
== NULL
) {
2141 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
2143 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2145 // Invoke registered notification function with EXPORT_PACK notify type
2147 Status
= InvokeRegisteredFunction (
2149 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2151 EFI_HII_PACKAGE_IMAGES
,
2154 ASSERT_EFI_ERROR (Status
);
2155 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
2156 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
2158 // Copy Image package header,
2159 // then justify the offset for image info and palette info in the header.
2161 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
2162 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
2165 // Copy Image blocks information
2167 if (Package
->ImageBlockSize
!= 0) {
2168 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
2169 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
2172 // Copy Palette information
2174 if (Package
->PaletteInfoSize
!= 0) {
2175 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
2176 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
2180 *ResultSize
+= PackageLength
;
2186 This function deletes Image package from a package list node.
2187 This is a internal function.
2189 @param Private Hii database private data.
2190 @param Handle Handle of the package list which contains the to
2191 be removed Image packages.
2192 @param PackageList Package List which contains the to be removed
2195 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
2196 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2200 RemoveImagePackages (
2201 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2202 IN EFI_HII_HANDLE Handle
,
2203 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2206 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
2209 Package
= PackageList
->ImagePkg
;
2212 // Image package does not exist, return directly.
2214 if (Package
== NULL
) {
2218 Status
= InvokeRegisteredFunction (
2220 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2222 EFI_HII_PACKAGE_IMAGES
,
2225 if (EFI_ERROR (Status
)) {
2229 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
2231 FreePool (Package
->ImageBlock
);
2232 if (Package
->PaletteBlock
!= NULL
) {
2233 FreePool (Package
->PaletteBlock
);
2237 PackageList
->ImagePkg
= NULL
;
2244 This function insert a Simple Font package to a package list node.
2245 This is a internal function.
2247 @param PackageHdr Pointer to a buffer stored with Simple Font
2248 package information.
2249 @param NotifyType The type of change concerning the database.
2250 @param PackageList Pointer to a package list which will be inserted
2252 @param Package Created Simple Font package
2254 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
2255 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2256 Simple Font package.
2257 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2261 InsertSimpleFontPackage (
2262 IN VOID
*PackageHdr
,
2263 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2264 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2265 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
2268 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2270 EFI_HII_PACKAGE_HEADER Header
;
2272 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2273 return EFI_INVALID_PARAMETER
;
2277 // Create a Simple Font package node
2279 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
2280 if (SimpleFontPackage
== NULL
) {
2281 Status
= EFI_OUT_OF_RESOURCES
;
2284 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
2287 // Copy the Simple Font package.
2289 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2291 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
2292 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
2293 Status
= EFI_OUT_OF_RESOURCES
;
2297 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
2300 // Insert to Simple Font package array
2302 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
2303 *Package
= SimpleFontPackage
;
2305 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2306 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
2313 if (SimpleFontPackage
!= NULL
) {
2314 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
2315 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
2317 FreePool (SimpleFontPackage
);
2324 This function exports SimpleFont packages to a buffer.
2325 This is a internal function.
2327 @param Private Hii database private structure.
2328 @param Handle Identification of a package list.
2329 @param PackageList Pointer to a package list which will be exported.
2330 @param UsedSize The length of buffer be used.
2331 @param BufferSize Length of the Buffer.
2332 @param Buffer Allocated space for storing exported data.
2333 @param ResultSize The size of the already exported content of this
2336 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
2337 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2341 ExportSimpleFontPackages (
2342 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2343 IN EFI_HII_HANDLE Handle
,
2344 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2346 IN UINTN BufferSize
,
2347 IN OUT VOID
*Buffer
,
2348 IN OUT UINTN
*ResultSize
2352 UINTN PackageLength
;
2354 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
2356 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2357 return EFI_INVALID_PARAMETER
;
2360 if (BufferSize
> 0 && Buffer
== NULL
) {
2361 return EFI_INVALID_PARAMETER
;
2365 Status
= EFI_SUCCESS
;
2367 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
2368 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
2369 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
2370 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2372 // Invoke registered notification function with EXPORT_PACK notify type
2374 Status
= InvokeRegisteredFunction (
2376 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2378 EFI_HII_PACKAGE_SIMPLE_FONTS
,
2381 ASSERT_EFI_ERROR (Status
);
2384 // Copy SimpleFont package
2386 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
2387 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
2391 *ResultSize
+= PackageLength
;
2397 This function deletes all Simple Font packages from a package list node.
2398 This is a internal function.
2400 @param Private Hii database private data.
2401 @param Handle Handle of the package list which contains the to
2402 be removed Simple Font packages.
2403 @param PackageList Pointer to a package list that contains removing
2406 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
2407 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2411 RemoveSimpleFontPackages (
2412 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2413 IN EFI_HII_HANDLE Handle
,
2414 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2417 LIST_ENTRY
*ListHead
;
2418 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
2421 ListHead
= &PackageList
->SimpleFontPkgHdr
;
2423 while (!IsListEmpty (ListHead
)) {
2425 ListHead
->ForwardLink
,
2426 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
2428 HII_S_FONT_PACKAGE_SIGNATURE
2430 Status
= InvokeRegisteredFunction (
2432 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2434 EFI_HII_PACKAGE_SIMPLE_FONTS
,
2437 if (EFI_ERROR (Status
)) {
2441 RemoveEntryList (&Package
->SimpleFontEntry
);
2442 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
2443 FreePool (Package
->SimpleFontPkgHdr
);
2452 This function insert a Device path package to a package list node.
2453 This is a internal function.
2455 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2457 @param NotifyType The type of change concerning the database.
2458 @param PackageList Pointer to a package list which will be inserted
2461 @retval EFI_SUCCESS Device path Package is inserted successfully.
2462 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2463 Device path package.
2464 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2468 InsertDevicePathPackage (
2469 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2470 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2471 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2474 UINT32 PackageLength
;
2475 EFI_HII_PACKAGE_HEADER Header
;
2477 if (DevicePath
== NULL
|| PackageList
== NULL
) {
2478 return EFI_INVALID_PARAMETER
;
2481 // Less than one device path package is allowed in one package list.
2483 if (PackageList
->DevicePathPkg
!= NULL
) {
2484 return EFI_INVALID_PARAMETER
;
2487 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
2488 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
2489 if (PackageList
->DevicePathPkg
== NULL
) {
2490 return EFI_OUT_OF_RESOURCES
;
2493 Header
.Length
= PackageLength
;
2494 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
2495 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
2497 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
2499 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
2503 // Since Device Path package is created by NewPackageList, either NEW_PACK
2504 // or ADD_PACK should increase the length of package list.
2506 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
2512 This function exports device path package to a buffer.
2513 This is a internal function.
2515 @param Private Hii database private structure.
2516 @param Handle Identification of a package list.
2517 @param PackageList Pointer to a package list which will be exported.
2518 @param UsedSize The length of buffer be used.
2519 @param BufferSize Length of the Buffer.
2520 @param Buffer Allocated space for storing exported data.
2521 @param ResultSize The size of the already exported content of this
2524 @retval EFI_SUCCESS Device path Package is exported successfully.
2525 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2529 ExportDevicePathPackage (
2530 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2531 IN EFI_HII_HANDLE Handle
,
2532 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2534 IN UINTN BufferSize
,
2535 IN OUT VOID
*Buffer
,
2536 IN OUT UINTN
*ResultSize
2541 EFI_HII_PACKAGE_HEADER Header
;
2543 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2544 return EFI_INVALID_PARAMETER
;
2546 if (BufferSize
> 0 && Buffer
== NULL
) {
2547 return EFI_INVALID_PARAMETER
;
2550 Package
= PackageList
->DevicePathPkg
;
2552 if (Package
== NULL
) {
2556 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2558 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2560 // Invoke registered notification function with EXPORT_PACK notify type
2562 Status
= InvokeRegisteredFunction (
2564 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2566 EFI_HII_PACKAGE_DEVICE_PATH
,
2569 ASSERT_EFI_ERROR (Status
);
2572 // Copy Device path package
2574 CopyMem (Buffer
, Package
, Header
.Length
);
2577 *ResultSize
+= Header
.Length
;
2583 This function deletes Device Path package from a package list node.
2584 This is a internal function.
2586 @param Private Hii database private data.
2587 @param Handle Handle of the package list.
2588 @param PackageList Package List which contains the to be removed
2589 Device Path package.
2591 @retval EFI_SUCCESS Device Path Package is deleted successfully.
2592 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2596 RemoveDevicePathPackage (
2597 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2598 IN EFI_HII_HANDLE Handle
,
2599 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2604 EFI_HII_PACKAGE_HEADER Header
;
2606 Package
= PackageList
->DevicePathPkg
;
2609 // No device path, return directly.
2611 if (Package
== NULL
) {
2615 Status
= InvokeRegisteredFunction (
2617 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2619 EFI_HII_PACKAGE_DEVICE_PATH
,
2622 if (EFI_ERROR (Status
)) {
2626 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2627 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2631 PackageList
->DevicePathPkg
= NULL
;
2638 This function will insert a device path package to package list firstly then
2639 invoke notification functions if any.
2640 This is a internal function.
2642 @param Private Hii database private structure.
2643 @param NotifyType The type of change concerning the database.
2644 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2646 @param DatabaseRecord Pointer to a database record contains a package
2647 list which will be inserted to.
2649 @retval EFI_SUCCESS Device path Package is inserted successfully.
2650 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2651 Device path package.
2652 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2656 AddDevicePathPackage (
2657 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2658 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2659 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2660 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2665 if (DevicePath
== NULL
) {
2669 ASSERT (Private
!= NULL
);
2670 ASSERT (DatabaseRecord
!= NULL
);
2673 // Create a device path package and insert to packagelist
2675 Status
= InsertDevicePathPackage (
2678 DatabaseRecord
->PackageList
2680 if (EFI_ERROR (Status
)) {
2684 return InvokeRegisteredFunction (
2687 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2688 EFI_HII_PACKAGE_DEVICE_PATH
,
2689 DatabaseRecord
->Handle
2695 This function insert a Keyboard Layout package to a package list node.
2696 This is a internal function.
2698 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2699 package information.
2700 @param NotifyType The type of change concerning the database.
2701 @param PackageList Pointer to a package list which will be inserted
2703 @param Package Created Keyboard Layout package
2705 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2706 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2707 Keyboard Layout package.
2708 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2712 InsertKeyboardLayoutPackage (
2713 IN VOID
*PackageHdr
,
2714 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2715 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2716 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2719 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2720 EFI_HII_PACKAGE_HEADER PackageHeader
;
2723 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2724 return EFI_INVALID_PARAMETER
;
2727 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2730 // Create a Keyboard Layout package node
2732 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2733 if (KeyboardLayoutPackage
== NULL
) {
2734 Status
= EFI_OUT_OF_RESOURCES
;
2737 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2739 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2740 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2741 Status
= EFI_OUT_OF_RESOURCES
;
2745 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2746 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2748 *Package
= KeyboardLayoutPackage
;
2750 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2751 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2759 if (KeyboardLayoutPackage
!= NULL
) {
2760 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2761 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2763 FreePool (KeyboardLayoutPackage
);
2771 This function exports Keyboard Layout packages to a buffer.
2772 This is a internal function.
2774 @param Private Hii database private structure.
2775 @param Handle Identification of a package list.
2776 @param PackageList Pointer to a package list which will be exported.
2777 @param UsedSize The length of buffer be used.
2778 @param BufferSize Length of the Buffer.
2779 @param Buffer Allocated space for storing exported data.
2780 @param ResultSize The size of the already exported content of this
2783 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2785 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2789 ExportKeyboardLayoutPackages (
2790 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2791 IN EFI_HII_HANDLE Handle
,
2792 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2794 IN UINTN BufferSize
,
2795 IN OUT VOID
*Buffer
,
2796 IN OUT UINTN
*ResultSize
2800 UINTN PackageLength
;
2802 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2803 EFI_HII_PACKAGE_HEADER PackageHeader
;
2805 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2806 return EFI_INVALID_PARAMETER
;
2809 if (BufferSize
> 0 && Buffer
== NULL
) {
2810 return EFI_INVALID_PARAMETER
;
2814 Status
= EFI_SUCCESS
;
2816 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2817 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2818 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2819 PackageLength
+= PackageHeader
.Length
;
2820 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2822 // Invoke registered notification function with EXPORT_PACK notify type
2824 Status
= InvokeRegisteredFunction (
2826 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2827 (EFI_HII_PACKAGE_HEADER
*) Package
,
2828 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2831 ASSERT_EFI_ERROR (Status
);
2834 // Copy Keyboard Layout package
2836 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2837 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2841 *ResultSize
+= PackageLength
;
2847 This function deletes all Keyboard Layout packages from a package list node.
2848 This is a internal function.
2850 @param Private Hii database private data.
2851 @param Handle Handle of the package list which contains the to
2852 be removed Keyboard Layout packages.
2853 @param PackageList Pointer to a package list that contains removing
2856 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2858 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2862 RemoveKeyboardLayoutPackages (
2863 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2864 IN EFI_HII_HANDLE Handle
,
2865 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2868 LIST_ENTRY
*ListHead
;
2869 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2870 EFI_HII_PACKAGE_HEADER PackageHeader
;
2873 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2875 while (!IsListEmpty (ListHead
)) {
2877 ListHead
->ForwardLink
,
2878 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2880 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2882 Status
= InvokeRegisteredFunction (
2884 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2886 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2889 if (EFI_ERROR (Status
)) {
2893 RemoveEntryList (&Package
->KeyboardEntry
);
2894 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2895 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2896 FreePool (Package
->KeyboardPkg
);
2905 This function will insert a package list to hii database firstly then
2906 invoke notification functions if any. It is the worker function of
2907 HiiNewPackageList and HiiUpdatePackageList.
2909 This is a internal function.
2911 @param Private Hii database private structure.
2912 @param NotifyType The type of change concerning the database.
2913 @param PackageList Pointer to a package list.
2914 @param DatabaseRecord Pointer to a database record contains a package
2915 list instance which will be inserted to.
2917 @retval EFI_SUCCESS All incoming packages are inserted to current
2919 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2920 Device path package.
2921 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2926 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2927 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2928 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2929 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2933 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2934 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2935 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2936 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2937 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2938 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2939 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2940 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2941 EFI_HII_PACKAGE_HEADER PackageHeader
;
2942 UINT32 OldPackageListLen
;
2943 BOOLEAN StringPkgIsAdd
;
2946 // Initialize Variables
2948 StringPkgIsAdd
= FALSE
;
2950 StringPackage
= NULL
;
2953 ImagePackage
= NULL
;
2954 SimpleFontPackage
= NULL
;
2955 KeyboardLayoutPackage
= NULL
;
2958 // Process the package list header
2960 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2962 &DatabaseRecord
->PackageList
->PackageListHdr
,
2963 (VOID
*) PackageList
,
2964 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2966 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2967 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2970 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2971 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2973 Status
= EFI_SUCCESS
;
2975 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2976 switch (PackageHeader
.Type
) {
2977 case EFI_HII_PACKAGE_TYPE_GUID
:
2978 Status
= InsertGuidPackage (
2981 DatabaseRecord
->PackageList
,
2984 if (EFI_ERROR (Status
)) {
2987 Status
= InvokeRegisteredFunction (
2990 (VOID
*) GuidPackage
,
2991 (UINT8
) (PackageHeader
.Type
),
2992 DatabaseRecord
->Handle
2995 case EFI_HII_PACKAGE_FORMS
:
2996 Status
= InsertFormPackage (
2999 DatabaseRecord
->PackageList
,
3002 if (EFI_ERROR (Status
)) {
3005 Status
= InvokeRegisteredFunction (
3008 (VOID
*) FormPackage
,
3009 (UINT8
) (PackageHeader
.Type
),
3010 DatabaseRecord
->Handle
3013 // If Hii runtime support feature is enabled,
3014 // will export Hii info for runtime use after ReadyToBoot event triggered.
3015 // If some driver add/update/remove packages from HiiDatabase after ReadyToBoot,
3016 // will need to export the content of HiiDatabase.
3017 // But if form packages added/updated, also need to export the ConfigResp string.
3019 if (gExportAfterReadyToBoot
) {
3020 gExportConfigResp
= TRUE
;
3023 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3024 Status
= InsertKeyboardLayoutPackage (
3027 DatabaseRecord
->PackageList
,
3028 &KeyboardLayoutPackage
3030 if (EFI_ERROR (Status
)) {
3033 Status
= InvokeRegisteredFunction (
3036 (VOID
*) KeyboardLayoutPackage
,
3037 (UINT8
) (PackageHeader
.Type
),
3038 DatabaseRecord
->Handle
3041 case EFI_HII_PACKAGE_STRINGS
:
3042 Status
= InsertStringPackage (
3046 DatabaseRecord
->PackageList
,
3049 if (EFI_ERROR (Status
)) {
3052 ASSERT (StringPackage
!= NULL
);
3053 Status
= InvokeRegisteredFunction (
3056 (VOID
*) StringPackage
,
3057 (UINT8
) (PackageHeader
.Type
),
3058 DatabaseRecord
->Handle
3060 StringPkgIsAdd
= TRUE
;
3062 case EFI_HII_PACKAGE_FONTS
:
3063 Status
= InsertFontPackage (
3067 DatabaseRecord
->PackageList
,
3070 if (EFI_ERROR (Status
)) {
3073 Status
= InvokeRegisteredFunction (
3076 (VOID
*) FontPackage
,
3077 (UINT8
) (PackageHeader
.Type
),
3078 DatabaseRecord
->Handle
3081 case EFI_HII_PACKAGE_IMAGES
:
3082 Status
= InsertImagePackage (
3085 DatabaseRecord
->PackageList
,
3088 if (EFI_ERROR (Status
)) {
3091 Status
= InvokeRegisteredFunction (
3094 (VOID
*) ImagePackage
,
3095 (UINT8
) (PackageHeader
.Type
),
3096 DatabaseRecord
->Handle
3099 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3100 Status
= InsertSimpleFontPackage (
3103 DatabaseRecord
->PackageList
,
3106 if (EFI_ERROR (Status
)) {
3109 Status
= InvokeRegisteredFunction (
3112 (VOID
*) SimpleFontPackage
,
3113 (UINT8
) (PackageHeader
.Type
),
3114 DatabaseRecord
->Handle
3117 case EFI_HII_PACKAGE_DEVICE_PATH
:
3118 Status
= AddDevicePathPackage (
3121 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
3129 if (EFI_ERROR (Status
)) {
3133 // goto header of next package
3135 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3136 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3140 // Adjust String Package to make sure all string packages have the same max string ID.
3142 if (!EFI_ERROR (Status
) && StringPkgIsAdd
) {
3143 Status
= AdjustStringPackage (DatabaseRecord
->PackageList
);
3151 This function exports a package list to a buffer. It is the worker function
3152 of HiiExportPackageList.
3154 This is a internal function.
3156 @param Private Hii database private structure.
3157 @param Handle Identification of a package list.
3158 @param PackageList Pointer to a package list which will be exported.
3159 @param UsedSize The length of buffer has been used by exporting
3160 package lists when Handle is NULL.
3161 @param BufferSize Length of the Buffer.
3162 @param Buffer Allocated space for storing exported data.
3164 @retval EFI_SUCCESS Keyboard Layout Packages are exported
3166 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
3171 IN HII_DATABASE_PRIVATE_DATA
*Private
,
3172 IN EFI_HII_HANDLE Handle
,
3173 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
3174 IN OUT UINTN
*UsedSize
,
3175 IN UINTN BufferSize
,
3176 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3181 EFI_HII_PACKAGE_HEADER EndofPackageList
;
3183 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
3184 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
3185 ASSERT (IsHiiHandleValid (Handle
));
3187 if (BufferSize
> 0 && Buffer
== NULL
) {
3188 return EFI_INVALID_PARAMETER
;
3192 // Copy the package list header
3193 // ResultSize indicates the length of the exported bytes of this package list
3195 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
3196 if (ResultSize
+ *UsedSize
<= BufferSize
) {
3197 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
3200 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
3202 Status
= ExportGuidPackages (
3208 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3211 if (EFI_ERROR (Status
)) {
3214 Status
= ExportFormPackages (
3220 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3223 if (EFI_ERROR (Status
)) {
3226 Status
= ExportKeyboardLayoutPackages (
3232 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3235 if (EFI_ERROR (Status
)) {
3238 Status
= ExportStringPackages (
3244 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3247 if (EFI_ERROR (Status
)) {
3250 Status
= ExportFontPackages (
3256 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3259 if (EFI_ERROR (Status
)) {
3262 Status
= ExportImagePackages (
3268 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3271 if (EFI_ERROR (Status
)) {
3274 Status
= ExportSimpleFontPackages (
3280 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3283 if (EFI_ERROR (Status
)) {
3286 Status
= ExportDevicePathPackage (
3292 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3295 if (EFI_ERROR (Status
)) {
3299 // Append the package list end.
3301 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
3302 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
3303 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
3305 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
3306 (VOID
*) &EndofPackageList
,
3307 sizeof (EFI_HII_PACKAGE_HEADER
)
3311 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
3317 This function mainly use to get and update ConfigResp string.
3319 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
3321 @retval EFI_SUCCESS Get the information successfully.
3322 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.
3326 HiiGetConfigRespInfo(
3327 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
3331 HII_DATABASE_PRIVATE_DATA
*Private
;
3332 EFI_STRING ConfigAltResp
;
3335 ConfigAltResp
= NULL
;
3338 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3341 // Get ConfigResp string
3343 Status
= HiiConfigRoutingExportConfig(&Private
->ConfigRouting
,&ConfigAltResp
);
3345 if (!EFI_ERROR (Status
)){
3346 ConfigSize
= StrSize(ConfigAltResp
);
3347 if (ConfigSize
> gConfigRespSize
){
3348 gConfigRespSize
= ConfigSize
;
3349 if (gRTConfigRespBuffer
!= NULL
){
3350 FreePool(gRTConfigRespBuffer
);
3352 gRTConfigRespBuffer
= (EFI_STRING
)AllocateRuntimeZeroPool(ConfigSize
);
3353 if (gRTConfigRespBuffer
== NULL
){
3354 FreePool(ConfigAltResp
);
3355 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the ConfigResp string.\n"));
3356 return EFI_OUT_OF_RESOURCES
;
3359 ZeroMem(gRTConfigRespBuffer
,gConfigRespSize
);
3361 CopyMem(gRTConfigRespBuffer
,ConfigAltResp
,ConfigSize
);
3362 gBS
->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid
, gRTConfigRespBuffer
);
3363 FreePool(ConfigAltResp
);
3371 This is an internal function,mainly use to get HiiDatabase information.
3373 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
3375 @retval EFI_SUCCESS Get the information successfully.
3376 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Hiidatabase data.
3381 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
3385 EFI_HII_PACKAGE_LIST_HEADER
*DatabaseInfo
;
3386 UINTN DatabaseInfoSize
;
3388 DatabaseInfo
= NULL
;
3389 DatabaseInfoSize
= 0;
3392 // Get HiiDatabase information.
3394 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, DatabaseInfo
);
3396 ASSERT(Status
== EFI_BUFFER_TOO_SMALL
);
3398 if(DatabaseInfoSize
> gDatabaseInfoSize
) {
3399 gDatabaseInfoSize
= DatabaseInfoSize
;
3400 if (gRTDatabaseInfoBuffer
!= NULL
){
3401 FreePool(gRTDatabaseInfoBuffer
);
3403 gRTDatabaseInfoBuffer
= AllocateRuntimeZeroPool(DatabaseInfoSize
);
3404 if (gRTDatabaseInfoBuffer
== NULL
){
3405 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the HiiDatabase info.\n"));
3406 return EFI_OUT_OF_RESOURCES
;
3409 ZeroMem(gRTDatabaseInfoBuffer
,gDatabaseInfoSize
);
3411 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, gRTDatabaseInfoBuffer
);
3412 ASSERT_EFI_ERROR (Status
);
3413 gBS
->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid
, gRTDatabaseInfoBuffer
);
3420 This function mainly use to get and update configuration settings information.
3422 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
3424 @retval EFI_SUCCESS Get the information successfully.
3425 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.
3429 HiiGetConfigurationSetting(
3430 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
3436 // Get the HiiDatabase info.
3438 Status
= HiiGetDatabaseInfo(This
);
3441 // Get ConfigResp string
3443 if (gExportConfigResp
) {
3444 Status
= HiiGetConfigRespInfo (This
);
3445 gExportConfigResp
= FALSE
;
3453 This function adds the packages in the package list to the database and returns a handle. If there is a
3454 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
3455 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
3457 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3459 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
3461 @param DriverHandle Associate the package list with this EFI handle.
3462 If a NULL is specified, this data will not be associate
3463 with any drivers and cannot have a callback induced.
3464 @param Handle A pointer to the EFI_HII_HANDLE instance.
3466 @retval EFI_SUCCESS The package list associated with the Handle was
3467 added to the HII database.
3468 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
3470 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
3471 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
3477 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3478 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
3479 IN CONST EFI_HANDLE DriverHandle
, OPTIONAL
3480 OUT EFI_HII_HANDLE
*Handle
3484 HII_DATABASE_PRIVATE_DATA
*Private
;
3485 HII_DATABASE_RECORD
*DatabaseRecord
;
3486 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
3488 EFI_GUID PackageListGuid
;
3490 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
3491 return EFI_INVALID_PARAMETER
;
3494 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3495 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
3498 // Check the Package list GUID to guarantee this GUID is unique in database.
3500 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3501 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3503 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
3504 &PackageListGuid
) &&
3505 DatabaseRecord
->DriverHandle
== DriverHandle
) {
3506 return EFI_INVALID_PARAMETER
;
3511 // Build a PackageList node
3513 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
3514 if (EFI_ERROR (Status
)) {
3519 // Fill in information of the created Package List node
3520 // according to incoming package list.
3522 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
3523 if (EFI_ERROR (Status
)) {
3527 DatabaseRecord
->DriverHandle
= DriverHandle
;
3530 // Create a Device path package and add into the package list if exists.
3532 Status
= gBS
->HandleProtocol (
3534 &gEfiDevicePathProtocolGuid
,
3535 (VOID
**) &DevicePath
3537 if (!EFI_ERROR (Status
)) {
3538 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
3539 ASSERT_EFI_ERROR (Status
);
3542 *Handle
= DatabaseRecord
->Handle
;
3545 // Check whether need to get the Database and configuration setting info.
3546 // Only after ReadyToBoot, need to do the export.
3548 if (gExportAfterReadyToBoot
) {
3549 HiiGetConfigurationSetting(This
);
3557 This function removes the package list that is associated with Handle
3558 from the HII database. Before removing the package, any registered functions
3559 with the notification type REMOVE_PACK and the same package type will be called.
3561 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3563 @param Handle The handle that was registered to the data that is
3564 requested for removal.
3566 @retval EFI_SUCCESS The data associated with the Handle was removed
3567 from the HII database.
3568 @retval EFI_NOT_FOUND The specified handle is not in database.
3569 @retval EFI_INVALID_PARAMETER The Handle was not valid.
3574 HiiRemovePackageList (
3575 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3576 IN EFI_HII_HANDLE Handle
3580 HII_DATABASE_PRIVATE_DATA
*Private
;
3582 HII_DATABASE_RECORD
*Node
;
3583 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3584 HII_HANDLE
*HiiHandle
;
3587 return EFI_INVALID_PARAMETER
;
3590 if (!IsHiiHandleValid (Handle
)) {
3591 return EFI_NOT_FOUND
;
3594 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3597 // Get the packagelist to be removed.
3599 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3600 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3601 if (Node
->Handle
== Handle
) {
3602 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3603 ASSERT (PackageList
!= NULL
);
3606 // Call registered functions with REMOVE_PACK before removing packages
3607 // then remove them.
3609 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
3610 if (EFI_ERROR (Status
)) {
3613 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
3614 if (EFI_ERROR (Status
)) {
3617 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
3618 if (EFI_ERROR (Status
)) {
3621 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
3622 if (EFI_ERROR (Status
)) {
3625 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
3626 if (EFI_ERROR (Status
)) {
3629 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
3630 if (EFI_ERROR (Status
)) {
3633 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
3634 if (EFI_ERROR (Status
)) {
3637 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
3638 if (EFI_ERROR (Status
)) {
3643 // Free resources of the package list
3645 RemoveEntryList (&Node
->DatabaseEntry
);
3647 HiiHandle
= (HII_HANDLE
*) Handle
;
3648 RemoveEntryList (&HiiHandle
->Handle
);
3649 Private
->HiiHandleCount
--;
3650 ASSERT (Private
->HiiHandleCount
>= 0);
3652 HiiHandle
->Signature
= 0;
3653 FreePool (HiiHandle
);
3654 FreePool (Node
->PackageList
);
3658 // Check whether need to get the Database and configuration setting info.
3659 // Only after ReadyToBoot, need to do the export.
3661 if (gExportAfterReadyToBoot
) {
3662 HiiGetConfigurationSetting(This
);
3668 return EFI_NOT_FOUND
;
3673 This function updates the existing package list (which has the specified Handle)
3674 in the HII databases, using the new package list specified by PackageList.
3676 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3678 @param Handle The handle that was registered to the data that is
3679 requested to be updated.
3680 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
3683 @retval EFI_SUCCESS The HII database was successfully updated.
3684 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
3686 @retval EFI_INVALID_PARAMETER PackageList was NULL.
3687 @retval EFI_NOT_FOUND The specified Handle is not in database.
3692 HiiUpdatePackageList (
3693 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3694 IN EFI_HII_HANDLE Handle
,
3695 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
3699 HII_DATABASE_PRIVATE_DATA
*Private
;
3701 HII_DATABASE_RECORD
*Node
;
3702 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
3703 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
3704 EFI_HII_PACKAGE_HEADER PackageHeader
;
3706 if (This
== NULL
|| PackageList
== NULL
) {
3707 return EFI_INVALID_PARAMETER
;
3710 if (!IsHiiHandleValid (Handle
)) {
3711 return EFI_NOT_FOUND
;
3714 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3716 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
3718 Status
= EFI_SUCCESS
;
3721 // Get original packagelist to be updated
3723 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3724 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3725 if (Node
->Handle
== Handle
) {
3726 OldPackageList
= Node
->PackageList
;
3728 // Remove the package if its type matches one of the package types which is
3729 // contained in the new package list.
3731 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3732 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
3733 switch (PackageHeader
.Type
) {
3734 case EFI_HII_PACKAGE_TYPE_GUID
:
3735 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
3737 case EFI_HII_PACKAGE_FORMS
:
3738 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
3740 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3741 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
3743 case EFI_HII_PACKAGE_STRINGS
:
3744 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
3746 case EFI_HII_PACKAGE_FONTS
:
3747 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
3749 case EFI_HII_PACKAGE_IMAGES
:
3750 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
3752 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3753 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
3755 case EFI_HII_PACKAGE_DEVICE_PATH
:
3756 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
3760 if (EFI_ERROR (Status
)) {
3764 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3765 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3769 // Add all of the packages within the new package list
3771 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3774 // Check whether need to get the Database and configuration setting info.
3775 // Only after ReadyToBoot, need to do the export.
3777 if (gExportAfterReadyToBoot
) {
3778 if (Status
== EFI_SUCCESS
){
3779 HiiGetConfigurationSetting(This
);
3787 return EFI_NOT_FOUND
;
3792 This function returns a list of the package handles of the specified type
3793 that are currently active in the database. The pseudo-type
3794 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3796 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3798 @param PackageType Specifies the package type of the packages to list
3799 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3801 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3802 this is the pointer to the GUID which must match
3803 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3804 Otherwise, it must be NULL.
3805 @param HandleBufferLength On input, a pointer to the length of the handle
3806 buffer. On output, the length of the handle
3807 buffer that is required for the handles found.
3808 @param Handle An array of EFI_HII_HANDLE instances returned.
3810 @retval EFI_SUCCESS The matching handles are outputted successfully.
3811 HandleBufferLength is updated with the actual length.
3812 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3813 Handle is too small to support the number of
3814 handles. HandleBufferLength is updated with a
3815 value that will enable the data to fit.
3816 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3817 @retval EFI_INVALID_PARAMETER HandleBufferLength was NULL.
3818 @retval EFI_INVALID_PARAMETER The value referenced by HandleBufferLength was not
3819 zero and Handle was NULL.
3820 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3821 PackageGuid is not NULL, PackageType is a EFI_HII_
3822 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3827 HiiListPackageLists (
3828 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3829 IN UINT8 PackageType
,
3830 IN CONST EFI_GUID
*PackageGuid
,
3831 IN OUT UINTN
*HandleBufferLength
,
3832 OUT EFI_HII_HANDLE
*Handle
3835 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3836 HII_DATABASE_PRIVATE_DATA
*Private
;
3837 HII_DATABASE_RECORD
*Node
;
3840 HII_HANDLE
**Result
;
3842 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3846 // Check input parameters
3848 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3849 return EFI_INVALID_PARAMETER
;
3851 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3852 return EFI_INVALID_PARAMETER
;
3854 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3855 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3856 return EFI_INVALID_PARAMETER
;
3859 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3861 Result
= (HII_HANDLE
**) Handle
;
3864 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3865 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3866 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3867 switch (PackageType
) {
3868 case EFI_HII_PACKAGE_TYPE_GUID
:
3869 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3870 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3872 (EFI_GUID
*) PackageGuid
,
3873 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3880 case EFI_HII_PACKAGE_FORMS
:
3881 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3885 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3886 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3890 case EFI_HII_PACKAGE_STRINGS
:
3891 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3895 case EFI_HII_PACKAGE_FONTS
:
3896 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3900 case EFI_HII_PACKAGE_IMAGES
:
3901 if (PackageList
->ImagePkg
!= NULL
) {
3905 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3906 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3910 case EFI_HII_PACKAGE_DEVICE_PATH
:
3911 if (PackageList
->DevicePathPkg
!= NULL
) {
3916 // Pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3919 case EFI_HII_PACKAGE_TYPE_ALL
:
3927 // This active package list has the specified package type, list it.
3930 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3931 if (ResultSize
<= *HandleBufferLength
) {
3932 *Result
++ = Node
->Handle
;
3938 if (ResultSize
== 0) {
3939 return EFI_NOT_FOUND
;
3942 if (*HandleBufferLength
< ResultSize
) {
3943 *HandleBufferLength
= ResultSize
;
3944 return EFI_BUFFER_TOO_SMALL
;
3947 *HandleBufferLength
= ResultSize
;
3953 This function will export one or all package lists in the database to a buffer.
3954 For each package list exported, this function will call functions registered
3955 with EXPORT_PACK and then copy the package list to the buffer.
3957 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3959 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3960 package list in the HII database to export or NULL
3961 to indicate all package lists should be exported.
3962 @param BufferSize On input, a pointer to the length of the buffer.
3963 On output, the length of the buffer that is
3964 required for the exported data.
3965 @param Buffer A pointer to a buffer that will contain the
3966 results of the export function.
3968 @retval EFI_SUCCESS Package exported.
3969 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3970 Handle is too small to support the number of
3971 handles. HandleBufferLength is updated with a
3972 value that will enable the data to fit.
3973 @retval EFI_NOT_FOUND The specified Handle could not be found in the
3975 @retval EFI_INVALID_PARAMETER BufferSize was NULL.
3976 @retval EFI_INVALID_PARAMETER The value referenced by BufferSize was not zero
3977 and Buffer was NULL.
3982 HiiExportPackageLists (
3983 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3984 IN EFI_HII_HANDLE Handle
,
3985 IN OUT UINTN
*BufferSize
,
3986 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3991 HII_DATABASE_PRIVATE_DATA
*Private
;
3992 HII_DATABASE_RECORD
*Node
;
3995 if (This
== NULL
|| BufferSize
== NULL
) {
3996 return EFI_INVALID_PARAMETER
;
3998 if (*BufferSize
> 0 && Buffer
== NULL
) {
3999 return EFI_INVALID_PARAMETER
;
4001 if ((Handle
!= NULL
) && (!IsHiiHandleValid (Handle
))) {
4002 return EFI_NOT_FOUND
;
4005 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4008 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
4009 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
4010 if (Handle
== NULL
) {
4012 // Export all package lists in current hii database.
4014 Status
= ExportPackageList (
4017 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
4020 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
4022 ASSERT_EFI_ERROR (Status
);
4023 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
4024 Status
= ExportPackageList (
4027 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
4032 ASSERT_EFI_ERROR (Status
);
4033 if (*BufferSize
< UsedSize
) {
4034 *BufferSize
= UsedSize
;
4035 return EFI_BUFFER_TOO_SMALL
;
4041 if (Handle
== NULL
&& UsedSize
!= 0) {
4042 if (*BufferSize
< UsedSize
) {
4043 *BufferSize
= UsedSize
;
4044 return EFI_BUFFER_TOO_SMALL
;
4049 return EFI_NOT_FOUND
;
4054 This function registers a function which will be called when specified actions related to packages of
4055 the specified type occur in the HII database. By registering a function, other HII-related drivers are
4056 notified when specific package types are added, removed or updated in the HII database.
4057 Each driver or application which registers a notification should use
4058 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
4060 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4062 @param PackageType Specifies the package type of the packages to list
4063 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
4065 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
4066 this is the pointer to the GUID which must match
4068 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
4070 @param PackageNotifyFn Points to the function to be called when the event
4072 NotificationType occurs.
4073 @param NotifyType Describes the types of notification which this
4074 function will be receiving.
4075 @param NotifyHandle Points to the unique handle assigned to the
4076 registered notification. Can be used in
4077 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
4078 to stop notifications.
4080 @retval EFI_SUCCESS Notification registered successfully.
4081 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
4082 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
4083 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
4084 EFI_HII_PACKAGE_TYPE_GUID.
4085 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
4086 EFI_HII_PACKAGE_TYPE_GUID.
4091 HiiRegisterPackageNotify (
4092 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4093 IN UINT8 PackageType
,
4094 IN CONST EFI_GUID
*PackageGuid
,
4095 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
4096 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
4097 OUT EFI_HANDLE
*NotifyHandle
4100 HII_DATABASE_PRIVATE_DATA
*Private
;
4101 HII_DATABASE_NOTIFY
*Notify
;
4104 if (This
== NULL
|| NotifyHandle
== NULL
) {
4105 return EFI_INVALID_PARAMETER
;
4107 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
4108 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
4109 return EFI_INVALID_PARAMETER
;
4112 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4115 // Allocate a notification node
4117 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
4118 if (Notify
== NULL
) {
4119 return EFI_OUT_OF_RESOURCES
;
4123 // Generate a notify handle
4125 Status
= gBS
->InstallMultipleProtocolInterfaces (
4126 &Notify
->NotifyHandle
,
4131 ASSERT_EFI_ERROR (Status
);
4134 // Fill in the information to the notification node
4136 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
4137 Notify
->PackageType
= PackageType
;
4138 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
4139 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
4140 Notify
->NotifyType
= NotifyType
;
4142 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
4143 *NotifyHandle
= Notify
->NotifyHandle
;
4150 Removes the specified HII database package-related notification.
4152 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4154 @param NotificationHandle The handle of the notification function being
4157 @retval EFI_SUCCESS Notification is unregistered successfully.
4158 @retval EFI_INVALID_PARAMETER The Handle is invalid.
4159 @retval EFI_NOT_FOUND The incoming notification handle does not exist
4160 in current hii database.
4165 HiiUnregisterPackageNotify (
4166 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4167 IN EFI_HANDLE NotificationHandle
4170 HII_DATABASE_PRIVATE_DATA
*Private
;
4171 HII_DATABASE_NOTIFY
*Notify
;
4176 return EFI_INVALID_PARAMETER
;
4179 if (NotificationHandle
== NULL
) {
4180 return EFI_NOT_FOUND
;
4183 Status
= gBS
->OpenProtocol (
4189 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
4191 if (EFI_ERROR (Status
)) {
4192 return EFI_NOT_FOUND
;
4195 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4197 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
4198 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
4199 if (Notify
->NotifyHandle
== NotificationHandle
) {
4201 // Remove the matching notification node
4203 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
4204 Status
= gBS
->UninstallMultipleProtocolInterfaces (
4205 Notify
->NotifyHandle
,
4210 ASSERT_EFI_ERROR (Status
);
4217 return EFI_NOT_FOUND
;
4222 This routine retrieves an array of GUID values for each keyboard layout that
4223 was previously registered in the system.
4225 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4227 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
4228 GUID buffer. On output, the length of the handle
4229 buffer that is required for the handles found.
4230 @param KeyGuidBuffer An array of keyboard layout GUID instances
4233 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
4234 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
4235 that KeyGuidBuffer is too small to support the
4236 number of GUIDs. KeyGuidBufferLength is
4237 updated with a value that will enable the data to
4239 @retval EFI_INVALID_PARAMETER The KeyGuidBufferLength is NULL.
4240 @retval EFI_INVALID_PARAMETER The value referenced by KeyGuidBufferLength is not
4241 zero and KeyGuidBuffer is NULL.
4242 @retval EFI_NOT_FOUND There was no keyboard layout.
4247 HiiFindKeyboardLayouts (
4248 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4249 IN OUT UINT16
*KeyGuidBufferLength
,
4250 OUT EFI_GUID
*KeyGuidBuffer
4253 HII_DATABASE_PRIVATE_DATA
*Private
;
4254 HII_DATABASE_RECORD
*Node
;
4255 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
4261 UINT16 LayoutLength
;
4263 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
4265 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
4266 return EFI_INVALID_PARAMETER
;
4269 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
4270 return EFI_INVALID_PARAMETER
;
4273 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4277 // Search all package lists in whole database to retrieve keyboard layout.
4279 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
4280 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
4281 PackageList
= Node
->PackageList
;
4282 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
4283 Link1
!= &PackageList
->KeyboardLayoutHdr
;
4284 Link1
= Link1
->ForwardLink
4287 // Find out all Keyboard Layout packages in this package list.
4291 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
4293 HII_KB_LAYOUT_PACKAGE_SIGNATURE
4295 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
4298 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
4301 for (Index
= 0; Index
< LayoutCount
; Index
++) {
4302 ResultSize
+= sizeof (EFI_GUID
);
4303 if (ResultSize
<= *KeyGuidBufferLength
) {
4304 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
4305 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
4306 Layout
= Layout
+ LayoutLength
;
4312 if (ResultSize
== 0) {
4313 return EFI_NOT_FOUND
;
4316 if (*KeyGuidBufferLength
< ResultSize
) {
4317 *KeyGuidBufferLength
= ResultSize
;
4318 return EFI_BUFFER_TOO_SMALL
;
4321 *KeyGuidBufferLength
= ResultSize
;
4327 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
4328 on a keyboard and the character(s) that are associated with a particular set of key strokes.
4330 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4332 @param KeyGuid A pointer to the unique ID associated with a given
4333 keyboard layout. If KeyGuid is NULL then the
4334 current layout will be retrieved.
4335 @param KeyboardLayoutLength On input, a pointer to the length of the
4336 KeyboardLayout buffer. On output, the length of
4337 the data placed into KeyboardLayout.
4338 @param KeyboardLayout A pointer to a buffer containing the retrieved
4341 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
4342 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
4343 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
4345 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
4346 that KeyboardLayout is too small to support the
4347 requested keyboard layout. KeyboardLayoutLength is
4348 updated with a value that will enable the
4354 HiiGetKeyboardLayout (
4355 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4356 IN CONST EFI_GUID
*KeyGuid
,
4357 IN OUT UINT16
*KeyboardLayoutLength
,
4358 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
4361 HII_DATABASE_PRIVATE_DATA
*Private
;
4362 HII_DATABASE_RECORD
*Node
;
4363 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
4369 UINT16 LayoutLength
;
4370 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
4372 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
4373 return EFI_INVALID_PARAMETER
;
4375 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
4376 return EFI_INVALID_PARAMETER
;
4379 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4381 // Retrieve the current keyboard layout.
4383 if (KeyGuid
== NULL
) {
4384 if (Private
->CurrentLayout
== NULL
) {
4385 return EFI_NOT_FOUND
;
4387 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
4388 if (*KeyboardLayoutLength
< LayoutLength
) {
4389 *KeyboardLayoutLength
= LayoutLength
;
4390 return EFI_BUFFER_TOO_SMALL
;
4392 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
4396 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
4397 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
4398 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
4399 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
4400 Link1
!= &PackageList
->KeyboardLayoutHdr
;
4401 Link1
= Link1
->ForwardLink
4405 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
4407 HII_KB_LAYOUT_PACKAGE_SIGNATURE
4410 Layout
= (UINT8
*) Package
->KeyboardPkg
+
4411 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
4412 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
4413 for (Index
= 0; Index
< LayoutCount
; Index
++) {
4414 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
4415 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
4416 if (LayoutLength
<= *KeyboardLayoutLength
) {
4417 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
4420 *KeyboardLayoutLength
= LayoutLength
;
4421 return EFI_BUFFER_TOO_SMALL
;
4424 Layout
= Layout
+ LayoutLength
;
4429 return EFI_NOT_FOUND
;
4434 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
4435 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
4436 group type. This is so that agents which are sensitive to the current keyboard layout being changed
4437 can be notified of this change.
4439 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4441 @param KeyGuid A pointer to the unique ID associated with a given
4444 @retval EFI_SUCCESS The current keyboard layout was successfully set.
4445 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
4447 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
4452 HiiSetKeyboardLayout (
4453 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4454 IN CONST EFI_GUID
*KeyGuid
4457 HII_DATABASE_PRIVATE_DATA
*Private
;
4458 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
4459 UINT16 KeyboardLayoutLength
;
4462 if (This
== NULL
|| KeyGuid
== NULL
) {
4463 return EFI_INVALID_PARAMETER
;
4466 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4469 // The specified GUID equals the current keyboard layout GUID,
4472 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
4477 // Try to find the incoming keyboard layout data in current database.
4479 KeyboardLayoutLength
= 0;
4480 KeyboardLayout
= NULL
;
4481 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
4482 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
4486 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
4487 ASSERT (KeyboardLayout
!= NULL
);
4488 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
4489 ASSERT_EFI_ERROR (Status
);
4492 // Backup current keyboard layout.
4494 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
4495 if (Private
->CurrentLayout
!= NULL
) {
4496 FreePool(Private
->CurrentLayout
);
4498 Private
->CurrentLayout
= KeyboardLayout
;
4501 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
4502 // current keyboard layout is changed.
4504 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
4505 ASSERT_EFI_ERROR (Status
);
4512 Return the EFI handle associated with a package list.
4514 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4516 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
4517 package list in the HIIdatabase.
4518 @param DriverHandle On return, contains the EFI_HANDLE which was
4519 registered with the package list in
4522 @retval EFI_SUCCESS The DriverHandle was returned successfully.
4523 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
4524 DriverHandle was NULL.
4525 @retval EFI_NOT_FOUND This PackageList handle can not be found in
4531 HiiGetPackageListHandle (
4532 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4533 IN EFI_HII_HANDLE PackageListHandle
,
4534 OUT EFI_HANDLE
*DriverHandle
4537 HII_DATABASE_PRIVATE_DATA
*Private
;
4538 HII_DATABASE_RECORD
*Node
;
4541 if (This
== NULL
|| DriverHandle
== NULL
) {
4542 return EFI_INVALID_PARAMETER
;
4545 if (!IsHiiHandleValid (PackageListHandle
)) {
4546 return EFI_INVALID_PARAMETER
;
4549 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4551 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
4552 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
4553 if (Node
->Handle
== PackageListHandle
) {
4554 *DriverHandle
= Node
->DriverHandle
;
4559 return EFI_NOT_FOUND
;