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;
24 This function generates a HII_DATABASE_RECORD node and adds into hii database.
25 This is a internal function.
27 @param Private hii database private structure
28 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
31 @retval EFI_SUCCESS A database record is generated successfully.
32 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
34 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
38 GenerateHiiDatabaseRecord (
39 IN HII_DATABASE_PRIVATE_DATA
*Private
,
40 OUT HII_DATABASE_RECORD
**DatabaseNode
43 HII_DATABASE_RECORD
*DatabaseRecord
;
44 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
45 HII_HANDLE
*HiiHandle
;
47 if (Private
== NULL
|| DatabaseNode
== NULL
) {
48 return EFI_INVALID_PARAMETER
;
51 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
52 if (DatabaseRecord
== NULL
) {
53 return EFI_OUT_OF_RESOURCES
;
55 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
57 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
58 if (DatabaseRecord
->PackageList
== NULL
) {
59 FreePool (DatabaseRecord
);
60 return EFI_OUT_OF_RESOURCES
;
63 PackageList
= DatabaseRecord
->PackageList
;
65 InitializeListHead (&PackageList
->GuidPkgHdr
);
66 InitializeListHead (&PackageList
->FormPkgHdr
);
67 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
68 InitializeListHead (&PackageList
->StringPkgHdr
);
69 InitializeListHead (&PackageList
->FontPkgHdr
);
70 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
71 PackageList
->ImagePkg
= NULL
;
72 PackageList
->DevicePathPkg
= NULL
;
75 // Create a new hii handle
77 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
78 if (HiiHandle
== NULL
) {
79 FreePool (DatabaseRecord
->PackageList
);
80 FreePool (DatabaseRecord
);
81 return EFI_OUT_OF_RESOURCES
;
83 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
85 // Backup the number of Hii handles
87 Private
->HiiHandleCount
++;
88 HiiHandle
->Key
= (UINTN
) Private
->HiiHandleCount
;
90 // Insert the handle to hii handle list of the whole database.
92 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
94 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
97 // Insert the Package List node to Package List link of the whole database.
99 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
101 *DatabaseNode
= DatabaseRecord
;
109 This function checks whether a handle is a valid EFI_HII_HANDLE
110 This is a internal function.
112 @param Handle Pointer to a EFI_HII_HANDLE
115 @retval FALSE Invalid
120 EFI_HII_HANDLE Handle
123 HII_HANDLE
*HiiHandle
;
125 HiiHandle
= (HII_HANDLE
*) Handle
;
127 if (HiiHandle
== NULL
) {
131 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
140 This function invokes the matching registered function.
141 This is a internal function.
143 @param Private HII Database driver private structure.
144 @param NotifyType The type of change concerning the database.
145 @param PackageInstance Points to the package referred to by the
147 @param PackageType Package type
148 @param Handle The handle of the package list which contains the
151 @retval EFI_SUCCESS Already checked all registered function and
153 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
157 InvokeRegisteredFunction (
158 IN HII_DATABASE_PRIVATE_DATA
*Private
,
159 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
160 IN VOID
*PackageInstance
,
161 IN UINT8 PackageType
,
162 IN EFI_HII_HANDLE Handle
165 HII_DATABASE_NOTIFY
*Notify
;
167 EFI_HII_PACKAGE_HEADER
*Package
;
171 UINT32 ImageBlockSize
;
172 UINT32 PaletteInfoSize
;
174 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
175 return EFI_INVALID_PARAMETER
;
177 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
178 return EFI_INVALID_PARAMETER
;
180 if (!IsHiiHandleValid (Handle
)) {
181 return EFI_INVALID_PARAMETER
;
188 // Convert the incoming package from hii database storage format to UEFI
189 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
191 switch (PackageType
) {
192 case EFI_HII_PACKAGE_TYPE_GUID
:
193 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
196 case EFI_HII_PACKAGE_FORMS
:
197 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
198 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
199 ASSERT (Buffer
!= NULL
);
202 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
203 sizeof (EFI_HII_PACKAGE_HEADER
)
206 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
207 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
208 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
210 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
213 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
214 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
217 case EFI_HII_PACKAGE_STRINGS
:
218 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
219 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
220 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
221 ASSERT (Buffer
!= NULL
);
224 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
229 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
230 BufferSize
- HeaderSize
232 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
235 case EFI_HII_PACKAGE_FONTS
:
236 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
237 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
238 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
239 ASSERT (Buffer
!= NULL
);
242 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
247 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
248 BufferSize
- HeaderSize
250 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
253 case EFI_HII_PACKAGE_IMAGES
:
254 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
255 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
256 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
257 ASSERT (Buffer
!= NULL
);
261 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
265 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
270 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
271 if (ImageBlockSize
!= 0) {
274 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
279 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
280 if (PaletteInfoSize
!= 0) {
282 Buffer
+ HeaderSize
+ ImageBlockSize
,
283 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
286 HeaderSize
+= ImageBlockSize
;
288 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
293 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
296 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
297 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
298 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
299 ASSERT (Buffer
!= NULL
);
302 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
305 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
308 case EFI_HII_PACKAGE_DEVICE_PATH
:
309 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
313 return EFI_INVALID_PARAMETER
;
316 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
317 Link
!= &Private
->DatabaseNotifyList
;
318 Link
= Link
->ForwardLink
320 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
321 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
323 // Check in case PackageGuid is not NULL when Package is GUID package
325 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
326 Notify
->PackageGuid
= NULL
;
329 // Status of Registered Function is unknown so did not check it
331 Notify
->PackageNotifyFn (
341 if (Buffer
!= NULL
) {
350 This function insert a GUID package to a package list node.
351 This is a internal function.
353 @param PackageHdr Pointer to a buffer stored with GUID package
355 @param NotifyType The type of change concerning the database.
356 @param PackageList Pointer to a package list which will be inserted
358 @param Package Created GUID pacakge
360 @retval EFI_SUCCESS Guid Package is inserted successfully.
361 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
363 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
369 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
370 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
371 OUT HII_GUID_PACKAGE_INSTANCE
**Package
374 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
375 EFI_HII_PACKAGE_HEADER PackageHeader
;
377 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
378 return EFI_INVALID_PARAMETER
;
381 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
384 // Create a GUID package node
386 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
387 if (GuidPackage
== NULL
) {
388 return EFI_OUT_OF_RESOURCES
;
390 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
391 if (GuidPackage
->GuidPkg
== NULL
) {
392 FreePool (GuidPackage
);
393 return EFI_OUT_OF_RESOURCES
;
396 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
397 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
398 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
399 *Package
= GuidPackage
;
401 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
402 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
410 This function exports GUID packages to a buffer.
411 This is a internal function.
413 @param Private Hii database private structure.
414 @param Handle Identification of a package list.
415 @param PackageList Pointer to a package list which will be exported.
416 @param UsedSize The length of buffer be used.
417 @param BufferSize Length of the Buffer.
418 @param Buffer Allocated space for storing exported data.
419 @param ResultSize The size of the already exported content of this
422 @retval EFI_SUCCESS Guid Packages are exported successfully.
423 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
428 IN HII_DATABASE_PRIVATE_DATA
*Private
,
429 IN EFI_HII_HANDLE Handle
,
430 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
434 IN OUT UINTN
*ResultSize
437 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
440 EFI_HII_PACKAGE_HEADER PackageHeader
;
443 if (PackageList
== NULL
|| ResultSize
== NULL
) {
444 return EFI_INVALID_PARAMETER
;
447 if (BufferSize
> 0 && Buffer
== NULL
) {
448 return EFI_INVALID_PARAMETER
;
452 Status
= EFI_SUCCESS
;
454 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
455 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
456 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
457 PackageLength
+= PackageHeader
.Length
;
458 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
459 Status
= InvokeRegisteredFunction (
461 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
462 (VOID
*) GuidPackage
,
463 EFI_HII_PACKAGE_TYPE_GUID
,
466 ASSERT_EFI_ERROR (Status
);
467 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
468 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
472 *ResultSize
+= PackageLength
;
478 This function deletes all GUID packages from a package list node.
479 This is a internal function.
481 @param Private Hii database private data.
482 @param Handle Handle of the package list which contains the to
483 be removed GUID packages.
484 @param PackageList Pointer to a package list that contains removing
487 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
488 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
493 IN HII_DATABASE_PRIVATE_DATA
*Private
,
494 IN EFI_HII_HANDLE Handle
,
495 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
498 LIST_ENTRY
*ListHead
;
499 HII_GUID_PACKAGE_INSTANCE
*Package
;
501 EFI_HII_PACKAGE_HEADER PackageHeader
;
503 ListHead
= &PackageList
->GuidPkgHdr
;
505 while (!IsListEmpty (ListHead
)) {
507 ListHead
->ForwardLink
,
508 HII_GUID_PACKAGE_INSTANCE
,
510 HII_GUID_PACKAGE_SIGNATURE
512 Status
= InvokeRegisteredFunction (
514 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
516 EFI_HII_PACKAGE_TYPE_GUID
,
519 if (EFI_ERROR (Status
)) {
523 RemoveEntryList (&Package
->GuidEntry
);
524 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
525 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
526 FreePool (Package
->GuidPkg
);
535 This function insert a Form package to a package list node.
536 This is a internal function.
538 @param PackageHdr Pointer to a buffer stored with Form package
540 @param NotifyType The type of change concerning the database.
541 @param PackageList Pointer to a package list which will be inserted
543 @param Package Created Form package
545 @retval EFI_SUCCESS Form Package is inserted successfully.
546 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
548 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
554 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
555 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
556 OUT HII_IFR_PACKAGE_INSTANCE
**Package
559 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
560 EFI_HII_PACKAGE_HEADER PackageHeader
;
562 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
563 return EFI_INVALID_PARAMETER
;
567 // Get the length of the package, including package header itself
569 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
572 // Create a Form package node
574 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
575 if (FormPackage
== NULL
) {
576 return EFI_OUT_OF_RESOURCES
;
579 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
580 if (FormPackage
->IfrData
== NULL
) {
581 FreePool (FormPackage
);
582 return EFI_OUT_OF_RESOURCES
;
585 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
587 // Copy Package Header
589 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
595 FormPackage
->IfrData
,
596 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
597 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
600 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
601 *Package
= FormPackage
;
603 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
604 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
611 This function exports Form packages to a buffer.
612 This is a internal function.
614 @param Private Hii database private structure.
615 @param Handle Identification of a package list.
616 @param PackageList Pointer to a package list which will be exported.
617 @param UsedSize The length of buffer be used.
618 @param BufferSize Length of the Buffer.
619 @param Buffer Allocated space for storing exported data.
620 @param ResultSize The size of the already exported content of this
623 @retval EFI_SUCCESS Form Packages are exported successfully.
624 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
629 IN HII_DATABASE_PRIVATE_DATA
*Private
,
630 IN EFI_HII_HANDLE Handle
,
631 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
635 IN OUT UINTN
*ResultSize
638 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
643 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
644 return EFI_INVALID_PARAMETER
;
647 if (BufferSize
> 0 && Buffer
== NULL
) {
648 return EFI_INVALID_PARAMETER
;
652 Status
= EFI_SUCCESS
;
655 // Export Form packages.
657 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
658 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
659 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
660 if ((Buffer
!= NULL
) && (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
)) {
662 // Invoke registered notification if exists
664 Status
= InvokeRegisteredFunction (
666 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
667 (VOID
*) FormPackage
,
668 EFI_HII_PACKAGE_FORMS
,
671 ASSERT_EFI_ERROR (Status
);
673 // Copy the Form package content.
675 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
676 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
679 (VOID
*) FormPackage
->IfrData
,
680 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
682 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
686 *ResultSize
+= PackageLength
;
694 This function deletes all Form packages from a package list node.
695 This is a internal function.
697 @param Private Hii database private data.
698 @param Handle Handle of the package list which contains the to
699 be removed Form packages.
700 @param PackageList Pointer to a package list that contains removing
703 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
704 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
709 IN HII_DATABASE_PRIVATE_DATA
*Private
,
710 IN EFI_HII_HANDLE Handle
,
711 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
714 LIST_ENTRY
*ListHead
;
715 HII_IFR_PACKAGE_INSTANCE
*Package
;
718 ListHead
= &PackageList
->FormPkgHdr
;
720 while (!IsListEmpty (ListHead
)) {
722 ListHead
->ForwardLink
,
723 HII_IFR_PACKAGE_INSTANCE
,
725 HII_IFR_PACKAGE_SIGNATURE
727 Status
= InvokeRegisteredFunction (
729 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
731 EFI_HII_PACKAGE_FORMS
,
734 if (EFI_ERROR (Status
)) {
738 RemoveEntryList (&Package
->IfrEntry
);
739 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
740 FreePool (Package
->IfrData
);
751 This function insert a String package to a package list node.
752 This is a internal function.
754 @param Private Hii database private structure.
755 @param PackageHdr Pointer to a buffer stored with String package
757 @param NotifyType The type of change concerning the database.
758 @param PackageList Pointer to a package list which will be inserted
760 @param Package Created String package
762 @retval EFI_SUCCESS String Package is inserted successfully.
763 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
765 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
766 @retval EFI_UNSUPPORTED A string package with the same language already
767 exists in current package list.
771 InsertStringPackage (
772 IN HII_DATABASE_PRIVATE_DATA
*Private
,
774 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
775 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
776 OUT HII_STRING_PACKAGE_INSTANCE
**Package
779 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
782 EFI_HII_PACKAGE_HEADER PackageHeader
;
787 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
788 return EFI_INVALID_PARAMETER
;
790 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
791 return EFI_INVALID_PARAMETER
;
794 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
795 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
798 // It is illegal to have two string packages with same language within one packagelist
799 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
801 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
802 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
803 if (Language
== NULL
) {
804 return EFI_OUT_OF_RESOURCES
;
806 AsciiStrCpyS (Language
, LanguageSize
/ sizeof (CHAR8
), (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
807 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
808 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
809 if (HiiCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
811 return EFI_UNSUPPORTED
;
817 // Create a String package node
819 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
820 if (StringPackage
== NULL
) {
821 Status
= EFI_OUT_OF_RESOURCES
;
825 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
826 if (StringPackage
->StringPkgHdr
== NULL
) {
827 Status
= EFI_OUT_OF_RESOURCES
;
831 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
832 if (StringPackage
->StringBlock
== NULL
) {
833 Status
= EFI_OUT_OF_RESOURCES
;
837 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
838 StringPackage
->FontId
= 0;
839 InitializeListHead (&StringPackage
->FontInfoList
);
842 // Copy the String package header.
844 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
847 // Copy the String blocks
850 StringPackage
->StringBlock
,
851 (UINT8
*) PackageHdr
+ HeaderSize
,
852 PackageHeader
.Length
- HeaderSize
856 // Collect all font block info
858 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, &StringPackage
->MaxStringId
, NULL
);
859 if (EFI_ERROR (Status
)) {
864 // Insert to String package array
866 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
867 *Package
= StringPackage
;
869 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
870 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
877 if (StringPackage
!= NULL
) {
878 if (StringPackage
->StringBlock
!= NULL
) {
879 FreePool (StringPackage
->StringBlock
);
881 if (StringPackage
->StringPkgHdr
!= NULL
) {
882 FreePool (StringPackage
->StringPkgHdr
);
884 FreePool (StringPackage
);
891 Adjust all string packages in a single package list to have the same max string ID.
893 @param PackageList Pointer to a package list which will be adjusted.
895 @retval EFI_SUCCESS Adjust all string packages successfully.
896 @retval others Can't adjust string packges.
900 AdjustStringPackage (
901 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
905 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
906 UINT32 Skip2BlockSize
;
910 EFI_STRING_ID MaxStringId
;
914 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
915 Link
!= &PackageList
->StringPkgHdr
;
916 Link
= Link
->ForwardLink
918 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
919 if (MaxStringId
< StringPackage
->MaxStringId
) {
920 MaxStringId
= StringPackage
->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 (StringPackage
->MaxStringId
< MaxStringId
) {
930 OldBlockSize
= StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
932 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.
934 SkipCount
= (UINT16
) (MaxStringId
- StringPackage
->MaxStringId
);
935 Skip2BlockSize
= (UINT32
) sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
937 StringBlock
= (UINT8
*) AllocateZeroPool (OldBlockSize
+ Skip2BlockSize
);
938 if (StringBlock
== NULL
) {
939 return EFI_OUT_OF_RESOURCES
;
942 // Copy original string blocks, except the EFI_HII_SIBT_END.
944 CopyMem (StringBlock
, StringPackage
->StringBlock
, OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
));
946 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks
948 BlockPtr
= StringBlock
+ OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
);
949 *BlockPtr
= EFI_HII_SIBT_SKIP2
;
950 CopyMem (BlockPtr
+ 1, &SkipCount
, sizeof (UINT16
));
951 BlockPtr
+= sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
954 // Append a EFI_HII_SIBT_END block to the end.
956 *BlockPtr
= EFI_HII_SIBT_END
;
957 FreePool (StringPackage
->StringBlock
);
958 StringPackage
->StringBlock
= StringBlock
;
959 StringPackage
->StringPkgHdr
->Header
.Length
+= Skip2BlockSize
;
960 PackageList
->PackageListHdr
.PackageLength
+= Skip2BlockSize
;
961 StringPackage
->MaxStringId
= MaxStringId
;
969 This function exports String packages to a buffer.
970 This is a internal function.
972 @param Private Hii database private structure.
973 @param Handle Identification of a package list.
974 @param PackageList Pointer to a package list which will be exported.
975 @param UsedSize The length of buffer be used.
976 @param BufferSize Length of the Buffer.
977 @param Buffer Allocated space for storing exported data.
978 @param ResultSize The size of the already exported content of this
981 @retval EFI_SUCCESS String Packages are exported successfully.
982 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
986 ExportStringPackages (
987 IN HII_DATABASE_PRIVATE_DATA
*Private
,
988 IN EFI_HII_HANDLE Handle
,
989 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
993 IN OUT UINTN
*ResultSize
999 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1001 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1002 return EFI_INVALID_PARAMETER
;
1005 if (BufferSize
> 0 && Buffer
== NULL
) {
1006 return EFI_INVALID_PARAMETER
;
1010 Status
= EFI_SUCCESS
;
1012 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1013 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1014 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1015 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1017 // Invoke registered notification function with EXPORT_PACK notify type
1019 Status
= InvokeRegisteredFunction (
1021 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1022 (VOID
*) StringPackage
,
1023 EFI_HII_PACKAGE_STRINGS
,
1026 ASSERT_EFI_ERROR (Status
);
1028 // Copy String package header
1030 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
1031 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
1034 // Copy String blocks information
1038 StringPackage
->StringBlock
,
1039 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
1041 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1045 *ResultSize
+= PackageLength
;
1051 This function deletes all String packages from a package list node.
1052 This is a internal function.
1054 @param Private Hii database private data.
1055 @param Handle Handle of the package list which contains the to
1056 be removed String packages.
1057 @param PackageList Pointer to a package list that contains removing
1060 @retval EFI_SUCCESS String Package(s) is deleted successfully.
1061 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1065 RemoveStringPackages (
1066 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1067 IN EFI_HII_HANDLE Handle
,
1068 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1071 LIST_ENTRY
*ListHead
;
1072 HII_STRING_PACKAGE_INSTANCE
*Package
;
1073 HII_FONT_INFO
*FontInfo
;
1076 ListHead
= &PackageList
->StringPkgHdr
;
1078 while (!IsListEmpty (ListHead
)) {
1080 ListHead
->ForwardLink
,
1081 HII_STRING_PACKAGE_INSTANCE
,
1083 HII_STRING_PACKAGE_SIGNATURE
1085 Status
= InvokeRegisteredFunction (
1087 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1089 EFI_HII_PACKAGE_STRINGS
,
1092 if (EFI_ERROR (Status
)) {
1096 RemoveEntryList (&Package
->StringEntry
);
1097 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1098 FreePool (Package
->StringBlock
);
1099 FreePool (Package
->StringPkgHdr
);
1101 // Delete font information
1103 while (!IsListEmpty (&Package
->FontInfoList
)) {
1105 Package
->FontInfoList
.ForwardLink
,
1108 HII_FONT_INFO_SIGNATURE
1110 RemoveEntryList (&FontInfo
->Entry
);
1111 FreePool (FontInfo
);
1122 This function insert a Font package to a package list node.
1123 This is a internal function.
1125 @param Private Hii database private structure.
1126 @param PackageHdr Pointer to a buffer stored with Font package
1128 @param NotifyType The type of change concerning the database.
1129 @param PackageList Pointer to a package list which will be inserted
1131 @param Package Created Font package
1133 @retval EFI_SUCCESS Font Package is inserted successfully.
1134 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1136 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1137 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1138 exists in current hii database.
1143 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1144 IN VOID
*PackageHdr
,
1145 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1146 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1147 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1150 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1151 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1154 EFI_HII_PACKAGE_HEADER PackageHeader
;
1155 EFI_FONT_INFO
*FontInfo
;
1156 UINT32 FontInfoSize
;
1157 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1159 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1160 return EFI_INVALID_PARAMETER
;
1163 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1164 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1171 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1172 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1173 // attributes and identify a font uniquely.
1175 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1176 if (FontPkgHdr
== NULL
) {
1177 Status
= EFI_OUT_OF_RESOURCES
;
1180 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1182 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1183 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1184 if (FontInfo
== NULL
) {
1185 Status
= EFI_OUT_OF_RESOURCES
;
1188 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1189 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1190 StrCpyS (FontInfo
->FontName
, (FontInfoSize
- OFFSET_OF(EFI_FONT_INFO
,FontName
)) / sizeof (CHAR16
), FontPkgHdr
->FontFamily
);
1192 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1193 Status
= EFI_UNSUPPORTED
;
1198 // Create a Font package node
1200 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1201 if (FontPackage
== NULL
) {
1202 Status
= EFI_OUT_OF_RESOURCES
;
1205 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1206 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1207 InitializeListHead (&FontPackage
->GlyphInfoList
);
1209 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1210 if (FontPackage
->GlyphBlock
== NULL
) {
1211 Status
= EFI_OUT_OF_RESOURCES
;
1214 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1217 // Collect all default character cell information and backup in GlyphInfoList.
1219 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1220 if (EFI_ERROR (Status
)) {
1225 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1228 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1229 if (GlobalFont
== NULL
) {
1230 Status
= EFI_OUT_OF_RESOURCES
;
1233 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1234 GlobalFont
->FontPackage
= FontPackage
;
1235 GlobalFont
->FontInfoSize
= FontInfoSize
;
1236 GlobalFont
->FontInfo
= FontInfo
;
1237 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1240 // Insert this font package to Font package array
1242 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1243 *Package
= FontPackage
;
1245 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1246 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1253 if (FontPkgHdr
!= NULL
) {
1254 FreePool (FontPkgHdr
);
1256 if (FontInfo
!= NULL
) {
1257 FreePool (FontInfo
);
1259 if (FontPackage
!= NULL
) {
1260 if (FontPackage
->GlyphBlock
!= NULL
) {
1261 FreePool (FontPackage
->GlyphBlock
);
1263 FreePool (FontPackage
);
1265 if (GlobalFont
!= NULL
) {
1266 FreePool (GlobalFont
);
1275 This function exports Font packages to a buffer.
1276 This is a internal function.
1278 @param Private Hii database private structure.
1279 @param Handle Identification of a package list.
1280 @param PackageList Pointer to a package list which will be exported.
1281 @param UsedSize The length of buffer be used.
1282 @param BufferSize Length of the Buffer.
1283 @param Buffer Allocated space for storing exported data.
1284 @param ResultSize The size of the already exported content of this
1287 @retval EFI_SUCCESS Font Packages are exported successfully.
1288 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1292 ExportFontPackages (
1293 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1294 IN EFI_HII_HANDLE Handle
,
1295 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1297 IN UINTN BufferSize
,
1298 IN OUT VOID
*Buffer
,
1299 IN OUT UINTN
*ResultSize
1303 UINTN PackageLength
;
1305 HII_FONT_PACKAGE_INSTANCE
*Package
;
1308 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1309 return EFI_INVALID_PARAMETER
;
1312 if (BufferSize
> 0 && Buffer
== NULL
) {
1313 return EFI_INVALID_PARAMETER
;
1317 Status
= EFI_SUCCESS
;
1319 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1320 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1321 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1322 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1324 // Invoke registered notification function with EXPORT_PACK notify type
1326 Status
= InvokeRegisteredFunction (
1328 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1330 EFI_HII_PACKAGE_FONTS
,
1333 ASSERT_EFI_ERROR (Status
);
1335 // Copy Font package header
1337 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1338 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1341 // Copy Glyph blocks information
1345 Package
->GlyphBlock
,
1346 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1348 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1352 *ResultSize
+= PackageLength
;
1358 This function deletes all Font packages from a package list node.
1359 This is a internal function.
1361 @param Private Hii database private data.
1362 @param Handle Handle of the package list which contains the to
1363 be removed Font packages.
1364 @param PackageList Pointer to a package list that contains removing
1367 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1368 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1372 RemoveFontPackages (
1373 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1374 IN EFI_HII_HANDLE Handle
,
1375 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1378 LIST_ENTRY
*ListHead
;
1379 HII_FONT_PACKAGE_INSTANCE
*Package
;
1381 HII_GLYPH_INFO
*GlyphInfo
;
1383 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1385 ListHead
= &PackageList
->FontPkgHdr
;
1387 while (!IsListEmpty (ListHead
)) {
1389 ListHead
->ForwardLink
,
1390 HII_FONT_PACKAGE_INSTANCE
,
1392 HII_FONT_PACKAGE_SIGNATURE
1394 Status
= InvokeRegisteredFunction (
1396 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1398 EFI_HII_PACKAGE_FONTS
,
1401 if (EFI_ERROR (Status
)) {
1405 RemoveEntryList (&Package
->FontEntry
);
1406 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1408 if (Package
->GlyphBlock
!= NULL
) {
1409 FreePool (Package
->GlyphBlock
);
1411 FreePool (Package
->FontPkgHdr
);
1413 // Delete default character cell information
1415 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1417 Package
->GlyphInfoList
.ForwardLink
,
1420 HII_GLYPH_INFO_SIGNATURE
1422 RemoveEntryList (&GlyphInfo
->Entry
);
1423 FreePool (GlyphInfo
);
1427 // Remove corresponding global font info
1429 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1430 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1431 if (GlobalFont
->FontPackage
== Package
) {
1432 RemoveEntryList (&GlobalFont
->Entry
);
1433 FreePool (GlobalFont
->FontInfo
);
1434 FreePool (GlobalFont
);
1447 This function insert a Image package to a package list node.
1448 This is a internal function.
1450 @param PackageHdr Pointer to a buffer stored with Image package
1452 @param NotifyType The type of change concerning the database.
1453 @param PackageList Pointer to a package list which will be inserted
1455 @param Package Created Image package
1457 @retval EFI_SUCCESS Image Package is inserted successfully.
1458 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1460 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1464 InsertImagePackage (
1465 IN VOID
*PackageHdr
,
1466 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1467 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1468 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1471 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1475 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1476 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1477 UINT32 PaletteInfoOffset
;
1478 UINT32 ImageInfoOffset
;
1481 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1482 return EFI_INVALID_PARAMETER
;
1486 // Less than one image package is allowed in one package list.
1488 if (PackageList
->ImagePkg
!= NULL
) {
1489 return EFI_INVALID_PARAMETER
;
1493 // Create a Image package node
1495 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1496 if (ImagePackage
== NULL
) {
1497 return EFI_OUT_OF_RESOURCES
;
1501 // Copy the Image package header.
1503 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1505 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1506 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1509 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1512 ImagePackage
->PaletteBlock
= NULL
;
1513 if (PaletteInfoOffset
!= 0) {
1514 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1515 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1516 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1518 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1519 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1520 CurrentSize
+= sizeof (UINT16
);
1521 PaletteSize
+= (UINT32
) CurrentSize
;
1522 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1525 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1526 if (ImagePackage
->PaletteBlock
== NULL
) {
1527 FreePool (ImagePackage
);
1528 return EFI_OUT_OF_RESOURCES
;
1531 ImagePackage
->PaletteBlock
,
1532 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1538 // If ImageInfoOffset is zero, there are no images in this package.
1541 ImagePackage
->ImageBlock
= NULL
;
1542 if (ImageInfoOffset
!= 0) {
1543 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1544 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1545 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1546 if (ImagePackage
->ImageBlock
== NULL
) {
1547 FreePool (ImagePackage
->PaletteBlock
);
1548 FreePool (ImagePackage
);
1549 return EFI_OUT_OF_RESOURCES
;
1552 ImagePackage
->ImageBlock
,
1553 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1558 ImagePackage
->ImageBlockSize
= ImageSize
;
1559 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1560 PackageList
->ImagePkg
= ImagePackage
;
1561 *Package
= ImagePackage
;
1563 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1564 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1572 This function exports Image packages to a buffer.
1573 This is a internal function.
1575 @param Private Hii database private structure.
1576 @param Handle Identification of a package list.
1577 @param PackageList Pointer to a package list which will be exported.
1578 @param UsedSize The length of buffer be used.
1579 @param BufferSize Length of the Buffer.
1580 @param Buffer Allocated space for storing exported data.
1581 @param ResultSize The size of the already exported content of this
1584 @retval EFI_SUCCESS Image Packages are exported successfully.
1585 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1589 ExportImagePackages (
1590 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1591 IN EFI_HII_HANDLE Handle
,
1592 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1594 IN UINTN BufferSize
,
1595 IN OUT VOID
*Buffer
,
1596 IN OUT UINTN
*ResultSize
1599 UINTN PackageLength
;
1601 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1604 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1605 return EFI_INVALID_PARAMETER
;
1608 if (BufferSize
> 0 && Buffer
== NULL
) {
1609 return EFI_INVALID_PARAMETER
;
1612 Package
= PackageList
->ImagePkg
;
1614 if (Package
== NULL
) {
1618 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1620 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1622 // Invoke registered notification function with EXPORT_PACK notify type
1624 Status
= InvokeRegisteredFunction (
1626 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1628 EFI_HII_PACKAGE_IMAGES
,
1631 ASSERT_EFI_ERROR (Status
);
1632 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1633 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1635 // Copy Image package header,
1636 // then justify the offset for image info and palette info in the header.
1638 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1639 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1642 // Copy Image blocks information
1644 if (Package
->ImageBlockSize
!= 0) {
1645 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1646 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1649 // Copy Palette information
1651 if (Package
->PaletteInfoSize
!= 0) {
1652 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1653 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1657 *ResultSize
+= PackageLength
;
1663 This function deletes Image package from a package list node.
1664 This is a internal function.
1666 @param Private Hii database private data.
1667 @param Handle Handle of the package list which contains the to
1668 be removed Image packages.
1669 @param PackageList Package List which contains the to be removed
1672 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1673 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1677 RemoveImagePackages (
1678 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1679 IN EFI_HII_HANDLE Handle
,
1680 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1683 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1686 Package
= PackageList
->ImagePkg
;
1689 // Image package does not exist, return directly.
1691 if (Package
== NULL
) {
1695 Status
= InvokeRegisteredFunction (
1697 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1699 EFI_HII_PACKAGE_IMAGES
,
1702 if (EFI_ERROR (Status
)) {
1706 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1708 FreePool (Package
->ImageBlock
);
1709 if (Package
->PaletteBlock
!= NULL
) {
1710 FreePool (Package
->PaletteBlock
);
1714 PackageList
->ImagePkg
= NULL
;
1721 This function insert a Simple Font package to a package list node.
1722 This is a internal function.
1724 @param PackageHdr Pointer to a buffer stored with Simple Font
1725 package information.
1726 @param NotifyType The type of change concerning the database.
1727 @param PackageList Pointer to a package list which will be inserted
1729 @param Package Created Simple Font package
1731 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1732 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1733 Simple Font package.
1734 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1738 InsertSimpleFontPackage (
1739 IN VOID
*PackageHdr
,
1740 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1741 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1742 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1745 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1747 EFI_HII_PACKAGE_HEADER Header
;
1749 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1750 return EFI_INVALID_PARAMETER
;
1754 // Create a Simple Font package node
1756 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1757 if (SimpleFontPackage
== NULL
) {
1758 Status
= EFI_OUT_OF_RESOURCES
;
1761 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1764 // Copy the Simple Font package.
1766 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1768 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1769 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1770 Status
= EFI_OUT_OF_RESOURCES
;
1774 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1777 // Insert to Simple Font package array
1779 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1780 *Package
= SimpleFontPackage
;
1782 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1783 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1790 if (SimpleFontPackage
!= NULL
) {
1791 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1792 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1794 FreePool (SimpleFontPackage
);
1801 This function exports SimpleFont packages to a buffer.
1802 This is a internal function.
1804 @param Private Hii database private structure.
1805 @param Handle Identification of a package list.
1806 @param PackageList Pointer to a package list which will be exported.
1807 @param UsedSize The length of buffer be used.
1808 @param BufferSize Length of the Buffer.
1809 @param Buffer Allocated space for storing exported data.
1810 @param ResultSize The size of the already exported content of this
1813 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1814 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1818 ExportSimpleFontPackages (
1819 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1820 IN EFI_HII_HANDLE Handle
,
1821 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1823 IN UINTN BufferSize
,
1824 IN OUT VOID
*Buffer
,
1825 IN OUT UINTN
*ResultSize
1829 UINTN PackageLength
;
1831 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1833 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1834 return EFI_INVALID_PARAMETER
;
1837 if (BufferSize
> 0 && Buffer
== NULL
) {
1838 return EFI_INVALID_PARAMETER
;
1842 Status
= EFI_SUCCESS
;
1844 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1845 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1846 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1847 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1849 // Invoke registered notification function with EXPORT_PACK notify type
1851 Status
= InvokeRegisteredFunction (
1853 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1855 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1858 ASSERT_EFI_ERROR (Status
);
1861 // Copy SimpleFont package
1863 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1864 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1868 *ResultSize
+= PackageLength
;
1874 This function deletes all Simple Font packages from a package list node.
1875 This is a internal function.
1877 @param Private Hii database private data.
1878 @param Handle Handle of the package list which contains the to
1879 be removed Simple Font packages.
1880 @param PackageList Pointer to a package list that contains removing
1883 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1884 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1888 RemoveSimpleFontPackages (
1889 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1890 IN EFI_HII_HANDLE Handle
,
1891 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1894 LIST_ENTRY
*ListHead
;
1895 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1898 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1900 while (!IsListEmpty (ListHead
)) {
1902 ListHead
->ForwardLink
,
1903 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1905 HII_S_FONT_PACKAGE_SIGNATURE
1907 Status
= InvokeRegisteredFunction (
1909 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1911 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1914 if (EFI_ERROR (Status
)) {
1918 RemoveEntryList (&Package
->SimpleFontEntry
);
1919 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1920 FreePool (Package
->SimpleFontPkgHdr
);
1929 This function insert a Device path package to a package list node.
1930 This is a internal function.
1932 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1934 @param NotifyType The type of change concerning the database.
1935 @param PackageList Pointer to a package list which will be inserted
1938 @retval EFI_SUCCESS Device path Package is inserted successfully.
1939 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1940 Device path package.
1941 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1945 InsertDevicePathPackage (
1946 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1947 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1948 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1951 UINT32 PackageLength
;
1952 EFI_HII_PACKAGE_HEADER Header
;
1954 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1955 return EFI_INVALID_PARAMETER
;
1958 // Less than one device path package is allowed in one package list.
1960 if (PackageList
->DevicePathPkg
!= NULL
) {
1961 return EFI_INVALID_PARAMETER
;
1964 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1965 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1966 if (PackageList
->DevicePathPkg
== NULL
) {
1967 return EFI_OUT_OF_RESOURCES
;
1970 Header
.Length
= PackageLength
;
1971 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1972 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1974 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1976 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1980 // Since Device Path package is created by NewPackageList, either NEW_PACK
1981 // or ADD_PACK should increase the length of package list.
1983 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1989 This function exports device path package to a buffer.
1990 This is a internal function.
1992 @param Private Hii database private structure.
1993 @param Handle Identification of a package list.
1994 @param PackageList Pointer to a package list which will be exported.
1995 @param UsedSize The length of buffer be used.
1996 @param BufferSize Length of the Buffer.
1997 @param Buffer Allocated space for storing exported data.
1998 @param ResultSize The size of the already exported content of this
2001 @retval EFI_SUCCESS Device path Package is exported successfully.
2002 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2006 ExportDevicePathPackage (
2007 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2008 IN EFI_HII_HANDLE Handle
,
2009 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2011 IN UINTN BufferSize
,
2012 IN OUT VOID
*Buffer
,
2013 IN OUT UINTN
*ResultSize
2018 EFI_HII_PACKAGE_HEADER Header
;
2020 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2021 return EFI_INVALID_PARAMETER
;
2023 if (BufferSize
> 0 && Buffer
== NULL
) {
2024 return EFI_INVALID_PARAMETER
;
2027 Package
= PackageList
->DevicePathPkg
;
2029 if (Package
== NULL
) {
2033 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2035 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2037 // Invoke registered notification function with EXPORT_PACK notify type
2039 Status
= InvokeRegisteredFunction (
2041 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2043 EFI_HII_PACKAGE_DEVICE_PATH
,
2046 ASSERT_EFI_ERROR (Status
);
2049 // Copy Device path package
2051 CopyMem (Buffer
, Package
, Header
.Length
);
2054 *ResultSize
+= Header
.Length
;
2060 This function deletes Device Path package from a package list node.
2061 This is a internal function.
2063 @param Private Hii database private data.
2064 @param Handle Handle of the package list.
2065 @param PackageList Package List which contains the to be removed
2066 Device Path package.
2068 @retval EFI_SUCCESS Device Path Package is deleted successfully.
2069 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2073 RemoveDevicePathPackage (
2074 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2075 IN EFI_HII_HANDLE Handle
,
2076 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2081 EFI_HII_PACKAGE_HEADER Header
;
2083 Package
= PackageList
->DevicePathPkg
;
2086 // No device path, return directly.
2088 if (Package
== NULL
) {
2092 Status
= InvokeRegisteredFunction (
2094 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2096 EFI_HII_PACKAGE_DEVICE_PATH
,
2099 if (EFI_ERROR (Status
)) {
2103 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2104 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2108 PackageList
->DevicePathPkg
= NULL
;
2115 This function will insert a device path package to package list firstly then
2116 invoke notification functions if any.
2117 This is a internal function.
2119 @param Private Hii database private structure.
2120 @param NotifyType The type of change concerning the database.
2121 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2123 @param DatabaseRecord Pointer to a database record contains a package
2124 list which will be inserted to.
2126 @retval EFI_SUCCESS Device path Package is inserted successfully.
2127 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2128 Device path package.
2129 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2133 AddDevicePathPackage (
2134 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2135 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2136 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2137 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2142 if (DevicePath
== NULL
) {
2146 ASSERT (Private
!= NULL
);
2147 ASSERT (DatabaseRecord
!= NULL
);
2150 // Create a device path package and insert to packagelist
2152 Status
= InsertDevicePathPackage (
2155 DatabaseRecord
->PackageList
2157 if (EFI_ERROR (Status
)) {
2161 return InvokeRegisteredFunction (
2164 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2165 EFI_HII_PACKAGE_DEVICE_PATH
,
2166 DatabaseRecord
->Handle
2172 This function insert a Keyboard Layout package to a package list node.
2173 This is a internal function.
2175 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2176 package information.
2177 @param NotifyType The type of change concerning the database.
2178 @param PackageList Pointer to a package list which will be inserted
2180 @param Package Created Keyboard Layout package
2182 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2183 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2184 Keyboard Layout package.
2185 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2189 InsertKeyboardLayoutPackage (
2190 IN VOID
*PackageHdr
,
2191 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2192 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2193 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2196 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2197 EFI_HII_PACKAGE_HEADER PackageHeader
;
2200 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2201 return EFI_INVALID_PARAMETER
;
2204 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2207 // Create a Keyboard Layout package node
2209 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2210 if (KeyboardLayoutPackage
== NULL
) {
2211 Status
= EFI_OUT_OF_RESOURCES
;
2214 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2216 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2217 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2218 Status
= EFI_OUT_OF_RESOURCES
;
2222 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2223 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2225 *Package
= KeyboardLayoutPackage
;
2227 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2228 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2236 if (KeyboardLayoutPackage
!= NULL
) {
2237 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2238 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2240 FreePool (KeyboardLayoutPackage
);
2248 This function exports Keyboard Layout packages to a buffer.
2249 This is a internal function.
2251 @param Private Hii database private structure.
2252 @param Handle Identification of a package list.
2253 @param PackageList Pointer to a package list which will be exported.
2254 @param UsedSize The length of buffer be used.
2255 @param BufferSize Length of the Buffer.
2256 @param Buffer Allocated space for storing exported data.
2257 @param ResultSize The size of the already exported content of this
2260 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2262 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2266 ExportKeyboardLayoutPackages (
2267 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2268 IN EFI_HII_HANDLE Handle
,
2269 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2271 IN UINTN BufferSize
,
2272 IN OUT VOID
*Buffer
,
2273 IN OUT UINTN
*ResultSize
2277 UINTN PackageLength
;
2279 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2280 EFI_HII_PACKAGE_HEADER PackageHeader
;
2282 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2283 return EFI_INVALID_PARAMETER
;
2286 if (BufferSize
> 0 && Buffer
== NULL
) {
2287 return EFI_INVALID_PARAMETER
;
2291 Status
= EFI_SUCCESS
;
2293 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2294 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2295 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2296 PackageLength
+= PackageHeader
.Length
;
2297 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2299 // Invoke registered notification function with EXPORT_PACK notify type
2301 Status
= InvokeRegisteredFunction (
2303 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2304 (EFI_HII_PACKAGE_HEADER
*) Package
,
2305 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2308 ASSERT_EFI_ERROR (Status
);
2311 // Copy Keyboard Layout package
2313 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2314 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2318 *ResultSize
+= PackageLength
;
2324 This function deletes all Keyboard Layout packages from a package list node.
2325 This is a internal function.
2327 @param Private Hii database private data.
2328 @param Handle Handle of the package list which contains the to
2329 be removed Keyboard Layout packages.
2330 @param PackageList Pointer to a package list that contains removing
2333 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2335 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2339 RemoveKeyboardLayoutPackages (
2340 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2341 IN EFI_HII_HANDLE Handle
,
2342 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2345 LIST_ENTRY
*ListHead
;
2346 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2347 EFI_HII_PACKAGE_HEADER PackageHeader
;
2350 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2352 while (!IsListEmpty (ListHead
)) {
2354 ListHead
->ForwardLink
,
2355 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2357 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2359 Status
= InvokeRegisteredFunction (
2361 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2363 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2366 if (EFI_ERROR (Status
)) {
2370 RemoveEntryList (&Package
->KeyboardEntry
);
2371 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2372 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2373 FreePool (Package
->KeyboardPkg
);
2382 This function will insert a package list to hii database firstly then
2383 invoke notification functions if any. It is the worker function of
2384 HiiNewPackageList and HiiUpdatePackageList.
2386 This is a internal function.
2388 @param Private Hii database private structure.
2389 @param NotifyType The type of change concerning the database.
2390 @param PackageList Pointer to a package list.
2391 @param DatabaseRecord Pointer to a database record contains a package
2392 list instance which will be inserted to.
2394 @retval EFI_SUCCESS All incoming packages are inserted to current
2396 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2397 Device path package.
2398 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2403 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2404 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2405 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2406 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2410 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2411 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2412 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2413 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2414 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2415 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2416 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2417 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2418 EFI_HII_PACKAGE_HEADER PackageHeader
;
2419 UINT32 OldPackageListLen
;
2420 BOOLEAN StringPkgIsAdd
;
2423 // Initialize Variables
2425 StringPkgIsAdd
= FALSE
;
2427 StringPackage
= NULL
;
2430 ImagePackage
= NULL
;
2431 SimpleFontPackage
= NULL
;
2432 KeyboardLayoutPackage
= NULL
;
2435 // Process the package list header
2437 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2439 &DatabaseRecord
->PackageList
->PackageListHdr
,
2440 (VOID
*) PackageList
,
2441 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2443 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2444 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2447 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2448 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2450 Status
= EFI_SUCCESS
;
2452 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2453 switch (PackageHeader
.Type
) {
2454 case EFI_HII_PACKAGE_TYPE_GUID
:
2455 Status
= InsertGuidPackage (
2458 DatabaseRecord
->PackageList
,
2461 if (EFI_ERROR (Status
)) {
2464 Status
= InvokeRegisteredFunction (
2467 (VOID
*) GuidPackage
,
2468 (UINT8
) (PackageHeader
.Type
),
2469 DatabaseRecord
->Handle
2472 case EFI_HII_PACKAGE_FORMS
:
2473 Status
= InsertFormPackage (
2476 DatabaseRecord
->PackageList
,
2479 if (EFI_ERROR (Status
)) {
2482 Status
= InvokeRegisteredFunction (
2485 (VOID
*) FormPackage
,
2486 (UINT8
) (PackageHeader
.Type
),
2487 DatabaseRecord
->Handle
2490 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2491 Status
= InsertKeyboardLayoutPackage (
2494 DatabaseRecord
->PackageList
,
2495 &KeyboardLayoutPackage
2497 if (EFI_ERROR (Status
)) {
2500 Status
= InvokeRegisteredFunction (
2503 (VOID
*) KeyboardLayoutPackage
,
2504 (UINT8
) (PackageHeader
.Type
),
2505 DatabaseRecord
->Handle
2508 case EFI_HII_PACKAGE_STRINGS
:
2509 Status
= InsertStringPackage (
2513 DatabaseRecord
->PackageList
,
2516 if (EFI_ERROR (Status
)) {
2519 ASSERT (StringPackage
!= NULL
);
2520 Status
= InvokeRegisteredFunction (
2523 (VOID
*) StringPackage
,
2524 (UINT8
) (PackageHeader
.Type
),
2525 DatabaseRecord
->Handle
2527 StringPkgIsAdd
= TRUE
;
2529 case EFI_HII_PACKAGE_FONTS
:
2530 Status
= InsertFontPackage (
2534 DatabaseRecord
->PackageList
,
2537 if (EFI_ERROR (Status
)) {
2540 Status
= InvokeRegisteredFunction (
2543 (VOID
*) FontPackage
,
2544 (UINT8
) (PackageHeader
.Type
),
2545 DatabaseRecord
->Handle
2548 case EFI_HII_PACKAGE_IMAGES
:
2549 Status
= InsertImagePackage (
2552 DatabaseRecord
->PackageList
,
2555 if (EFI_ERROR (Status
)) {
2558 Status
= InvokeRegisteredFunction (
2561 (VOID
*) ImagePackage
,
2562 (UINT8
) (PackageHeader
.Type
),
2563 DatabaseRecord
->Handle
2566 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2567 Status
= InsertSimpleFontPackage (
2570 DatabaseRecord
->PackageList
,
2573 if (EFI_ERROR (Status
)) {
2576 Status
= InvokeRegisteredFunction (
2579 (VOID
*) SimpleFontPackage
,
2580 (UINT8
) (PackageHeader
.Type
),
2581 DatabaseRecord
->Handle
2584 case EFI_HII_PACKAGE_DEVICE_PATH
:
2585 Status
= AddDevicePathPackage (
2588 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2596 if (EFI_ERROR (Status
)) {
2600 // goto header of next package
2602 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2603 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2607 // Adjust String Package to make sure all string packages have the same max string ID.
2609 if (!EFI_ERROR (Status
) && StringPkgIsAdd
) {
2610 Status
= AdjustStringPackage (DatabaseRecord
->PackageList
);
2618 This function exports a package list to a buffer. It is the worker function
2619 of HiiExportPackageList.
2621 This is a internal function.
2623 @param Private Hii database private structure.
2624 @param Handle Identification of a package list.
2625 @param PackageList Pointer to a package list which will be exported.
2626 @param UsedSize The length of buffer has been used by exporting
2627 package lists when Handle is NULL.
2628 @param BufferSize Length of the Buffer.
2629 @param Buffer Allocated space for storing exported data.
2631 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2633 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2638 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2639 IN EFI_HII_HANDLE Handle
,
2640 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2641 IN OUT UINTN
*UsedSize
,
2642 IN UINTN BufferSize
,
2643 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2648 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2650 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
2651 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2652 ASSERT (IsHiiHandleValid (Handle
));
2654 if (BufferSize
> 0 && Buffer
== NULL
) {
2655 return EFI_INVALID_PARAMETER
;
2659 // Copy the package list header
2660 // ResultSize indicates the length of the exported bytes of this package list
2662 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2663 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2664 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2667 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2669 Status
= ExportGuidPackages (
2675 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2678 if (EFI_ERROR (Status
)) {
2681 Status
= ExportFormPackages (
2687 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2690 if (EFI_ERROR (Status
)) {
2693 Status
= ExportKeyboardLayoutPackages (
2699 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2702 if (EFI_ERROR (Status
)) {
2705 Status
= ExportStringPackages (
2711 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2714 if (EFI_ERROR (Status
)) {
2717 Status
= ExportFontPackages (
2723 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2726 if (EFI_ERROR (Status
)) {
2729 Status
= ExportImagePackages (
2735 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2738 if (EFI_ERROR (Status
)) {
2741 Status
= ExportSimpleFontPackages (
2747 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2750 if (EFI_ERROR (Status
)) {
2753 Status
= ExportDevicePathPackage (
2759 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2762 if (EFI_ERROR (Status
)) {
2766 // Append the package list end.
2768 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2769 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2770 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2772 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2773 (VOID
*) &EndofPackageList
,
2774 sizeof (EFI_HII_PACKAGE_HEADER
)
2778 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2784 This is an internal function,mainly use to get and update configuration settings information.
2786 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
2788 @retval EFI_SUCCESS Get the information successfully.
2789 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.
2793 HiiGetConfigurationSetting(
2794 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
2798 HII_DATABASE_PRIVATE_DATA
*Private
;
2799 EFI_STRING ConfigAltResp
;
2802 ConfigAltResp
= NULL
;
2805 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2808 // Get the HiiDatabase info.
2810 HiiGetDatabaseInfo(This
);
2813 // Get ConfigResp string
2815 Status
= HiiConfigRoutingExportConfig(&Private
->ConfigRouting
,&ConfigAltResp
);
2817 if (!EFI_ERROR (Status
)){
2818 ConfigSize
= StrSize(ConfigAltResp
);
2819 if (ConfigSize
> gConfigRespSize
){
2820 gConfigRespSize
= ConfigSize
;
2821 if (gRTConfigRespBuffer
!= NULL
){
2822 FreePool(gRTConfigRespBuffer
);
2824 gRTConfigRespBuffer
= (EFI_STRING
)AllocateRuntimeZeroPool(ConfigSize
);
2825 if (gRTConfigRespBuffer
== NULL
){
2826 FreePool(ConfigAltResp
);
2827 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the ConfigResp string.\n"));
2828 return EFI_OUT_OF_RESOURCES
;
2831 ZeroMem(gRTConfigRespBuffer
,gConfigRespSize
);
2833 CopyMem(gRTConfigRespBuffer
,ConfigAltResp
,ConfigSize
);
2834 gBS
->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid
, gRTConfigRespBuffer
);
2835 FreePool(ConfigAltResp
);
2843 This is an internal function,mainly use to get HiiDatabase information.
2845 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.
2847 @retval EFI_SUCCESS Get the information successfully.
2848 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the Hiidatabase data.
2853 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
2857 EFI_HII_PACKAGE_LIST_HEADER
*DatabaseInfo
;
2858 UINTN DatabaseInfoSize
;
2860 DatabaseInfo
= NULL
;
2861 DatabaseInfoSize
= 0;
2864 // Get HiiDatabase information.
2866 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, DatabaseInfo
);
2868 ASSERT(Status
== EFI_BUFFER_TOO_SMALL
);
2870 if(DatabaseInfoSize
> gDatabaseInfoSize
) {
2871 gDatabaseInfoSize
= DatabaseInfoSize
;
2872 if (gRTDatabaseInfoBuffer
!= NULL
){
2873 FreePool(gRTDatabaseInfoBuffer
);
2875 gRTDatabaseInfoBuffer
= AllocateRuntimeZeroPool(DatabaseInfoSize
);
2876 if (gRTDatabaseInfoBuffer
== NULL
){
2877 DEBUG ((DEBUG_ERROR
, "Not enough memory resource to get the HiiDatabase info.\n"));
2878 return EFI_OUT_OF_RESOURCES
;
2881 ZeroMem(gRTDatabaseInfoBuffer
,gDatabaseInfoSize
);
2883 Status
= HiiExportPackageLists(This
, NULL
, &DatabaseInfoSize
, gRTDatabaseInfoBuffer
);
2884 ASSERT_EFI_ERROR (Status
);
2885 gBS
->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid
, gRTDatabaseInfoBuffer
);
2892 This function adds the packages in the package list to the database and returns a handle. If there is a
2893 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2894 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2896 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2898 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2900 @param DriverHandle Associate the package list with this EFI handle.
2901 If a NULL is specified, this data will not be associate
2902 with any drivers and cannot have a callback induced.
2903 @param Handle A pointer to the EFI_HII_HANDLE instance.
2905 @retval EFI_SUCCESS The package list associated with the Handle was
2906 added to the HII database.
2907 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2909 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2910 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2916 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2917 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2918 IN CONST EFI_HANDLE DriverHandle
, OPTIONAL
2919 OUT EFI_HII_HANDLE
*Handle
2923 HII_DATABASE_PRIVATE_DATA
*Private
;
2924 HII_DATABASE_RECORD
*DatabaseRecord
;
2925 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2927 EFI_GUID PackageListGuid
;
2929 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2930 return EFI_INVALID_PARAMETER
;
2933 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2934 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2937 // Check the Package list GUID to guarantee this GUID is unique in database.
2939 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2940 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2942 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2943 &PackageListGuid
) &&
2944 DatabaseRecord
->DriverHandle
== DriverHandle
) {
2945 return EFI_INVALID_PARAMETER
;
2950 // Build a PackageList node
2952 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2953 if (EFI_ERROR (Status
)) {
2958 // Fill in information of the created Package List node
2959 // according to incoming package list.
2961 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2962 if (EFI_ERROR (Status
)) {
2966 DatabaseRecord
->DriverHandle
= DriverHandle
;
2969 // Create a Device path package and add into the package list if exists.
2971 Status
= gBS
->HandleProtocol (
2973 &gEfiDevicePathProtocolGuid
,
2974 (VOID
**) &DevicePath
2976 if (!EFI_ERROR (Status
)) {
2977 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2978 ASSERT_EFI_ERROR (Status
);
2981 *Handle
= DatabaseRecord
->Handle
;
2984 // Check whether need to get the Database and configuration setting info.
2985 // Only after ReadyToBoot, need to do the export.
2987 if (gExportAfterReadyToBoot
) {
2988 HiiGetConfigurationSetting(This
);
2996 This function removes the package list that is associated with a handle Handle
2997 from the HII database. Before removing the package, any registered functions
2998 with the notification type REMOVE_PACK and the same package type will be called.
3000 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3002 @param Handle The handle that was registered to the data that is
3003 requested for removal.
3005 @retval EFI_SUCCESS The data associated with the Handle was removed
3006 from the HII database.
3007 @retval EFI_NOT_FOUND The specified andle is not in database.
3008 @retval EFI_INVALID_PARAMETER The Handle was not valid.
3013 HiiRemovePackageList (
3014 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3015 IN EFI_HII_HANDLE Handle
3019 HII_DATABASE_PRIVATE_DATA
*Private
;
3021 HII_DATABASE_RECORD
*Node
;
3022 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3023 HII_HANDLE
*HiiHandle
;
3026 return EFI_INVALID_PARAMETER
;
3029 if (!IsHiiHandleValid (Handle
)) {
3030 return EFI_NOT_FOUND
;
3033 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3036 // Get the packagelist to be removed.
3038 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3039 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3040 if (Node
->Handle
== Handle
) {
3041 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3042 ASSERT (PackageList
!= NULL
);
3045 // Call registered functions with REMOVE_PACK before removing packages
3046 // then remove them.
3048 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
3049 if (EFI_ERROR (Status
)) {
3052 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
3053 if (EFI_ERROR (Status
)) {
3056 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
3057 if (EFI_ERROR (Status
)) {
3060 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
3061 if (EFI_ERROR (Status
)) {
3064 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
3065 if (EFI_ERROR (Status
)) {
3068 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
3069 if (EFI_ERROR (Status
)) {
3072 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
3073 if (EFI_ERROR (Status
)) {
3076 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
3077 if (EFI_ERROR (Status
)) {
3082 // Free resources of the package list
3084 RemoveEntryList (&Node
->DatabaseEntry
);
3086 HiiHandle
= (HII_HANDLE
*) Handle
;
3087 RemoveEntryList (&HiiHandle
->Handle
);
3088 Private
->HiiHandleCount
--;
3089 ASSERT (Private
->HiiHandleCount
>= 0);
3091 HiiHandle
->Signature
= 0;
3092 FreePool (HiiHandle
);
3093 FreePool (Node
->PackageList
);
3097 // Check whether need to get the Database and configuration setting info.
3098 // Only after ReadyToBoot, need to do the export.
3100 if (gExportAfterReadyToBoot
) {
3101 HiiGetConfigurationSetting(This
);
3107 return EFI_NOT_FOUND
;
3112 This function updates the existing package list (which has the specified Handle)
3113 in the HII databases, using the new package list specified by PackageList.
3115 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3117 @param Handle The handle that was registered to the data that is
3118 requested to be updated.
3119 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
3122 @retval EFI_SUCCESS The HII database was successfully updated.
3123 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
3125 @retval EFI_INVALID_PARAMETER PackageList was NULL.
3126 @retval EFI_NOT_FOUND The specified Handle is not in database.
3131 HiiUpdatePackageList (
3132 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3133 IN EFI_HII_HANDLE Handle
,
3134 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
3138 HII_DATABASE_PRIVATE_DATA
*Private
;
3140 HII_DATABASE_RECORD
*Node
;
3141 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
3142 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
3143 EFI_HII_PACKAGE_HEADER PackageHeader
;
3145 if (This
== NULL
|| PackageList
== NULL
) {
3146 return EFI_INVALID_PARAMETER
;
3149 if (!IsHiiHandleValid (Handle
)) {
3150 return EFI_NOT_FOUND
;
3153 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3155 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
3157 Status
= EFI_SUCCESS
;
3160 // Get original packagelist to be updated
3162 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3163 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3164 if (Node
->Handle
== Handle
) {
3165 OldPackageList
= Node
->PackageList
;
3167 // Remove the package if its type matches one of the package types which is
3168 // contained in the new package list.
3170 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3171 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
3172 switch (PackageHeader
.Type
) {
3173 case EFI_HII_PACKAGE_TYPE_GUID
:
3174 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
3176 case EFI_HII_PACKAGE_FORMS
:
3177 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
3179 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3180 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
3182 case EFI_HII_PACKAGE_STRINGS
:
3183 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
3185 case EFI_HII_PACKAGE_FONTS
:
3186 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
3188 case EFI_HII_PACKAGE_IMAGES
:
3189 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
3191 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3192 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
3194 case EFI_HII_PACKAGE_DEVICE_PATH
:
3195 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
3199 if (EFI_ERROR (Status
)) {
3203 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3204 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3208 // Add all of the packages within the new package list
3210 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3213 // Check whether need to get the Database and configuration setting info.
3214 // Only after ReadyToBoot, need to do the export.
3216 if (gExportAfterReadyToBoot
) {
3217 if (Status
== EFI_SUCCESS
){
3218 HiiGetConfigurationSetting(This
);
3226 return EFI_NOT_FOUND
;
3231 This function returns a list of the package handles of the specified type
3232 that are currently active in the database. The pseudo-type
3233 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3235 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3237 @param PackageType Specifies the package type of the packages to list
3238 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3240 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3241 this is the pointer to the GUID which must match
3242 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3243 Otherwise, it must be NULL.
3244 @param HandleBufferLength On input, a pointer to the length of the handle
3245 buffer. On output, the length of the handle
3246 buffer that is required for the handles found.
3247 @param Handle An array of EFI_HII_HANDLE instances returned.
3249 @retval EFI_SUCCESS The matching handles are outputed successfully.
3250 HandleBufferLength is updated with the actual length.
3251 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3252 Handle is too small to support the number of
3253 handles. HandleBufferLength is updated with a
3254 value that will enable the data to fit.
3255 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3256 @retval EFI_INVALID_PARAMETER HandleBufferLength was NULL.
3257 @retval EFI_INVALID_PARAMETER The value referenced by HandleBufferLength was not
3258 zero and Handle was NULL.
3259 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3260 PackageGuid is not NULL, PackageType is a EFI_HII_
3261 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3266 HiiListPackageLists (
3267 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3268 IN UINT8 PackageType
,
3269 IN CONST EFI_GUID
*PackageGuid
,
3270 IN OUT UINTN
*HandleBufferLength
,
3271 OUT EFI_HII_HANDLE
*Handle
3274 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3275 HII_DATABASE_PRIVATE_DATA
*Private
;
3276 HII_DATABASE_RECORD
*Node
;
3279 HII_HANDLE
**Result
;
3281 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3285 // Check input parameters
3287 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3288 return EFI_INVALID_PARAMETER
;
3290 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3291 return EFI_INVALID_PARAMETER
;
3293 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3294 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3295 return EFI_INVALID_PARAMETER
;
3298 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3300 Result
= (HII_HANDLE
**) Handle
;
3303 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3304 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3305 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3306 switch (PackageType
) {
3307 case EFI_HII_PACKAGE_TYPE_GUID
:
3308 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3309 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3311 (EFI_GUID
*) PackageGuid
,
3312 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3319 case EFI_HII_PACKAGE_FORMS
:
3320 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3324 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3325 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3329 case EFI_HII_PACKAGE_STRINGS
:
3330 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3334 case EFI_HII_PACKAGE_FONTS
:
3335 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3339 case EFI_HII_PACKAGE_IMAGES
:
3340 if (PackageList
->ImagePkg
!= NULL
) {
3344 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3345 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3349 case EFI_HII_PACKAGE_DEVICE_PATH
:
3350 if (PackageList
->DevicePathPkg
!= NULL
) {
3355 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3358 case EFI_HII_PACKAGE_TYPE_ALL
:
3366 // This active package list has the specified package type, list it.
3369 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3370 if (ResultSize
<= *HandleBufferLength
) {
3371 *Result
++ = Node
->Handle
;
3377 if (ResultSize
== 0) {
3378 return EFI_NOT_FOUND
;
3381 if (*HandleBufferLength
< ResultSize
) {
3382 *HandleBufferLength
= ResultSize
;
3383 return EFI_BUFFER_TOO_SMALL
;
3386 *HandleBufferLength
= ResultSize
;
3392 This function will export one or all package lists in the database to a buffer.
3393 For each package list exported, this function will call functions registered
3394 with EXPORT_PACK and then copy the package list to the buffer.
3396 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3398 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3399 package list in the HII database to export or NULL
3400 to indicate all package lists should be exported.
3401 @param BufferSize On input, a pointer to the length of the buffer.
3402 On output, the length of the buffer that is
3403 required for the exported data.
3404 @param Buffer A pointer to a buffer that will contain the
3405 results of the export function.
3407 @retval EFI_SUCCESS Package exported.
3408 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3409 Handle is too small to support the number of
3410 handles. HandleBufferLength is updated with a
3411 value that will enable the data to fit.
3412 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3414 @retval EFI_INVALID_PARAMETER BufferSize was NULL.
3415 @retval EFI_INVALID_PARAMETER The value referenced by BufferSize was not zero
3416 and Buffer was NULL.
3421 HiiExportPackageLists (
3422 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3423 IN EFI_HII_HANDLE Handle
,
3424 IN OUT UINTN
*BufferSize
,
3425 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3430 HII_DATABASE_PRIVATE_DATA
*Private
;
3431 HII_DATABASE_RECORD
*Node
;
3434 if (This
== NULL
|| BufferSize
== NULL
) {
3435 return EFI_INVALID_PARAMETER
;
3437 if (*BufferSize
> 0 && Buffer
== NULL
) {
3438 return EFI_INVALID_PARAMETER
;
3440 if ((Handle
!= NULL
) && (!IsHiiHandleValid (Handle
))) {
3441 return EFI_NOT_FOUND
;
3444 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3447 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3448 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3449 if (Handle
== NULL
) {
3451 // Export all package lists in current hii database.
3453 Status
= ExportPackageList (
3456 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3459 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3461 ASSERT_EFI_ERROR (Status
);
3462 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3463 Status
= ExportPackageList (
3466 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3471 ASSERT_EFI_ERROR (Status
);
3472 if (*BufferSize
< UsedSize
) {
3473 *BufferSize
= UsedSize
;
3474 return EFI_BUFFER_TOO_SMALL
;
3480 if (Handle
== NULL
&& UsedSize
!= 0) {
3481 if (*BufferSize
< UsedSize
) {
3482 *BufferSize
= UsedSize
;
3483 return EFI_BUFFER_TOO_SMALL
;
3488 return EFI_NOT_FOUND
;
3493 This function registers a function which will be called when specified actions related to packages of
3494 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3495 notified when specific package types are added, removed or updated in the HII database.
3496 Each driver or application which registers a notification should use
3497 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3499 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3501 @param PackageType Specifies the package type of the packages to list
3502 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3504 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3505 this is the pointer to the GUID which must match
3507 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3509 @param PackageNotifyFn Points to the function to be called when the event
3511 NotificationType occurs.
3512 @param NotifyType Describes the types of notification which this
3513 function will be receiving.
3514 @param NotifyHandle Points to the unique handle assigned to the
3515 registered notification. Can be used in
3516 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3517 to stop notifications.
3519 @retval EFI_SUCCESS Notification registered successfully.
3520 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3521 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3522 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3523 EFI_HII_PACKAGE_TYPE_GUID.
3524 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3525 EFI_HII_PACKAGE_TYPE_GUID.
3530 HiiRegisterPackageNotify (
3531 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3532 IN UINT8 PackageType
,
3533 IN CONST EFI_GUID
*PackageGuid
,
3534 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3535 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3536 OUT EFI_HANDLE
*NotifyHandle
3539 HII_DATABASE_PRIVATE_DATA
*Private
;
3540 HII_DATABASE_NOTIFY
*Notify
;
3543 if (This
== NULL
|| NotifyHandle
== NULL
) {
3544 return EFI_INVALID_PARAMETER
;
3546 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3547 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3548 return EFI_INVALID_PARAMETER
;
3551 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3554 // Allocate a notification node
3556 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3557 if (Notify
== NULL
) {
3558 return EFI_OUT_OF_RESOURCES
;
3562 // Generate a notify handle
3564 Status
= gBS
->InstallMultipleProtocolInterfaces (
3565 &Notify
->NotifyHandle
,
3570 ASSERT_EFI_ERROR (Status
);
3573 // Fill in the information to the notification node
3575 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3576 Notify
->PackageType
= PackageType
;
3577 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3578 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3579 Notify
->NotifyType
= NotifyType
;
3581 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3582 *NotifyHandle
= Notify
->NotifyHandle
;
3589 Removes the specified HII database package-related notification.
3591 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3593 @param NotificationHandle The handle of the notification function being
3596 @retval EFI_SUCCESS Notification is unregistered successfully.
3597 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3598 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3599 in current hii database.
3604 HiiUnregisterPackageNotify (
3605 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3606 IN EFI_HANDLE NotificationHandle
3609 HII_DATABASE_PRIVATE_DATA
*Private
;
3610 HII_DATABASE_NOTIFY
*Notify
;
3615 return EFI_INVALID_PARAMETER
;
3618 if (NotificationHandle
== NULL
) {
3619 return EFI_NOT_FOUND
;
3622 Status
= gBS
->OpenProtocol (
3628 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3630 if (EFI_ERROR (Status
)) {
3631 return EFI_NOT_FOUND
;
3634 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3636 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3637 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3638 if (Notify
->NotifyHandle
== NotificationHandle
) {
3640 // Remove the matching notification node
3642 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3643 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3644 Notify
->NotifyHandle
,
3649 ASSERT_EFI_ERROR (Status
);
3656 return EFI_NOT_FOUND
;
3661 This routine retrieves an array of GUID values for each keyboard layout that
3662 was previously registered in the system.
3664 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3666 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3667 GUID buffer. On output, the length of the handle
3668 buffer that is required for the handles found.
3669 @param KeyGuidBuffer An array of keyboard layout GUID instances
3672 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3673 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3674 that KeyGuidBuffer is too small to support the
3675 number of GUIDs. KeyGuidBufferLength is
3676 updated with a value that will enable the data to
3678 @retval EFI_INVALID_PARAMETER The KeyGuidBufferLength is NULL.
3679 @retval EFI_INVALID_PARAMETER The value referenced by KeyGuidBufferLength is not
3680 zero and KeyGuidBuffer is NULL.
3681 @retval EFI_NOT_FOUND There was no keyboard layout.
3686 HiiFindKeyboardLayouts (
3687 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3688 IN OUT UINT16
*KeyGuidBufferLength
,
3689 OUT EFI_GUID
*KeyGuidBuffer
3692 HII_DATABASE_PRIVATE_DATA
*Private
;
3693 HII_DATABASE_RECORD
*Node
;
3694 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3700 UINT16 LayoutLength
;
3702 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3704 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3705 return EFI_INVALID_PARAMETER
;
3708 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3709 return EFI_INVALID_PARAMETER
;
3712 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3716 // Search all package lists in whole database to retrieve keyboard layout.
3718 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3719 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3720 PackageList
= Node
->PackageList
;
3721 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3722 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3723 Link1
= Link1
->ForwardLink
3726 // Find out all Keyboard Layout packages in this package list.
3730 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3732 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3734 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3737 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3740 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3741 ResultSize
+= sizeof (EFI_GUID
);
3742 if (ResultSize
<= *KeyGuidBufferLength
) {
3743 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3744 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3745 Layout
= Layout
+ LayoutLength
;
3751 if (ResultSize
== 0) {
3752 return EFI_NOT_FOUND
;
3755 if (*KeyGuidBufferLength
< ResultSize
) {
3756 *KeyGuidBufferLength
= ResultSize
;
3757 return EFI_BUFFER_TOO_SMALL
;
3760 *KeyGuidBufferLength
= ResultSize
;
3766 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3767 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3769 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3771 @param KeyGuid A pointer to the unique ID associated with a given
3772 keyboard layout. If KeyGuid is NULL then the
3773 current layout will be retrieved.
3774 @param KeyboardLayoutLength On input, a pointer to the length of the
3775 KeyboardLayout buffer. On output, the length of
3776 the data placed into KeyboardLayout.
3777 @param KeyboardLayout A pointer to a buffer containing the retrieved
3780 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3781 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3782 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3784 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3785 that KeyboardLayout is too small to support the
3786 requested keyboard layout. KeyboardLayoutLength is
3787 updated with a value that will enable the
3793 HiiGetKeyboardLayout (
3794 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3795 IN CONST EFI_GUID
*KeyGuid
,
3796 IN OUT UINT16
*KeyboardLayoutLength
,
3797 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3800 HII_DATABASE_PRIVATE_DATA
*Private
;
3801 HII_DATABASE_RECORD
*Node
;
3802 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3808 UINT16 LayoutLength
;
3809 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3811 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3812 return EFI_INVALID_PARAMETER
;
3814 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3815 return EFI_INVALID_PARAMETER
;
3818 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3820 // Retrieve the current keyboard layout.
3822 if (KeyGuid
== NULL
) {
3823 if (Private
->CurrentLayout
== NULL
) {
3824 return EFI_NOT_FOUND
;
3826 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3827 if (*KeyboardLayoutLength
< LayoutLength
) {
3828 *KeyboardLayoutLength
= LayoutLength
;
3829 return EFI_BUFFER_TOO_SMALL
;
3831 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3835 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3836 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3837 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3838 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3839 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3840 Link1
= Link1
->ForwardLink
3844 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3846 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3849 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3850 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3851 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3852 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3853 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3854 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3855 if (LayoutLength
<= *KeyboardLayoutLength
) {
3856 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3859 *KeyboardLayoutLength
= LayoutLength
;
3860 return EFI_BUFFER_TOO_SMALL
;
3863 Layout
= Layout
+ LayoutLength
;
3868 return EFI_NOT_FOUND
;
3873 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3874 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3875 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3876 can be notified of this change.
3878 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3880 @param KeyGuid A pointer to the unique ID associated with a given
3883 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3884 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3886 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3891 HiiSetKeyboardLayout (
3892 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3893 IN CONST EFI_GUID
*KeyGuid
3896 HII_DATABASE_PRIVATE_DATA
*Private
;
3897 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3898 UINT16 KeyboardLayoutLength
;
3901 if (This
== NULL
|| KeyGuid
== NULL
) {
3902 return EFI_INVALID_PARAMETER
;
3905 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3908 // The specified GUID equals the current keyboard layout GUID,
3911 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3916 // Try to find the incoming keyboard layout data in current database.
3918 KeyboardLayoutLength
= 0;
3919 KeyboardLayout
= NULL
;
3920 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3921 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3925 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3926 ASSERT (KeyboardLayout
!= NULL
);
3927 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3928 ASSERT_EFI_ERROR (Status
);
3931 // Backup current keyboard layout.
3933 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3934 if (Private
->CurrentLayout
!= NULL
) {
3935 FreePool(Private
->CurrentLayout
);
3937 Private
->CurrentLayout
= KeyboardLayout
;
3940 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3941 // current keyboard layout is changed.
3943 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3944 ASSERT_EFI_ERROR (Status
);
3951 Return the EFI handle associated with a package list.
3953 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3955 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3956 package list in the HIIdatabase.
3957 @param DriverHandle On return, contains the EFI_HANDLE which was
3958 registered with the package list in
3961 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3962 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3963 DriverHandle was NULL.
3964 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3970 HiiGetPackageListHandle (
3971 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3972 IN EFI_HII_HANDLE PackageListHandle
,
3973 OUT EFI_HANDLE
*DriverHandle
3976 HII_DATABASE_PRIVATE_DATA
*Private
;
3977 HII_DATABASE_RECORD
*Node
;
3980 if (This
== NULL
|| DriverHandle
== NULL
) {
3981 return EFI_INVALID_PARAMETER
;
3984 if (!IsHiiHandleValid (PackageListHandle
)) {
3985 return EFI_INVALID_PARAMETER
;
3988 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3990 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3991 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3992 if (Node
->Handle
== PackageListHandle
) {
3993 *DriverHandle
= Node
->DriverHandle
;
3998 return EFI_NOT_FOUND
;