2 Implementation for EFI_HII_DATABASE_PROTOCOL.
4 Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "HiiDatabase.h"
18 EFI_HII_PACKAGE_LIST_HEADER
*gRTDatabaseInfoBuffer
= NULL
;
19 EFI_STRING gRTConfigRespBuffer
= NULL
;
20 UINTN gDatabaseInfoSize
= 0;
21 UINTN gConfigRespSize
= 0;
22 BOOLEAN gExportConfigResp
= TRUE
;
25 This function generates a HII_DATABASE_RECORD node and adds into hii database.
26 This is a internal function.
28 @param Private hii database private structure
29 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
32 @retval EFI_SUCCESS A database record is generated successfully.
33 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
35 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
39 GenerateHiiDatabaseRecord (
40 IN HII_DATABASE_PRIVATE_DATA
*Private
,
41 OUT HII_DATABASE_RECORD
**DatabaseNode
44 HII_DATABASE_RECORD
*DatabaseRecord
;
45 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
46 HII_HANDLE
*HiiHandle
;
48 if (Private
== NULL
|| DatabaseNode
== NULL
) {
49 return EFI_INVALID_PARAMETER
;
52 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
53 if (DatabaseRecord
== NULL
) {
54 return EFI_OUT_OF_RESOURCES
;
56 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
58 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
59 if (DatabaseRecord
->PackageList
== NULL
) {
60 FreePool (DatabaseRecord
);
61 return EFI_OUT_OF_RESOURCES
;
64 PackageList
= DatabaseRecord
->PackageList
;
66 InitializeListHead (&PackageList
->GuidPkgHdr
);
67 InitializeListHead (&PackageList
->FormPkgHdr
);
68 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
69 InitializeListHead (&PackageList
->StringPkgHdr
);
70 InitializeListHead (&PackageList
->FontPkgHdr
);
71 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
72 PackageList
->ImagePkg
= NULL
;
73 PackageList
->DevicePathPkg
= NULL
;
76 // Create a new hii handle
78 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
79 if (HiiHandle
== NULL
) {
80 FreePool (DatabaseRecord
->PackageList
);
81 FreePool (DatabaseRecord
);
82 return EFI_OUT_OF_RESOURCES
;
84 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
86 // Backup the number of Hii handles
88 Private
->HiiHandleCount
++;
89 HiiHandle
->Key
= (UINTN
) Private
->HiiHandleCount
;
91 // Insert the handle to hii handle list of the whole database.
93 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
95 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
98 // Insert the Package List node to Package List link of the whole database.
100 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
102 *DatabaseNode
= DatabaseRecord
;
110 This function checks whether a handle is a valid EFI_HII_HANDLE
111 This is a internal function.
113 @param Handle Pointer to a EFI_HII_HANDLE
116 @retval FALSE Invalid
121 EFI_HII_HANDLE Handle
124 HII_HANDLE
*HiiHandle
;
126 HiiHandle
= (HII_HANDLE
*) Handle
;
128 if (HiiHandle
== NULL
) {
132 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
141 This function invokes the matching registered function.
142 This is a internal function.
144 @param Private HII Database driver private structure.
145 @param NotifyType The type of change concerning the database.
146 @param PackageInstance Points to the package referred to by the
148 @param PackageType Package type
149 @param Handle The handle of the package list which contains the
152 @retval EFI_SUCCESS Already checked all registered function and
154 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
158 InvokeRegisteredFunction (
159 IN HII_DATABASE_PRIVATE_DATA
*Private
,
160 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
161 IN VOID
*PackageInstance
,
162 IN UINT8 PackageType
,
163 IN EFI_HII_HANDLE Handle
166 HII_DATABASE_NOTIFY
*Notify
;
168 EFI_HII_PACKAGE_HEADER
*Package
;
172 UINT32 ImageBlockSize
;
173 UINT32 PaletteInfoSize
;
175 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
176 return EFI_INVALID_PARAMETER
;
178 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
179 return EFI_INVALID_PARAMETER
;
181 if (!IsHiiHandleValid (Handle
)) {
182 return EFI_INVALID_PARAMETER
;
189 // Convert the incoming package from hii database storage format to UEFI
190 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
192 switch (PackageType
) {
193 case EFI_HII_PACKAGE_TYPE_GUID
:
194 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
197 case EFI_HII_PACKAGE_FORMS
:
198 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
199 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
200 ASSERT (Buffer
!= NULL
);
203 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
204 sizeof (EFI_HII_PACKAGE_HEADER
)
207 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
208 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
209 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
211 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
214 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
215 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
218 case EFI_HII_PACKAGE_STRINGS
:
219 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
220 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
221 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
222 ASSERT (Buffer
!= NULL
);
225 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
230 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
231 BufferSize
- HeaderSize
233 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
236 case EFI_HII_PACKAGE_FONTS
:
237 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
238 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
239 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
240 ASSERT (Buffer
!= NULL
);
243 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
248 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
249 BufferSize
- HeaderSize
251 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
254 case EFI_HII_PACKAGE_IMAGES
:
255 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
256 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
257 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
258 ASSERT (Buffer
!= NULL
);
262 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
266 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
271 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
272 if (ImageBlockSize
!= 0) {
275 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
280 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
281 if (PaletteInfoSize
!= 0) {
283 Buffer
+ HeaderSize
+ ImageBlockSize
,
284 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
287 HeaderSize
+= ImageBlockSize
;
289 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
294 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
297 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
298 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
299 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
300 ASSERT (Buffer
!= NULL
);
303 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
306 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
309 case EFI_HII_PACKAGE_DEVICE_PATH
:
310 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
314 return EFI_INVALID_PARAMETER
;
317 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
318 Link
!= &Private
->DatabaseNotifyList
;
319 Link
= Link
->ForwardLink
321 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
322 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
324 // Check in case PackageGuid is not NULL when Package is GUID package
326 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
327 Notify
->PackageGuid
= NULL
;
330 // Status of Registered Function is unknown so did not check it
332 Notify
->PackageNotifyFn (
342 if (Buffer
!= NULL
) {
351 This function insert a GUID package to a package list node.
352 This is a internal function.
354 @param PackageHdr Pointer to a buffer stored with GUID package
356 @param NotifyType The type of change concerning the database.
357 @param PackageList Pointer to a package list which will be inserted
359 @param Package Created GUID package
361 @retval EFI_SUCCESS Guid Package is inserted successfully.
362 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
364 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
370 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
371 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
372 OUT HII_GUID_PACKAGE_INSTANCE
**Package
375 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
376 EFI_HII_PACKAGE_HEADER PackageHeader
;
378 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
379 return EFI_INVALID_PARAMETER
;
382 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
385 // Create a GUID package node
387 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
388 if (GuidPackage
== NULL
) {
389 return EFI_OUT_OF_RESOURCES
;
391 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
392 if (GuidPackage
->GuidPkg
== NULL
) {
393 FreePool (GuidPackage
);
394 return EFI_OUT_OF_RESOURCES
;
397 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
398 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
399 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
400 *Package
= GuidPackage
;
402 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
403 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
411 This function exports GUID packages to a buffer.
412 This is a internal function.
414 @param Private Hii database private structure.
415 @param Handle Identification of a package list.
416 @param PackageList Pointer to a package list which will be exported.
417 @param UsedSize The length of buffer be used.
418 @param BufferSize Length of the Buffer.
419 @param Buffer Allocated space for storing exported data.
420 @param ResultSize The size of the already exported content of this
423 @retval EFI_SUCCESS Guid Packages are exported successfully.
424 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
429 IN HII_DATABASE_PRIVATE_DATA
*Private
,
430 IN EFI_HII_HANDLE Handle
,
431 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
435 IN OUT UINTN
*ResultSize
438 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
441 EFI_HII_PACKAGE_HEADER PackageHeader
;
444 if (PackageList
== NULL
|| ResultSize
== NULL
) {
445 return EFI_INVALID_PARAMETER
;
448 if (BufferSize
> 0 && Buffer
== NULL
) {
449 return EFI_INVALID_PARAMETER
;
453 Status
= EFI_SUCCESS
;
455 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
456 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
457 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
458 PackageLength
+= PackageHeader
.Length
;
459 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
460 Status
= InvokeRegisteredFunction (
462 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
463 (VOID
*) GuidPackage
,
464 EFI_HII_PACKAGE_TYPE_GUID
,
467 ASSERT_EFI_ERROR (Status
);
468 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
469 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
473 *ResultSize
+= PackageLength
;
479 This function deletes all GUID packages from a package list node.
480 This is a internal function.
482 @param Private Hii database private data.
483 @param Handle Handle of the package list which contains the to
484 be removed GUID packages.
485 @param PackageList Pointer to a package list that contains removing
488 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
489 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
494 IN HII_DATABASE_PRIVATE_DATA
*Private
,
495 IN EFI_HII_HANDLE Handle
,
496 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
499 LIST_ENTRY
*ListHead
;
500 HII_GUID_PACKAGE_INSTANCE
*Package
;
502 EFI_HII_PACKAGE_HEADER PackageHeader
;
504 ListHead
= &PackageList
->GuidPkgHdr
;
506 while (!IsListEmpty (ListHead
)) {
508 ListHead
->ForwardLink
,
509 HII_GUID_PACKAGE_INSTANCE
,
511 HII_GUID_PACKAGE_SIGNATURE
513 Status
= InvokeRegisteredFunction (
515 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
517 EFI_HII_PACKAGE_TYPE_GUID
,
520 if (EFI_ERROR (Status
)) {
524 RemoveEntryList (&Package
->GuidEntry
);
525 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
526 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
527 FreePool (Package
->GuidPkg
);
536 This function insert a Form package to a package list node.
537 This is a internal function.
539 @param PackageHdr Pointer to a buffer stored with Form package
541 @param NotifyType The type of change concerning the database.
542 @param PackageList Pointer to a package list which will be inserted
544 @param Package Created Form package
546 @retval EFI_SUCCESS Form Package is inserted successfully.
547 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
549 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
555 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
556 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
557 OUT HII_IFR_PACKAGE_INSTANCE
**Package
560 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
561 EFI_HII_PACKAGE_HEADER PackageHeader
;
563 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
564 return EFI_INVALID_PARAMETER
;
568 // Get the length of the package, including package header itself
570 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
573 // Create a Form package node
575 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
576 if (FormPackage
== NULL
) {
577 return EFI_OUT_OF_RESOURCES
;
580 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
581 if (FormPackage
->IfrData
== NULL
) {
582 FreePool (FormPackage
);
583 return EFI_OUT_OF_RESOURCES
;
586 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
588 // Copy Package Header
590 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
596 FormPackage
->IfrData
,
597 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
598 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
601 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
602 *Package
= FormPackage
;
604 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
605 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
612 This function exports Form packages to a buffer.
613 This is a internal function.
615 @param Private Hii database private structure.
616 @param Handle Identification of a package list.
617 @param PackageList Pointer to a package list which will be exported.
618 @param UsedSize The length of buffer be used.
619 @param BufferSize Length of the Buffer.
620 @param Buffer Allocated space for storing exported data.
621 @param ResultSize The size of the already exported content of this
624 @retval EFI_SUCCESS Form Packages are exported successfully.
625 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
630 IN HII_DATABASE_PRIVATE_DATA
*Private
,
631 IN EFI_HII_HANDLE Handle
,
632 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
636 IN OUT UINTN
*ResultSize
639 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
644 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
645 return EFI_INVALID_PARAMETER
;
648 if (BufferSize
> 0 && Buffer
== NULL
) {
649 return EFI_INVALID_PARAMETER
;
653 Status
= EFI_SUCCESS
;
656 // Export Form packages.
658 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
659 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
660 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
661 if ((Buffer
!= NULL
) && (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
)) {
663 // Invoke registered notification if exists
665 Status
= InvokeRegisteredFunction (
667 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
668 (VOID
*) FormPackage
,
669 EFI_HII_PACKAGE_FORMS
,
672 ASSERT_EFI_ERROR (Status
);
674 // Copy the Form package content.
676 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
677 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
680 (VOID
*) FormPackage
->IfrData
,
681 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
683 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
687 *ResultSize
+= PackageLength
;
695 This function deletes all Form packages from a package list node.
696 This is a internal function.
698 @param Private Hii database private data.
699 @param Handle Handle of the package list which contains the to
700 be removed Form packages.
701 @param PackageList Pointer to a package list that contains removing
704 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
705 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
710 IN HII_DATABASE_PRIVATE_DATA
*Private
,
711 IN EFI_HII_HANDLE Handle
,
712 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
715 LIST_ENTRY
*ListHead
;
716 HII_IFR_PACKAGE_INSTANCE
*Package
;
719 ListHead
= &PackageList
->FormPkgHdr
;
721 while (!IsListEmpty (ListHead
)) {
723 ListHead
->ForwardLink
,
724 HII_IFR_PACKAGE_INSTANCE
,
726 HII_IFR_PACKAGE_SIGNATURE
728 Status
= InvokeRegisteredFunction (
730 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
732 EFI_HII_PACKAGE_FORMS
,
735 if (EFI_ERROR (Status
)) {
739 RemoveEntryList (&Package
->IfrEntry
);
740 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
741 FreePool (Package
->IfrData
);
744 // If Hii runtime support feature is enabled,
745 // will export Hii info for runtime use after ReadyToBoot event triggered.
746 // If some driver add/update/remove packages from HiiDatabase after ReadyToBoot,
747 // will need to export the content of HiiDatabase.
748 // But if form packages removed, also need to export the ConfigResp string
750 if (gExportAfterReadyToBoot
) {
751 gExportConfigResp
= TRUE
;
761 This function insert a String package to a package list node.
762 This is a internal function.
764 @param Private Hii database private structure.
765 @param PackageHdr Pointer to a buffer stored with String package
767 @param NotifyType The type of change concerning the database.
768 @param PackageList Pointer to a package list which will be inserted
770 @param Package Created String package
772 @retval EFI_SUCCESS String Package is inserted successfully.
773 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
775 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
776 @retval EFI_UNSUPPORTED A string package with the same language already
777 exists in current package list.
781 InsertStringPackage (
782 IN HII_DATABASE_PRIVATE_DATA
*Private
,
784 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
785 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
786 OUT HII_STRING_PACKAGE_INSTANCE
**Package
789 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
792 EFI_HII_PACKAGE_HEADER PackageHeader
;
797 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
798 return EFI_INVALID_PARAMETER
;
800 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
801 return EFI_INVALID_PARAMETER
;
804 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
805 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
808 // It is illegal to have two string packages with same language within one packagelist
809 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
811 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
812 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
813 if (Language
== NULL
) {
814 return EFI_OUT_OF_RESOURCES
;
816 AsciiStrCpyS (Language
, LanguageSize
/ sizeof (CHAR8
), (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
817 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
818 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
819 if (HiiCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
821 return EFI_UNSUPPORTED
;
827 // Create a String package node
829 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
830 if (StringPackage
== NULL
) {
831 Status
= EFI_OUT_OF_RESOURCES
;
835 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
836 if (StringPackage
->StringPkgHdr
== NULL
) {
837 Status
= EFI_OUT_OF_RESOURCES
;
841 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
842 if (StringPackage
->StringBlock
== NULL
) {
843 Status
= EFI_OUT_OF_RESOURCES
;
847 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
848 StringPackage
->FontId
= 0;
849 InitializeListHead (&StringPackage
->FontInfoList
);
852 // Copy the String package header.
854 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
857 // Copy the String blocks
860 StringPackage
->StringBlock
,
861 (UINT8
*) PackageHdr
+ HeaderSize
,
862 PackageHeader
.Length
- HeaderSize
866 // Collect all font block info
868 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, &StringPackage
->MaxStringId
, NULL
);
869 if (EFI_ERROR (Status
)) {
874 // Insert to String package array
876 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
877 *Package
= StringPackage
;
879 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
880 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
887 if (StringPackage
!= NULL
) {
888 if (StringPackage
->StringBlock
!= NULL
) {
889 FreePool (StringPackage
->StringBlock
);
891 if (StringPackage
->StringPkgHdr
!= NULL
) {
892 FreePool (StringPackage
->StringPkgHdr
);
894 FreePool (StringPackage
);
901 Adjust all string packages in a single package list to have the same max string ID.
903 @param PackageList Pointer to a package list which will be adjusted.
905 @retval EFI_SUCCESS Adjust all string packages successfully.
906 @retval others Can't adjust string packages.
910 AdjustStringPackage (
911 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
915 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
916 UINT32 Skip2BlockSize
;
920 EFI_STRING_ID MaxStringId
;
924 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
925 Link
!= &PackageList
->StringPkgHdr
;
926 Link
= Link
->ForwardLink
928 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
929 if (MaxStringId
< StringPackage
->MaxStringId
) {
930 MaxStringId
= StringPackage
->MaxStringId
;
934 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
935 Link
!= &PackageList
->StringPkgHdr
;
936 Link
= Link
->ForwardLink
938 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
939 if (StringPackage
->MaxStringId
< MaxStringId
) {
940 OldBlockSize
= StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
942 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.
944 SkipCount
= (UINT16
) (MaxStringId
- StringPackage
->MaxStringId
);
945 Skip2BlockSize
= (UINT32
) sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
947 StringBlock
= (UINT8
*) AllocateZeroPool (OldBlockSize
+ Skip2BlockSize
);
948 if (StringBlock
== NULL
) {
949 return EFI_OUT_OF_RESOURCES
;
952 // Copy original string blocks, except the EFI_HII_SIBT_END.
954 CopyMem (StringBlock
, StringPackage
->StringBlock
, OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
));
956 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks
958 BlockPtr
= StringBlock
+ OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
);
959 *BlockPtr
= EFI_HII_SIBT_SKIP2
;
960 CopyMem (BlockPtr
+ 1, &SkipCount
, sizeof (UINT16
));
961 BlockPtr
+= sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
964 // Append a EFI_HII_SIBT_END block to the end.
966 *BlockPtr
= EFI_HII_SIBT_END
;
967 FreePool (StringPackage
->StringBlock
);
968 StringPackage
->StringBlock
= StringBlock
;
969 StringPackage
->StringPkgHdr
->Header
.Length
+= Skip2BlockSize
;
970 PackageList
->PackageListHdr
.PackageLength
+= Skip2BlockSize
;
971 StringPackage
->MaxStringId
= MaxStringId
;
979 This function exports String packages to a buffer.
980 This is a internal function.
982 @param Private Hii database private structure.
983 @param Handle Identification of a package list.
984 @param PackageList Pointer to a package list which will be exported.
985 @param UsedSize The length of buffer be used.
986 @param BufferSize Length of the Buffer.
987 @param Buffer Allocated space for storing exported data.
988 @param ResultSize The size of the already exported content of this
991 @retval EFI_SUCCESS String Packages are exported successfully.
992 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
996 ExportStringPackages (
997 IN HII_DATABASE_PRIVATE_DATA
*Private
,
998 IN EFI_HII_HANDLE Handle
,
999 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1001 IN UINTN BufferSize
,
1002 IN OUT VOID
*Buffer
,
1003 IN OUT UINTN
*ResultSize
1007 UINTN PackageLength
;
1009 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1011 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1012 return EFI_INVALID_PARAMETER
;
1015 if (BufferSize
> 0 && Buffer
== NULL
) {
1016 return EFI_INVALID_PARAMETER
;
1020 Status
= EFI_SUCCESS
;
1022 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1023 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1024 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1025 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1027 // Invoke registered notification function with EXPORT_PACK notify type
1029 Status
= InvokeRegisteredFunction (
1031 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1032 (VOID
*) StringPackage
,
1033 EFI_HII_PACKAGE_STRINGS
,
1036 ASSERT_EFI_ERROR (Status
);
1038 // Copy String package header
1040 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
1041 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
1044 // Copy String blocks information
1048 StringPackage
->StringBlock
,
1049 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
1051 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1055 *ResultSize
+= PackageLength
;
1061 This function deletes all String packages from a package list node.
1062 This is a internal function.
1064 @param Private Hii database private data.
1065 @param Handle Handle of the package list which contains the to
1066 be removed String packages.
1067 @param PackageList Pointer to a package list that contains removing
1070 @retval EFI_SUCCESS String Package(s) is deleted successfully.
1071 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1075 RemoveStringPackages (
1076 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1077 IN EFI_HII_HANDLE Handle
,
1078 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1081 LIST_ENTRY
*ListHead
;
1082 HII_STRING_PACKAGE_INSTANCE
*Package
;
1083 HII_FONT_INFO
*FontInfo
;
1086 ListHead
= &PackageList
->StringPkgHdr
;
1088 while (!IsListEmpty (ListHead
)) {
1090 ListHead
->ForwardLink
,
1091 HII_STRING_PACKAGE_INSTANCE
,
1093 HII_STRING_PACKAGE_SIGNATURE
1095 Status
= InvokeRegisteredFunction (
1097 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1099 EFI_HII_PACKAGE_STRINGS
,
1102 if (EFI_ERROR (Status
)) {
1106 RemoveEntryList (&Package
->StringEntry
);
1107 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1108 FreePool (Package
->StringBlock
);
1109 FreePool (Package
->StringPkgHdr
);
1111 // Delete font information
1113 while (!IsListEmpty (&Package
->FontInfoList
)) {
1115 Package
->FontInfoList
.ForwardLink
,
1118 HII_FONT_INFO_SIGNATURE
1120 RemoveEntryList (&FontInfo
->Entry
);
1121 FreePool (FontInfo
);
1132 This function insert a Font package to a package list node.
1133 This is a internal function.
1135 @param Private Hii database private structure.
1136 @param PackageHdr Pointer to a buffer stored with Font package
1138 @param NotifyType The type of change concerning the database.
1139 @param PackageList Pointer to a package list which will be inserted
1141 @param Package Created Font package
1143 @retval EFI_SUCCESS Font Package is inserted successfully.
1144 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1146 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1147 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1148 exists in current hii database.
1153 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1154 IN VOID
*PackageHdr
,
1155 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1156 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1157 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1160 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1161 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1164 EFI_HII_PACKAGE_HEADER PackageHeader
;
1165 EFI_FONT_INFO
*FontInfo
;
1166 UINT32 FontInfoSize
;
1167 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1169 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1170 return EFI_INVALID_PARAMETER
;
1173 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1174 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1181 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1182 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1183 // attributes and identify a font uniquely.
1185 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1186 if (FontPkgHdr
== NULL
) {
1187 Status
= EFI_OUT_OF_RESOURCES
;
1190 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1192 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1193 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1194 if (FontInfo
== NULL
) {
1195 Status
= EFI_OUT_OF_RESOURCES
;
1198 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1199 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1200 StrCpyS (FontInfo
->FontName
, (FontInfoSize
- OFFSET_OF(EFI_FONT_INFO
,FontName
)) / sizeof (CHAR16
), FontPkgHdr
->FontFamily
);
1202 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1203 Status
= EFI_UNSUPPORTED
;
1208 // Create a Font package node
1210 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1211 if (FontPackage
== NULL
) {
1212 Status
= EFI_OUT_OF_RESOURCES
;
1215 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1216 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1217 InitializeListHead (&FontPackage
->GlyphInfoList
);
1219 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1220 if (FontPackage
->GlyphBlock
== NULL
) {
1221 Status
= EFI_OUT_OF_RESOURCES
;
1224 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1227 // Collect all default character cell information and backup in GlyphInfoList.
1229 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1230 if (EFI_ERROR (Status
)) {
1235 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1238 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1239 if (GlobalFont
== NULL
) {
1240 Status
= EFI_OUT_OF_RESOURCES
;
1243 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1244 GlobalFont
->FontPackage
= FontPackage
;
1245 GlobalFont
->FontInfoSize
= FontInfoSize
;
1246 GlobalFont
->FontInfo
= FontInfo
;
1247 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1250 // Insert this font package to Font package array
1252 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1253 *Package
= FontPackage
;
1255 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1256 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1263 if (FontPkgHdr
!= NULL
) {
1264 FreePool (FontPkgHdr
);
1266 if (FontInfo
!= NULL
) {
1267 FreePool (FontInfo
);
1269 if (FontPackage
!= NULL
) {
1270 if (FontPackage
->GlyphBlock
!= NULL
) {
1271 FreePool (FontPackage
->GlyphBlock
);
1273 FreePool (FontPackage
);
1275 if (GlobalFont
!= NULL
) {
1276 FreePool (GlobalFont
);
1285 This function exports Font packages to a buffer.
1286 This is a internal function.
1288 @param Private Hii database private structure.
1289 @param Handle Identification of a package list.
1290 @param PackageList Pointer to a package list which will be exported.
1291 @param UsedSize The length of buffer be used.
1292 @param BufferSize Length of the Buffer.
1293 @param Buffer Allocated space for storing exported data.
1294 @param ResultSize The size of the already exported content of this
1297 @retval EFI_SUCCESS Font Packages are exported successfully.
1298 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1302 ExportFontPackages (
1303 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1304 IN EFI_HII_HANDLE Handle
,
1305 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1307 IN UINTN BufferSize
,
1308 IN OUT VOID
*Buffer
,
1309 IN OUT UINTN
*ResultSize
1313 UINTN PackageLength
;
1315 HII_FONT_PACKAGE_INSTANCE
*Package
;
1318 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1319 return EFI_INVALID_PARAMETER
;
1322 if (BufferSize
> 0 && Buffer
== NULL
) {
1323 return EFI_INVALID_PARAMETER
;
1327 Status
= EFI_SUCCESS
;
1329 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1330 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1331 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1332 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1334 // Invoke registered notification function with EXPORT_PACK notify type
1336 Status
= InvokeRegisteredFunction (
1338 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1340 EFI_HII_PACKAGE_FONTS
,
1343 ASSERT_EFI_ERROR (Status
);
1345 // Copy Font package header
1347 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1348 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1351 // Copy Glyph blocks information
1355 Package
->GlyphBlock
,
1356 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1358 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1362 *ResultSize
+= PackageLength
;
1368 This function deletes all Font packages from a package list node.
1369 This is a internal function.
1371 @param Private Hii database private data.
1372 @param Handle Handle of the package list which contains the to
1373 be removed Font packages.
1374 @param PackageList Pointer to a package list that contains removing
1377 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1378 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1382 RemoveFontPackages (
1383 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1384 IN EFI_HII_HANDLE Handle
,
1385 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1388 LIST_ENTRY
*ListHead
;
1389 HII_FONT_PACKAGE_INSTANCE
*Package
;
1391 HII_GLYPH_INFO
*GlyphInfo
;
1393 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1395 ListHead
= &PackageList
->FontPkgHdr
;
1397 while (!IsListEmpty (ListHead
)) {
1399 ListHead
->ForwardLink
,
1400 HII_FONT_PACKAGE_INSTANCE
,
1402 HII_FONT_PACKAGE_SIGNATURE
1404 Status
= InvokeRegisteredFunction (
1406 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1408 EFI_HII_PACKAGE_FONTS
,
1411 if (EFI_ERROR (Status
)) {
1415 RemoveEntryList (&Package
->FontEntry
);
1416 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1418 if (Package
->GlyphBlock
!= NULL
) {
1419 FreePool (Package
->GlyphBlock
);
1421 FreePool (Package
->FontPkgHdr
);
1423 // Delete default character cell information
1425 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1427 Package
->GlyphInfoList
.ForwardLink
,
1430 HII_GLYPH_INFO_SIGNATURE
1432 RemoveEntryList (&GlyphInfo
->Entry
);
1433 FreePool (GlyphInfo
);
1437 // Remove corresponding global font info
1439 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1440 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1441 if (GlobalFont
->FontPackage
== Package
) {
1442 RemoveEntryList (&GlobalFont
->Entry
);
1443 FreePool (GlobalFont
->FontInfo
);
1444 FreePool (GlobalFont
);
1457 This function insert a Image package to a package list node.
1458 This is a internal function.
1460 @param PackageHdr Pointer to a buffer stored with Image package
1462 @param NotifyType The type of change concerning the database.
1463 @param PackageList Pointer to a package list which will be inserted
1465 @param Package Created Image package
1467 @retval EFI_SUCCESS Image Package is inserted successfully.
1468 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1470 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1474 InsertImagePackage (
1475 IN VOID
*PackageHdr
,
1476 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1477 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1478 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1481 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1485 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1486 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1487 UINT32 PaletteInfoOffset
;
1488 UINT32 ImageInfoOffset
;
1491 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1492 return EFI_INVALID_PARAMETER
;
1496 // Less than one image package is allowed in one package list.
1498 if (PackageList
->ImagePkg
!= NULL
) {
1499 return EFI_INVALID_PARAMETER
;
1503 // Create a Image package node
1505 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1506 if (ImagePackage
== NULL
) {
1507 return EFI_OUT_OF_RESOURCES
;
1511 // Copy the Image package header.
1513 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1515 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1516 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1519 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1522 ImagePackage
->PaletteBlock
= NULL
;
1523 if (PaletteInfoOffset
!= 0) {
1524 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1525 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1526 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1528 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1529 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1530 CurrentSize
+= sizeof (UINT16
);
1531 PaletteSize
+= (UINT32
) CurrentSize
;
1532 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1535 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1536 if (ImagePackage
->PaletteBlock
== NULL
) {
1537 FreePool (ImagePackage
);
1538 return EFI_OUT_OF_RESOURCES
;
1541 ImagePackage
->PaletteBlock
,
1542 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1548 // If ImageInfoOffset is zero, there are no images in this package.
1551 ImagePackage
->ImageBlock
= NULL
;
1552 if (ImageInfoOffset
!= 0) {
1553 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1554 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1555 ImagePackage
->ImageBlock
= AllocateZeroPool (ImageSize
);
1556 if (ImagePackage
->ImageBlock
== NULL
) {
1557 FreePool (ImagePackage
->PaletteBlock
);
1558 FreePool (ImagePackage
);
1559 return EFI_OUT_OF_RESOURCES
;
1562 ImagePackage
->ImageBlock
,
1563 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1568 ImagePackage
->ImageBlockSize
= ImageSize
;
1569 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1570 PackageList
->ImagePkg
= ImagePackage
;
1571 *Package
= ImagePackage
;
1573 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1574 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1582 This function exports Image packages to a buffer.
1583 This is a internal function.
1585 @param Private Hii database private structure.
1586 @param Handle Identification of a package list.
1587 @param PackageList Pointer to a package list which will be exported.
1588 @param UsedSize The length of buffer be used.
1589 @param BufferSize Length of the Buffer.
1590 @param Buffer Allocated space for storing exported data.
1591 @param ResultSize The size of the already exported content of this
1594 @retval EFI_SUCCESS Image Packages are exported successfully.
1595 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1599 ExportImagePackages (
1600 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1601 IN EFI_HII_HANDLE Handle
,
1602 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1604 IN UINTN BufferSize
,
1605 IN OUT VOID
*Buffer
,
1606 IN OUT UINTN
*ResultSize
1609 UINTN PackageLength
;
1611 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1614 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1615 return EFI_INVALID_PARAMETER
;
1618 if (BufferSize
> 0 && Buffer
== NULL
) {
1619 return EFI_INVALID_PARAMETER
;
1622 Package
= PackageList
->ImagePkg
;
1624 if (Package
== NULL
) {
1628 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1630 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1632 // Invoke registered notification function with EXPORT_PACK notify type
1634 Status
= InvokeRegisteredFunction (
1636 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1638 EFI_HII_PACKAGE_IMAGES
,
1641 ASSERT_EFI_ERROR (Status
);
1642 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1643 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1645 // Copy Image package header,
1646 // then justify the offset for image info and palette info in the header.
1648 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1649 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1652 // Copy Image blocks information
1654 if (Package
->ImageBlockSize
!= 0) {
1655 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1656 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1659 // Copy Palette information
1661 if (Package
->PaletteInfoSize
!= 0) {
1662 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1663 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1667 *ResultSize
+= PackageLength
;
1673 This function deletes Image package from a package list node.
1674 This is a internal function.
1676 @param Private Hii database private data.
1677 @param Handle Handle of the package list which contains the to
1678 be removed Image packages.
1679 @param PackageList Package List which contains the to be removed
1682 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1683 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1687 RemoveImagePackages (
1688 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1689 IN EFI_HII_HANDLE Handle
,
1690 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1693 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1696 Package
= PackageList
->ImagePkg
;
1699 // Image package does not exist, return directly.
1701 if (Package
== NULL
) {
1705 Status
= InvokeRegisteredFunction (
1707 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1709 EFI_HII_PACKAGE_IMAGES
,
1712 if (EFI_ERROR (Status
)) {
1716 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1718 FreePool (Package
->ImageBlock
);
1719 if (Package
->PaletteBlock
!= NULL
) {
1720 FreePool (Package
->PaletteBlock
);
1724 PackageList
->ImagePkg
= NULL
;
1731 This function insert a Simple Font package to a package list node.
1732 This is a internal function.
1734 @param PackageHdr Pointer to a buffer stored with Simple Font
1735 package information.
1736 @param NotifyType The type of change concerning the database.
1737 @param PackageList Pointer to a package list which will be inserted
1739 @param Package Created Simple Font package
1741 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1742 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1743 Simple Font package.
1744 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1748 InsertSimpleFontPackage (
1749 IN VOID
*PackageHdr
,
1750 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1751 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1752 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1755 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1757 EFI_HII_PACKAGE_HEADER Header
;
1759 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1760 return EFI_INVALID_PARAMETER
;
1764 // Create a Simple Font package node
1766 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1767 if (SimpleFontPackage
== NULL
) {
1768 Status
= EFI_OUT_OF_RESOURCES
;
1771 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1774 // Copy the Simple Font package.
1776 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1778 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1779 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1780 Status
= EFI_OUT_OF_RESOURCES
;
1784 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1787 // Insert to Simple Font package array
1789 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1790 *Package
= SimpleFontPackage
;
1792 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1793 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1800 if (SimpleFontPackage
!= NULL
) {
1801 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1802 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1804 FreePool (SimpleFontPackage
);
1811 This function exports SimpleFont packages to a buffer.
1812 This is a internal function.
1814 @param Private Hii database private structure.
1815 @param Handle Identification of a package list.
1816 @param PackageList Pointer to a package list which will be exported.
1817 @param UsedSize The length of buffer be used.
1818 @param BufferSize Length of the Buffer.
1819 @param Buffer Allocated space for storing exported data.
1820 @param ResultSize The size of the already exported content of this
1823 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1824 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1828 ExportSimpleFontPackages (
1829 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1830 IN EFI_HII_HANDLE Handle
,
1831 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1833 IN UINTN BufferSize
,
1834 IN OUT VOID
*Buffer
,
1835 IN OUT UINTN
*ResultSize
1839 UINTN PackageLength
;
1841 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1843 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1844 return EFI_INVALID_PARAMETER
;
1847 if (BufferSize
> 0 && Buffer
== NULL
) {
1848 return EFI_INVALID_PARAMETER
;
1852 Status
= EFI_SUCCESS
;
1854 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1855 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1856 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1857 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1859 // Invoke registered notification function with EXPORT_PACK notify type
1861 Status
= InvokeRegisteredFunction (
1863 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1865 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1868 ASSERT_EFI_ERROR (Status
);
1871 // Copy SimpleFont package
1873 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1874 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1878 *ResultSize
+= PackageLength
;
1884 This function deletes all Simple Font packages from a package list node.
1885 This is a internal function.
1887 @param Private Hii database private data.
1888 @param Handle Handle of the package list which contains the to
1889 be removed Simple Font packages.
1890 @param PackageList Pointer to a package list that contains removing
1893 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1894 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1898 RemoveSimpleFontPackages (
1899 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1900 IN EFI_HII_HANDLE Handle
,
1901 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1904 LIST_ENTRY
*ListHead
;
1905 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1908 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1910 while (!IsListEmpty (ListHead
)) {
1912 ListHead
->ForwardLink
,
1913 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1915 HII_S_FONT_PACKAGE_SIGNATURE
1917 Status
= InvokeRegisteredFunction (
1919 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1921 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1924 if (EFI_ERROR (Status
)) {
1928 RemoveEntryList (&Package
->SimpleFontEntry
);
1929 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1930 FreePool (Package
->SimpleFontPkgHdr
);
1939 This function insert a Device path package to a package list node.
1940 This is a internal function.
1942 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1944 @param NotifyType The type of change concerning the database.
1945 @param PackageList Pointer to a package list which will be inserted
1948 @retval EFI_SUCCESS Device path Package is inserted successfully.
1949 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1950 Device path package.
1951 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1955 InsertDevicePathPackage (
1956 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1957 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1958 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1961 UINT32 PackageLength
;
1962 EFI_HII_PACKAGE_HEADER Header
;
1964 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1965 return EFI_INVALID_PARAMETER
;
1968 // Less than one device path package is allowed in one package list.
1970 if (PackageList
->DevicePathPkg
!= NULL
) {
1971 return EFI_INVALID_PARAMETER
;
1974 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1975 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1976 if (PackageList
->DevicePathPkg
== NULL
) {
1977 return EFI_OUT_OF_RESOURCES
;
1980 Header
.Length
= PackageLength
;
1981 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1982 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1984 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1986 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1990 // Since Device Path package is created by NewPackageList, either NEW_PACK
1991 // or ADD_PACK should increase the length of package list.
1993 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1999 This function exports device path package to a buffer.
2000 This is a internal function.
2002 @param Private Hii database private structure.
2003 @param Handle Identification of a package list.
2004 @param PackageList Pointer to a package list which will be exported.
2005 @param UsedSize The length of buffer be used.
2006 @param BufferSize Length of the Buffer.
2007 @param Buffer Allocated space for storing exported data.
2008 @param ResultSize The size of the already exported content of this
2011 @retval EFI_SUCCESS Device path Package is exported successfully.
2012 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2016 ExportDevicePathPackage (
2017 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2018 IN EFI_HII_HANDLE Handle
,
2019 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2021 IN UINTN BufferSize
,
2022 IN OUT VOID
*Buffer
,
2023 IN OUT UINTN
*ResultSize
2028 EFI_HII_PACKAGE_HEADER Header
;
2030 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2031 return EFI_INVALID_PARAMETER
;
2033 if (BufferSize
> 0 && Buffer
== NULL
) {
2034 return EFI_INVALID_PARAMETER
;
2037 Package
= PackageList
->DevicePathPkg
;
2039 if (Package
== NULL
) {
2043 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2045 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2047 // Invoke registered notification function with EXPORT_PACK notify type
2049 Status
= InvokeRegisteredFunction (
2051 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2053 EFI_HII_PACKAGE_DEVICE_PATH
,
2056 ASSERT_EFI_ERROR (Status
);
2059 // Copy Device path package
2061 CopyMem (Buffer
, Package
, Header
.Length
);
2064 *ResultSize
+= Header
.Length
;
2070 This function deletes Device Path package from a package list node.
2071 This is a internal function.
2073 @param Private Hii database private data.
2074 @param Handle Handle of the package list.
2075 @param PackageList Package List which contains the to be removed
2076 Device Path package.
2078 @retval EFI_SUCCESS Device Path Package is deleted successfully.
2079 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2083 RemoveDevicePathPackage (
2084 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2085 IN EFI_HII_HANDLE Handle
,
2086 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2091 EFI_HII_PACKAGE_HEADER Header
;
2093 Package
= PackageList
->DevicePathPkg
;
2096 // No device path, return directly.
2098 if (Package
== NULL
) {
2102 Status
= InvokeRegisteredFunction (
2104 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2106 EFI_HII_PACKAGE_DEVICE_PATH
,
2109 if (EFI_ERROR (Status
)) {
2113 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2114 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2118 PackageList
->DevicePathPkg
= NULL
;
2125 This function will insert a device path package to package list firstly then
2126 invoke notification functions if any.
2127 This is a internal function.
2129 @param Private Hii database private structure.
2130 @param NotifyType The type of change concerning the database.
2131 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2133 @param DatabaseRecord Pointer to a database record contains a package
2134 list which will be inserted to.
2136 @retval EFI_SUCCESS Device path Package is inserted successfully.
2137 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2138 Device path package.
2139 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2143 AddDevicePathPackage (
2144 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2145 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2146 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2147 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2152 if (DevicePath
== NULL
) {
2156 ASSERT (Private
!= NULL
);
2157 ASSERT (DatabaseRecord
!= NULL
);
2160 // Create a device path package and insert to packagelist
2162 Status
= InsertDevicePathPackage (
2165 DatabaseRecord
->PackageList
2167 if (EFI_ERROR (Status
)) {
2171 return InvokeRegisteredFunction (
2174 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2175 EFI_HII_PACKAGE_DEVICE_PATH
,
2176 DatabaseRecord
->Handle
2182 This function insert a Keyboard Layout package to a package list node.
2183 This is a internal function.
2185 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2186 package information.
2187 @param NotifyType The type of change concerning the database.
2188 @param PackageList Pointer to a package list which will be inserted
2190 @param Package Created Keyboard Layout package
2192 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2193 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2194 Keyboard Layout package.
2195 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2199 InsertKeyboardLayoutPackage (
2200 IN VOID
*PackageHdr
,
2201 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2202 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2203 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2206 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2207 EFI_HII_PACKAGE_HEADER PackageHeader
;
2210 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2211 return EFI_INVALID_PARAMETER
;
2214 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2217 // Create a Keyboard Layout package node
2219 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2220 if (KeyboardLayoutPackage
== NULL
) {
2221 Status
= EFI_OUT_OF_RESOURCES
;
2224 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2226 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2227 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2228 Status
= EFI_OUT_OF_RESOURCES
;
2232 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2233 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2235 *Package
= KeyboardLayoutPackage
;
2237 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2238 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2246 if (KeyboardLayoutPackage
!= NULL
) {
2247 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2248 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2250 FreePool (KeyboardLayoutPackage
);
2258 This function exports Keyboard Layout packages to a buffer.
2259 This is a internal function.
2261 @param Private Hii database private structure.
2262 @param Handle Identification of a package list.
2263 @param PackageList Pointer to a package list which will be exported.
2264 @param UsedSize The length of buffer be used.
2265 @param BufferSize Length of the Buffer.
2266 @param Buffer Allocated space for storing exported data.
2267 @param ResultSize The size of the already exported content of this
2270 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2272 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2276 ExportKeyboardLayoutPackages (
2277 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2278 IN EFI_HII_HANDLE Handle
,
2279 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2281 IN UINTN BufferSize
,
2282 IN OUT VOID
*Buffer
,
2283 IN OUT UINTN
*ResultSize
2287 UINTN PackageLength
;
2289 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2290 EFI_HII_PACKAGE_HEADER PackageHeader
;
2292 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2293 return EFI_INVALID_PARAMETER
;
2296 if (BufferSize
> 0 && Buffer
== NULL
) {
2297 return EFI_INVALID_PARAMETER
;
2301 Status
= EFI_SUCCESS
;
2303 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2304 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2305 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2306 PackageLength
+= PackageHeader
.Length
;
2307 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2309 // Invoke registered notification function with EXPORT_PACK notify type
2311 Status
= InvokeRegisteredFunction (
2313 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2314 (EFI_HII_PACKAGE_HEADER
*) Package
,
2315 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2318 ASSERT_EFI_ERROR (Status
);
2321 // Copy Keyboard Layout package
2323 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2324 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2328 *ResultSize
+= PackageLength
;
2334 This function deletes all Keyboard Layout packages from a package list node.
2335 This is a internal function.
2337 @param Private Hii database private data.
2338 @param Handle Handle of the package list which contains the to
2339 be removed Keyboard Layout packages.
2340 @param PackageList Pointer to a package list that contains removing
2343 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2345 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2349 RemoveKeyboardLayoutPackages (
2350 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2351 IN EFI_HII_HANDLE Handle
,
2352 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2355 LIST_ENTRY
*ListHead
;
2356 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2357 EFI_HII_PACKAGE_HEADER PackageHeader
;
2360 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2362 while (!IsListEmpty (ListHead
)) {
2364 ListHead
->ForwardLink
,
2365 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2367 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2369 Status
= InvokeRegisteredFunction (
2371 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2373 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2376 if (EFI_ERROR (Status
)) {
2380 RemoveEntryList (&Package
->KeyboardEntry
);
2381 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2382 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2383 FreePool (Package
->KeyboardPkg
);
2392 This function will insert a package list to hii database firstly then
2393 invoke notification functions if any. It is the worker function of
2394 HiiNewPackageList and HiiUpdatePackageList.
2396 This is a internal function.
2398 @param Private Hii database private structure.
2399 @param NotifyType The type of change concerning the database.
2400 @param PackageList Pointer to a package list.
2401 @param DatabaseRecord Pointer to a database record contains a package
2402 list instance which will be inserted to.
2404 @retval EFI_SUCCESS All incoming packages are inserted to current
2406 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2407 Device path package.
2408 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2413 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2414 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2415 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2416 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2420 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2421 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2422 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2423 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2424 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2425 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2426 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2427 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2428 EFI_HII_PACKAGE_HEADER PackageHeader
;
2429 UINT32 OldPackageListLen
;
2430 BOOLEAN StringPkgIsAdd
;
2433 // Initialize Variables
2435 StringPkgIsAdd
= FALSE
;
2437 StringPackage
= NULL
;
2440 ImagePackage
= NULL
;
2441 SimpleFontPackage
= NULL
;
2442 KeyboardLayoutPackage
= NULL
;
2445 // Process the package list header
2447 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2449 &DatabaseRecord
->PackageList
->PackageListHdr
,
2450 (VOID
*) PackageList
,
2451 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2453 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2454 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2457 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2458 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2460 Status
= EFI_SUCCESS
;
2462 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2463 switch (PackageHeader
.Type
) {
2464 case EFI_HII_PACKAGE_TYPE_GUID
:
2465 Status
= InsertGuidPackage (
2468 DatabaseRecord
->PackageList
,
2471 if (EFI_ERROR (Status
)) {
2474 Status
= InvokeRegisteredFunction (
2477 (VOID
*) GuidPackage
,
2478 (UINT8
) (PackageHeader
.Type
),
2479 DatabaseRecord
->Handle
2482 case EFI_HII_PACKAGE_FORMS
:
2483 Status
= InsertFormPackage (
2486 DatabaseRecord
->PackageList
,
2489 if (EFI_ERROR (Status
)) {
2492 Status
= InvokeRegisteredFunction (
2495 (VOID
*) FormPackage
,
2496 (UINT8
) (PackageHeader
.Type
),
2497 DatabaseRecord
->Handle
2500 // If Hii runtime support feature is enabled,
2501 // will export Hii info for runtime use after ReadyToBoot event triggered.
2502 // If some driver add/update/remove packages from HiiDatabase after ReadyToBoot,
2503 // will need to export the content of HiiDatabase.
2504 // But if form packages added/updated, also need to export the ConfigResp string.
2506 if (gExportAfterReadyToBoot
) {
2507 gExportConfigResp
= TRUE
;
2510 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2511 Status
= InsertKeyboardLayoutPackage (
2514 DatabaseRecord
->PackageList
,
2515 &KeyboardLayoutPackage
2517 if (EFI_ERROR (Status
)) {
2520 Status
= InvokeRegisteredFunction (
2523 (VOID
*) KeyboardLayoutPackage
,
2524 (UINT8
) (PackageHeader
.Type
),
2525 DatabaseRecord
->Handle
2528 case EFI_HII_PACKAGE_STRINGS
:
2529 Status
= InsertStringPackage (
2533 DatabaseRecord
->PackageList
,
2536 if (EFI_ERROR (Status
)) {
2539 ASSERT (StringPackage
!= NULL
);
2540 Status
= InvokeRegisteredFunction (
2543 (VOID
*) StringPackage
,
2544 (UINT8
) (PackageHeader
.Type
),
2545 DatabaseRecord
->Handle
2547 StringPkgIsAdd
= TRUE
;
2549 case EFI_HII_PACKAGE_FONTS
:
2550 Status
= InsertFontPackage (
2554 DatabaseRecord
->PackageList
,
2557 if (EFI_ERROR (Status
)) {
2560 Status
= InvokeRegisteredFunction (
2563 (VOID
*) FontPackage
,
2564 (UINT8
) (PackageHeader
.Type
),
2565 DatabaseRecord
->Handle
2568 case EFI_HII_PACKAGE_IMAGES
:
2569 Status
= InsertImagePackage (
2572 DatabaseRecord
->PackageList
,
2575 if (EFI_ERROR (Status
)) {
2578 Status
= InvokeRegisteredFunction (
2581 (VOID
*) ImagePackage
,
2582 (UINT8
) (PackageHeader
.Type
),
2583 DatabaseRecord
->Handle
2586 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2587 Status
= InsertSimpleFontPackage (
2590 DatabaseRecord
->PackageList
,
2593 if (EFI_ERROR (Status
)) {
2596 Status
= InvokeRegisteredFunction (
2599 (VOID
*) SimpleFontPackage
,
2600 (UINT8
) (PackageHeader
.Type
),
2601 DatabaseRecord
->Handle
2604 case EFI_HII_PACKAGE_DEVICE_PATH
:
2605 Status
= AddDevicePathPackage (
2608 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2616 if (EFI_ERROR (Status
)) {
2620 // goto header of next package
2622 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2623 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2627 // Adjust String Package to make sure all string packages have the same max string ID.
2629 if (!EFI_ERROR (Status
) && StringPkgIsAdd
) {
2630 Status
= AdjustStringPackage (DatabaseRecord
->PackageList
);
2638 This function exports a package list to a buffer. It is the worker function
2639 of HiiExportPackageList.
2641 This is a internal function.
2643 @param Private Hii database private structure.
2644 @param Handle Identification of a package list.
2645 @param PackageList Pointer to a package list which will be exported.
2646 @param UsedSize The length of buffer has been used by exporting
2647 package lists when Handle is NULL.
2648 @param BufferSize Length of the Buffer.
2649 @param Buffer Allocated space for storing exported data.
2651 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2653 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2658 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2659 IN EFI_HII_HANDLE Handle
,
2660 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2661 IN OUT UINTN
*UsedSize
,
2662 IN UINTN BufferSize
,
2663 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2668 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2670 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
2671 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2672 ASSERT (IsHiiHandleValid (Handle
));
2674 if (BufferSize
> 0 && Buffer
== NULL
) {
2675 return EFI_INVALID_PARAMETER
;
2679 // Copy the package list header
2680 // ResultSize indicates the length of the exported bytes of this package list
2682 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2683 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2684 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2687 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2689 Status
= ExportGuidPackages (
2695 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2698 if (EFI_ERROR (Status
)) {
2701 Status
= ExportFormPackages (
2707 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2710 if (EFI_ERROR (Status
)) {
2713 Status
= ExportKeyboardLayoutPackages (
2719 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2722 if (EFI_ERROR (Status
)) {
2725 Status
= ExportStringPackages (
2731 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2734 if (EFI_ERROR (Status
)) {
2737 Status
= ExportFontPackages (
2743 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2746 if (EFI_ERROR (Status
)) {
2749 Status
= ExportImagePackages (
2755 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2758 if (EFI_ERROR (Status
)) {
2761 Status
= ExportSimpleFontPackages (
2767 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2770 if (EFI_ERROR (Status
)) {
2773 Status
= ExportDevicePathPackage (
2779 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2782 if (EFI_ERROR (Status
)) {
2786 // Append the package list end.
2788 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2789 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2790 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2792 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2793 (VOID
*) &EndofPackageList
,
2794 sizeof (EFI_HII_PACKAGE_HEADER
)
2798 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2804 This function mainly use to get and update ConfigResp string.
2806 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
2808 @retval EFI_SUCCESS Get the information successfully.
2809 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.
2813 HiiGetConfigRespInfo(
2814 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
2818 HII_DATABASE_PRIVATE_DATA
*Private
;
2819 EFI_STRING ConfigAltResp
;
2822 ConfigAltResp
= NULL
;
2825 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2828 // Get ConfigResp string
2830 Status
= HiiConfigRoutingExportConfig(&Private
->ConfigRouting
,&ConfigAltResp
);
2832 if (!EFI_ERROR (Status
)){
2833 ConfigSize
= StrSize(ConfigAltResp
);
2834 if (ConfigSize
> gConfigRespSize
){
2835 gConfigRespSize
= ConfigSize
;
2836 if (gRTConfigRespBuffer
!= NULL
){
2837 FreePool(gRTConfigRespBuffer
);
2839 gRTConfigRespBuffer
= (EFI_STRING
)AllocateRuntimeZeroPool(ConfigSize
);
2840 if (gRTConfigRespBuffer
== NULL
){
2841 FreePool(ConfigAltResp
);
2842 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the ConfigResp string.\n"));
2843 return EFI_OUT_OF_RESOURCES
;
2846 ZeroMem(gRTConfigRespBuffer
,gConfigRespSize
);
2848 CopyMem(gRTConfigRespBuffer
,ConfigAltResp
,ConfigSize
);
2849 gBS
->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid
, gRTConfigRespBuffer
);
2850 FreePool(ConfigAltResp
);
2858 This is an internal function,mainly use to get HiiDatabase information.
2860 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
2862 @retval EFI_SUCCESS Get the information successfully.
2863 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Hiidatabase data.
2868 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
2872 EFI_HII_PACKAGE_LIST_HEADER
*DatabaseInfo
;
2873 UINTN DatabaseInfoSize
;
2875 DatabaseInfo
= NULL
;
2876 DatabaseInfoSize
= 0;
2879 // Get HiiDatabase information.
2881 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, DatabaseInfo
);
2883 ASSERT(Status
== EFI_BUFFER_TOO_SMALL
);
2885 if(DatabaseInfoSize
> gDatabaseInfoSize
) {
2886 gDatabaseInfoSize
= DatabaseInfoSize
;
2887 if (gRTDatabaseInfoBuffer
!= NULL
){
2888 FreePool(gRTDatabaseInfoBuffer
);
2890 gRTDatabaseInfoBuffer
= AllocateRuntimeZeroPool(DatabaseInfoSize
);
2891 if (gRTDatabaseInfoBuffer
== NULL
){
2892 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the HiiDatabase info.\n"));
2893 return EFI_OUT_OF_RESOURCES
;
2896 ZeroMem(gRTDatabaseInfoBuffer
,gDatabaseInfoSize
);
2898 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, gRTDatabaseInfoBuffer
);
2899 ASSERT_EFI_ERROR (Status
);
2900 gBS
->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid
, gRTDatabaseInfoBuffer
);
2907 This function mainly use to get and update configuration settings information.
2909 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
2911 @retval EFI_SUCCESS Get the information successfully.
2912 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.
2916 HiiGetConfigurationSetting(
2917 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
2923 // Get the HiiDatabase info.
2925 Status
= HiiGetDatabaseInfo(This
);
2928 // Get ConfigResp string
2930 if (gExportConfigResp
) {
2931 Status
= HiiGetConfigRespInfo (This
);
2932 gExportConfigResp
= FALSE
;
2940 This function adds the packages in the package list to the database and returns a handle. If there is a
2941 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2942 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2944 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2946 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2948 @param DriverHandle Associate the package list with this EFI handle.
2949 If a NULL is specified, this data will not be associate
2950 with any drivers and cannot have a callback induced.
2951 @param Handle A pointer to the EFI_HII_HANDLE instance.
2953 @retval EFI_SUCCESS The package list associated with the Handle was
2954 added to the HII database.
2955 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2957 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2958 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2964 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2965 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2966 IN CONST EFI_HANDLE DriverHandle
, OPTIONAL
2967 OUT EFI_HII_HANDLE
*Handle
2971 HII_DATABASE_PRIVATE_DATA
*Private
;
2972 HII_DATABASE_RECORD
*DatabaseRecord
;
2973 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2975 EFI_GUID PackageListGuid
;
2977 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2978 return EFI_INVALID_PARAMETER
;
2981 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2982 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2985 // Check the Package list GUID to guarantee this GUID is unique in database.
2987 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2988 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2990 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2991 &PackageListGuid
) &&
2992 DatabaseRecord
->DriverHandle
== DriverHandle
) {
2993 return EFI_INVALID_PARAMETER
;
2998 // Build a PackageList node
3000 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
3001 if (EFI_ERROR (Status
)) {
3006 // Fill in information of the created Package List node
3007 // according to incoming package list.
3009 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
3010 if (EFI_ERROR (Status
)) {
3014 DatabaseRecord
->DriverHandle
= DriverHandle
;
3017 // Create a Device path package and add into the package list if exists.
3019 Status
= gBS
->HandleProtocol (
3021 &gEfiDevicePathProtocolGuid
,
3022 (VOID
**) &DevicePath
3024 if (!EFI_ERROR (Status
)) {
3025 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
3026 ASSERT_EFI_ERROR (Status
);
3029 *Handle
= DatabaseRecord
->Handle
;
3032 // Check whether need to get the Database and configuration setting info.
3033 // Only after ReadyToBoot, need to do the export.
3035 if (gExportAfterReadyToBoot
) {
3036 HiiGetConfigurationSetting(This
);
3044 This function removes the package list that is associated with Handle
3045 from the HII database. Before removing the package, any registered functions
3046 with the notification type REMOVE_PACK and the same package type will be called.
3048 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3050 @param Handle The handle that was registered to the data that is
3051 requested for removal.
3053 @retval EFI_SUCCESS The data associated with the Handle was removed
3054 from the HII database.
3055 @retval EFI_NOT_FOUND The specified handle is not in database.
3056 @retval EFI_INVALID_PARAMETER The Handle was not valid.
3061 HiiRemovePackageList (
3062 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3063 IN EFI_HII_HANDLE Handle
3067 HII_DATABASE_PRIVATE_DATA
*Private
;
3069 HII_DATABASE_RECORD
*Node
;
3070 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3071 HII_HANDLE
*HiiHandle
;
3074 return EFI_INVALID_PARAMETER
;
3077 if (!IsHiiHandleValid (Handle
)) {
3078 return EFI_NOT_FOUND
;
3081 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3084 // Get the packagelist to be removed.
3086 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3087 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3088 if (Node
->Handle
== Handle
) {
3089 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3090 ASSERT (PackageList
!= NULL
);
3093 // Call registered functions with REMOVE_PACK before removing packages
3094 // then remove them.
3096 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
3097 if (EFI_ERROR (Status
)) {
3100 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
3101 if (EFI_ERROR (Status
)) {
3104 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
3105 if (EFI_ERROR (Status
)) {
3108 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
3109 if (EFI_ERROR (Status
)) {
3112 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
3113 if (EFI_ERROR (Status
)) {
3116 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
3117 if (EFI_ERROR (Status
)) {
3120 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
3121 if (EFI_ERROR (Status
)) {
3124 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
3125 if (EFI_ERROR (Status
)) {
3130 // Free resources of the package list
3132 RemoveEntryList (&Node
->DatabaseEntry
);
3134 HiiHandle
= (HII_HANDLE
*) Handle
;
3135 RemoveEntryList (&HiiHandle
->Handle
);
3136 Private
->HiiHandleCount
--;
3137 ASSERT (Private
->HiiHandleCount
>= 0);
3139 HiiHandle
->Signature
= 0;
3140 FreePool (HiiHandle
);
3141 FreePool (Node
->PackageList
);
3145 // Check whether need to get the Database and configuration setting info.
3146 // Only after ReadyToBoot, need to do the export.
3148 if (gExportAfterReadyToBoot
) {
3149 HiiGetConfigurationSetting(This
);
3155 return EFI_NOT_FOUND
;
3160 This function updates the existing package list (which has the specified Handle)
3161 in the HII databases, using the new package list specified by PackageList.
3163 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3165 @param Handle The handle that was registered to the data that is
3166 requested to be updated.
3167 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
3170 @retval EFI_SUCCESS The HII database was successfully updated.
3171 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
3173 @retval EFI_INVALID_PARAMETER PackageList was NULL.
3174 @retval EFI_NOT_FOUND The specified Handle is not in database.
3179 HiiUpdatePackageList (
3180 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3181 IN EFI_HII_HANDLE Handle
,
3182 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
3186 HII_DATABASE_PRIVATE_DATA
*Private
;
3188 HII_DATABASE_RECORD
*Node
;
3189 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
3190 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
3191 EFI_HII_PACKAGE_HEADER PackageHeader
;
3193 if (This
== NULL
|| PackageList
== NULL
) {
3194 return EFI_INVALID_PARAMETER
;
3197 if (!IsHiiHandleValid (Handle
)) {
3198 return EFI_NOT_FOUND
;
3201 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3203 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
3205 Status
= EFI_SUCCESS
;
3208 // Get original packagelist to be updated
3210 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3211 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3212 if (Node
->Handle
== Handle
) {
3213 OldPackageList
= Node
->PackageList
;
3215 // Remove the package if its type matches one of the package types which is
3216 // contained in the new package list.
3218 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3219 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
3220 switch (PackageHeader
.Type
) {
3221 case EFI_HII_PACKAGE_TYPE_GUID
:
3222 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
3224 case EFI_HII_PACKAGE_FORMS
:
3225 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
3227 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3228 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
3230 case EFI_HII_PACKAGE_STRINGS
:
3231 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
3233 case EFI_HII_PACKAGE_FONTS
:
3234 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
3236 case EFI_HII_PACKAGE_IMAGES
:
3237 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
3239 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3240 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
3242 case EFI_HII_PACKAGE_DEVICE_PATH
:
3243 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
3247 if (EFI_ERROR (Status
)) {
3251 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3252 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3256 // Add all of the packages within the new package list
3258 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3261 // Check whether need to get the Database and configuration setting info.
3262 // Only after ReadyToBoot, need to do the export.
3264 if (gExportAfterReadyToBoot
) {
3265 if (Status
== EFI_SUCCESS
){
3266 HiiGetConfigurationSetting(This
);
3274 return EFI_NOT_FOUND
;
3279 This function returns a list of the package handles of the specified type
3280 that are currently active in the database. The pseudo-type
3281 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3283 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3285 @param PackageType Specifies the package type of the packages to list
3286 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3288 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3289 this is the pointer to the GUID which must match
3290 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3291 Otherwise, it must be NULL.
3292 @param HandleBufferLength On input, a pointer to the length of the handle
3293 buffer. On output, the length of the handle
3294 buffer that is required for the handles found.
3295 @param Handle An array of EFI_HII_HANDLE instances returned.
3297 @retval EFI_SUCCESS The matching handles are outputted successfully.
3298 HandleBufferLength is updated with the actual length.
3299 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3300 Handle is too small to support the number of
3301 handles. HandleBufferLength is updated with a
3302 value that will enable the data to fit.
3303 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3304 @retval EFI_INVALID_PARAMETER HandleBufferLength was NULL.
3305 @retval EFI_INVALID_PARAMETER The value referenced by HandleBufferLength was not
3306 zero and Handle was NULL.
3307 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3308 PackageGuid is not NULL, PackageType is a EFI_HII_
3309 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3314 HiiListPackageLists (
3315 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3316 IN UINT8 PackageType
,
3317 IN CONST EFI_GUID
*PackageGuid
,
3318 IN OUT UINTN
*HandleBufferLength
,
3319 OUT EFI_HII_HANDLE
*Handle
3322 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3323 HII_DATABASE_PRIVATE_DATA
*Private
;
3324 HII_DATABASE_RECORD
*Node
;
3327 HII_HANDLE
**Result
;
3329 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3333 // Check input parameters
3335 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3336 return EFI_INVALID_PARAMETER
;
3338 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3339 return EFI_INVALID_PARAMETER
;
3341 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3342 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3343 return EFI_INVALID_PARAMETER
;
3346 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3348 Result
= (HII_HANDLE
**) Handle
;
3351 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3352 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3353 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3354 switch (PackageType
) {
3355 case EFI_HII_PACKAGE_TYPE_GUID
:
3356 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3357 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3359 (EFI_GUID
*) PackageGuid
,
3360 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3367 case EFI_HII_PACKAGE_FORMS
:
3368 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3372 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3373 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3377 case EFI_HII_PACKAGE_STRINGS
:
3378 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3382 case EFI_HII_PACKAGE_FONTS
:
3383 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3387 case EFI_HII_PACKAGE_IMAGES
:
3388 if (PackageList
->ImagePkg
!= NULL
) {
3392 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3393 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3397 case EFI_HII_PACKAGE_DEVICE_PATH
:
3398 if (PackageList
->DevicePathPkg
!= NULL
) {
3403 // Pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3406 case EFI_HII_PACKAGE_TYPE_ALL
:
3414 // This active package list has the specified package type, list it.
3417 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3418 if (ResultSize
<= *HandleBufferLength
) {
3419 *Result
++ = Node
->Handle
;
3425 if (ResultSize
== 0) {
3426 return EFI_NOT_FOUND
;
3429 if (*HandleBufferLength
< ResultSize
) {
3430 *HandleBufferLength
= ResultSize
;
3431 return EFI_BUFFER_TOO_SMALL
;
3434 *HandleBufferLength
= ResultSize
;
3440 This function will export one or all package lists in the database to a buffer.
3441 For each package list exported, this function will call functions registered
3442 with EXPORT_PACK and then copy the package list to the buffer.
3444 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3446 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3447 package list in the HII database to export or NULL
3448 to indicate all package lists should be exported.
3449 @param BufferSize On input, a pointer to the length of the buffer.
3450 On output, the length of the buffer that is
3451 required for the exported data.
3452 @param Buffer A pointer to a buffer that will contain the
3453 results of the export function.
3455 @retval EFI_SUCCESS Package exported.
3456 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3457 Handle is too small to support the number of
3458 handles. HandleBufferLength is updated with a
3459 value that will enable the data to fit.
3460 @retval EFI_NOT_FOUND The specified Handle could not be found in the
3462 @retval EFI_INVALID_PARAMETER BufferSize was NULL.
3463 @retval EFI_INVALID_PARAMETER The value referenced by BufferSize was not zero
3464 and Buffer was NULL.
3469 HiiExportPackageLists (
3470 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3471 IN EFI_HII_HANDLE Handle
,
3472 IN OUT UINTN
*BufferSize
,
3473 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3478 HII_DATABASE_PRIVATE_DATA
*Private
;
3479 HII_DATABASE_RECORD
*Node
;
3482 if (This
== NULL
|| BufferSize
== NULL
) {
3483 return EFI_INVALID_PARAMETER
;
3485 if (*BufferSize
> 0 && Buffer
== NULL
) {
3486 return EFI_INVALID_PARAMETER
;
3488 if ((Handle
!= NULL
) && (!IsHiiHandleValid (Handle
))) {
3489 return EFI_NOT_FOUND
;
3492 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3495 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3496 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3497 if (Handle
== NULL
) {
3499 // Export all package lists in current hii database.
3501 Status
= ExportPackageList (
3504 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3507 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3509 ASSERT_EFI_ERROR (Status
);
3510 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3511 Status
= ExportPackageList (
3514 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3519 ASSERT_EFI_ERROR (Status
);
3520 if (*BufferSize
< UsedSize
) {
3521 *BufferSize
= UsedSize
;
3522 return EFI_BUFFER_TOO_SMALL
;
3528 if (Handle
== NULL
&& UsedSize
!= 0) {
3529 if (*BufferSize
< UsedSize
) {
3530 *BufferSize
= UsedSize
;
3531 return EFI_BUFFER_TOO_SMALL
;
3536 return EFI_NOT_FOUND
;
3541 This function registers a function which will be called when specified actions related to packages of
3542 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3543 notified when specific package types are added, removed or updated in the HII database.
3544 Each driver or application which registers a notification should use
3545 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3547 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3549 @param PackageType Specifies the package type of the packages to list
3550 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3552 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3553 this is the pointer to the GUID which must match
3555 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3557 @param PackageNotifyFn Points to the function to be called when the event
3559 NotificationType occurs.
3560 @param NotifyType Describes the types of notification which this
3561 function will be receiving.
3562 @param NotifyHandle Points to the unique handle assigned to the
3563 registered notification. Can be used in
3564 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3565 to stop notifications.
3567 @retval EFI_SUCCESS Notification registered successfully.
3568 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3569 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3570 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3571 EFI_HII_PACKAGE_TYPE_GUID.
3572 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3573 EFI_HII_PACKAGE_TYPE_GUID.
3578 HiiRegisterPackageNotify (
3579 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3580 IN UINT8 PackageType
,
3581 IN CONST EFI_GUID
*PackageGuid
,
3582 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3583 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3584 OUT EFI_HANDLE
*NotifyHandle
3587 HII_DATABASE_PRIVATE_DATA
*Private
;
3588 HII_DATABASE_NOTIFY
*Notify
;
3591 if (This
== NULL
|| NotifyHandle
== NULL
) {
3592 return EFI_INVALID_PARAMETER
;
3594 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3595 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3596 return EFI_INVALID_PARAMETER
;
3599 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3602 // Allocate a notification node
3604 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3605 if (Notify
== NULL
) {
3606 return EFI_OUT_OF_RESOURCES
;
3610 // Generate a notify handle
3612 Status
= gBS
->InstallMultipleProtocolInterfaces (
3613 &Notify
->NotifyHandle
,
3618 ASSERT_EFI_ERROR (Status
);
3621 // Fill in the information to the notification node
3623 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3624 Notify
->PackageType
= PackageType
;
3625 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3626 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3627 Notify
->NotifyType
= NotifyType
;
3629 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3630 *NotifyHandle
= Notify
->NotifyHandle
;
3637 Removes the specified HII database package-related notification.
3639 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3641 @param NotificationHandle The handle of the notification function being
3644 @retval EFI_SUCCESS Notification is unregistered successfully.
3645 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3646 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3647 in current hii database.
3652 HiiUnregisterPackageNotify (
3653 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3654 IN EFI_HANDLE NotificationHandle
3657 HII_DATABASE_PRIVATE_DATA
*Private
;
3658 HII_DATABASE_NOTIFY
*Notify
;
3663 return EFI_INVALID_PARAMETER
;
3666 if (NotificationHandle
== NULL
) {
3667 return EFI_NOT_FOUND
;
3670 Status
= gBS
->OpenProtocol (
3676 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3678 if (EFI_ERROR (Status
)) {
3679 return EFI_NOT_FOUND
;
3682 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3684 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3685 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3686 if (Notify
->NotifyHandle
== NotificationHandle
) {
3688 // Remove the matching notification node
3690 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3691 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3692 Notify
->NotifyHandle
,
3697 ASSERT_EFI_ERROR (Status
);
3704 return EFI_NOT_FOUND
;
3709 This routine retrieves an array of GUID values for each keyboard layout that
3710 was previously registered in the system.
3712 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3714 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3715 GUID buffer. On output, the length of the handle
3716 buffer that is required for the handles found.
3717 @param KeyGuidBuffer An array of keyboard layout GUID instances
3720 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3721 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3722 that KeyGuidBuffer is too small to support the
3723 number of GUIDs. KeyGuidBufferLength is
3724 updated with a value that will enable the data to
3726 @retval EFI_INVALID_PARAMETER The KeyGuidBufferLength is NULL.
3727 @retval EFI_INVALID_PARAMETER The value referenced by KeyGuidBufferLength is not
3728 zero and KeyGuidBuffer is NULL.
3729 @retval EFI_NOT_FOUND There was no keyboard layout.
3734 HiiFindKeyboardLayouts (
3735 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3736 IN OUT UINT16
*KeyGuidBufferLength
,
3737 OUT EFI_GUID
*KeyGuidBuffer
3740 HII_DATABASE_PRIVATE_DATA
*Private
;
3741 HII_DATABASE_RECORD
*Node
;
3742 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3748 UINT16 LayoutLength
;
3750 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3752 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3753 return EFI_INVALID_PARAMETER
;
3756 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3757 return EFI_INVALID_PARAMETER
;
3760 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3764 // Search all package lists in whole database to retrieve keyboard layout.
3766 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3767 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3768 PackageList
= Node
->PackageList
;
3769 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3770 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3771 Link1
= Link1
->ForwardLink
3774 // Find out all Keyboard Layout packages in this package list.
3778 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3780 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3782 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3785 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3788 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3789 ResultSize
+= sizeof (EFI_GUID
);
3790 if (ResultSize
<= *KeyGuidBufferLength
) {
3791 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3792 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3793 Layout
= Layout
+ LayoutLength
;
3799 if (ResultSize
== 0) {
3800 return EFI_NOT_FOUND
;
3803 if (*KeyGuidBufferLength
< ResultSize
) {
3804 *KeyGuidBufferLength
= ResultSize
;
3805 return EFI_BUFFER_TOO_SMALL
;
3808 *KeyGuidBufferLength
= ResultSize
;
3814 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3815 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3817 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3819 @param KeyGuid A pointer to the unique ID associated with a given
3820 keyboard layout. If KeyGuid is NULL then the
3821 current layout will be retrieved.
3822 @param KeyboardLayoutLength On input, a pointer to the length of the
3823 KeyboardLayout buffer. On output, the length of
3824 the data placed into KeyboardLayout.
3825 @param KeyboardLayout A pointer to a buffer containing the retrieved
3828 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3829 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3830 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3832 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3833 that KeyboardLayout is too small to support the
3834 requested keyboard layout. KeyboardLayoutLength is
3835 updated with a value that will enable the
3841 HiiGetKeyboardLayout (
3842 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3843 IN CONST EFI_GUID
*KeyGuid
,
3844 IN OUT UINT16
*KeyboardLayoutLength
,
3845 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3848 HII_DATABASE_PRIVATE_DATA
*Private
;
3849 HII_DATABASE_RECORD
*Node
;
3850 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3856 UINT16 LayoutLength
;
3857 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3859 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3860 return EFI_INVALID_PARAMETER
;
3862 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3863 return EFI_INVALID_PARAMETER
;
3866 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3868 // Retrieve the current keyboard layout.
3870 if (KeyGuid
== NULL
) {
3871 if (Private
->CurrentLayout
== NULL
) {
3872 return EFI_NOT_FOUND
;
3874 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3875 if (*KeyboardLayoutLength
< LayoutLength
) {
3876 *KeyboardLayoutLength
= LayoutLength
;
3877 return EFI_BUFFER_TOO_SMALL
;
3879 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3883 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3884 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3885 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3886 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3887 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3888 Link1
= Link1
->ForwardLink
3892 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3894 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3897 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3898 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3899 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3900 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3901 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3902 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3903 if (LayoutLength
<= *KeyboardLayoutLength
) {
3904 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3907 *KeyboardLayoutLength
= LayoutLength
;
3908 return EFI_BUFFER_TOO_SMALL
;
3911 Layout
= Layout
+ LayoutLength
;
3916 return EFI_NOT_FOUND
;
3921 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3922 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3923 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3924 can be notified of this change.
3926 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3928 @param KeyGuid A pointer to the unique ID associated with a given
3931 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3932 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3934 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3939 HiiSetKeyboardLayout (
3940 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3941 IN CONST EFI_GUID
*KeyGuid
3944 HII_DATABASE_PRIVATE_DATA
*Private
;
3945 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3946 UINT16 KeyboardLayoutLength
;
3949 if (This
== NULL
|| KeyGuid
== NULL
) {
3950 return EFI_INVALID_PARAMETER
;
3953 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3956 // The specified GUID equals the current keyboard layout GUID,
3959 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3964 // Try to find the incoming keyboard layout data in current database.
3966 KeyboardLayoutLength
= 0;
3967 KeyboardLayout
= NULL
;
3968 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3969 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3973 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3974 ASSERT (KeyboardLayout
!= NULL
);
3975 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3976 ASSERT_EFI_ERROR (Status
);
3979 // Backup current keyboard layout.
3981 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3982 if (Private
->CurrentLayout
!= NULL
) {
3983 FreePool(Private
->CurrentLayout
);
3985 Private
->CurrentLayout
= KeyboardLayout
;
3988 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3989 // current keyboard layout is changed.
3991 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3992 ASSERT_EFI_ERROR (Status
);
3999 Return the EFI handle associated with a package list.
4001 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
4003 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
4004 package list in the HIIdatabase.
4005 @param DriverHandle On return, contains the EFI_HANDLE which was
4006 registered with the package list in
4009 @retval EFI_SUCCESS The DriverHandle was returned successfully.
4010 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
4011 DriverHandle was NULL.
4012 @retval EFI_NOT_FOUND This PackageList handle can not be found in
4018 HiiGetPackageListHandle (
4019 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
4020 IN EFI_HII_HANDLE PackageListHandle
,
4021 OUT EFI_HANDLE
*DriverHandle
4024 HII_DATABASE_PRIVATE_DATA
*Private
;
4025 HII_DATABASE_RECORD
*Node
;
4028 if (This
== NULL
|| DriverHandle
== NULL
) {
4029 return EFI_INVALID_PARAMETER
;
4032 if (!IsHiiHandleValid (PackageListHandle
)) {
4033 return EFI_INVALID_PARAMETER
;
4036 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
4038 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
4039 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
4040 if (Node
->Handle
== PackageListHandle
) {
4041 *DriverHandle
= Node
->DriverHandle
;
4046 return EFI_NOT_FOUND
;