2 Implementation for EFI_HII_DATABASE_PROTOCOL.
4 Copyright (c) 2007 - 2015, 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"
19 This function generates a HII_DATABASE_RECORD node and adds into hii database.
20 This is a internal function.
22 @param Private hii database private structure
23 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
26 @retval EFI_SUCCESS A database record is generated successfully.
27 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
29 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
33 GenerateHiiDatabaseRecord (
34 IN HII_DATABASE_PRIVATE_DATA
*Private
,
35 OUT HII_DATABASE_RECORD
**DatabaseNode
38 HII_DATABASE_RECORD
*DatabaseRecord
;
39 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
40 HII_HANDLE
*HiiHandle
;
42 if (Private
== NULL
|| DatabaseNode
== NULL
) {
43 return EFI_INVALID_PARAMETER
;
46 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
47 if (DatabaseRecord
== NULL
) {
48 return EFI_OUT_OF_RESOURCES
;
50 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
52 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
53 if (DatabaseRecord
->PackageList
== NULL
) {
54 FreePool (DatabaseRecord
);
55 return EFI_OUT_OF_RESOURCES
;
58 PackageList
= DatabaseRecord
->PackageList
;
60 InitializeListHead (&PackageList
->GuidPkgHdr
);
61 InitializeListHead (&PackageList
->FormPkgHdr
);
62 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
63 InitializeListHead (&PackageList
->StringPkgHdr
);
64 InitializeListHead (&PackageList
->FontPkgHdr
);
65 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
66 PackageList
->ImagePkg
= NULL
;
67 PackageList
->DevicePathPkg
= NULL
;
70 // Create a new hii handle
72 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
73 if (HiiHandle
== NULL
) {
74 FreePool (DatabaseRecord
->PackageList
);
75 FreePool (DatabaseRecord
);
76 return EFI_OUT_OF_RESOURCES
;
78 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
80 // Backup the number of Hii handles
82 Private
->HiiHandleCount
++;
83 HiiHandle
->Key
= (UINTN
) Private
->HiiHandleCount
;
85 // Insert the handle to hii handle list of the whole database.
87 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
89 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
92 // Insert the Package List node to Package List link of the whole database.
94 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
96 *DatabaseNode
= DatabaseRecord
;
104 This function checks whether a handle is a valid EFI_HII_HANDLE
105 This is a internal function.
107 @param Handle Pointer to a EFI_HII_HANDLE
110 @retval FALSE Invalid
115 EFI_HII_HANDLE Handle
118 HII_HANDLE
*HiiHandle
;
120 HiiHandle
= (HII_HANDLE
*) Handle
;
122 if (HiiHandle
== NULL
) {
126 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
135 This function invokes the matching registered function.
136 This is a internal function.
138 @param Private HII Database driver private structure.
139 @param NotifyType The type of change concerning the database.
140 @param PackageInstance Points to the package referred to by the
142 @param PackageType Package type
143 @param Handle The handle of the package list which contains the
146 @retval EFI_SUCCESS Already checked all registered function and
148 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
152 InvokeRegisteredFunction (
153 IN HII_DATABASE_PRIVATE_DATA
*Private
,
154 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
155 IN VOID
*PackageInstance
,
156 IN UINT8 PackageType
,
157 IN EFI_HII_HANDLE Handle
160 HII_DATABASE_NOTIFY
*Notify
;
162 EFI_HII_PACKAGE_HEADER
*Package
;
166 UINT32 ImageBlockSize
;
167 UINT32 PaletteInfoSize
;
169 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
170 return EFI_INVALID_PARAMETER
;
172 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
173 return EFI_INVALID_PARAMETER
;
175 if (!IsHiiHandleValid (Handle
)) {
176 return EFI_INVALID_PARAMETER
;
183 // Convert the incoming package from hii database storage format to UEFI
184 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
186 switch (PackageType
) {
187 case EFI_HII_PACKAGE_TYPE_GUID
:
188 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
191 case EFI_HII_PACKAGE_FORMS
:
192 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
193 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
194 ASSERT (Buffer
!= NULL
);
197 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
198 sizeof (EFI_HII_PACKAGE_HEADER
)
201 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
202 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
203 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
205 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
208 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
209 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
212 case EFI_HII_PACKAGE_STRINGS
:
213 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
214 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
215 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
216 ASSERT (Buffer
!= NULL
);
219 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
224 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
225 BufferSize
- HeaderSize
227 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
230 case EFI_HII_PACKAGE_FONTS
:
231 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
232 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
233 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
234 ASSERT (Buffer
!= NULL
);
237 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
242 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
243 BufferSize
- HeaderSize
245 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
248 case EFI_HII_PACKAGE_IMAGES
:
249 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
250 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
251 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
252 ASSERT (Buffer
!= NULL
);
256 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
260 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
265 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
266 if (ImageBlockSize
!= 0) {
269 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
274 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
275 if (PaletteInfoSize
!= 0) {
277 Buffer
+ HeaderSize
+ ImageBlockSize
,
278 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
281 HeaderSize
+= ImageBlockSize
;
283 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
288 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
291 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
292 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
293 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
294 ASSERT (Buffer
!= NULL
);
297 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
300 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
303 case EFI_HII_PACKAGE_DEVICE_PATH
:
304 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
308 return EFI_INVALID_PARAMETER
;
311 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
312 Link
!= &Private
->DatabaseNotifyList
;
313 Link
= Link
->ForwardLink
315 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
316 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
318 // Check in case PackageGuid is not NULL when Package is GUID package
320 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
321 Notify
->PackageGuid
= NULL
;
324 // Status of Registered Function is unknown so did not check it
326 Notify
->PackageNotifyFn (
336 if (Buffer
!= NULL
) {
345 This function insert a GUID package to a package list node.
346 This is a internal function.
348 @param PackageHdr Pointer to a buffer stored with GUID package
350 @param NotifyType The type of change concerning the database.
351 @param PackageList Pointer to a package list which will be inserted
353 @param Package Created GUID pacakge
355 @retval EFI_SUCCESS Guid Package is inserted successfully.
356 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
358 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
364 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
365 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
366 OUT HII_GUID_PACKAGE_INSTANCE
**Package
369 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
370 EFI_HII_PACKAGE_HEADER PackageHeader
;
372 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
373 return EFI_INVALID_PARAMETER
;
376 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
379 // Create a GUID package node
381 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
382 if (GuidPackage
== NULL
) {
383 return EFI_OUT_OF_RESOURCES
;
385 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
386 if (GuidPackage
->GuidPkg
== NULL
) {
387 FreePool (GuidPackage
);
388 return EFI_OUT_OF_RESOURCES
;
391 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
392 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
393 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
394 *Package
= GuidPackage
;
396 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
397 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
405 This function exports GUID packages to a buffer.
406 This is a internal function.
408 @param Private Hii database private structure.
409 @param Handle Identification of a package list.
410 @param PackageList Pointer to a package list which will be exported.
411 @param UsedSize The length of buffer be used.
412 @param BufferSize Length of the Buffer.
413 @param Buffer Allocated space for storing exported data.
414 @param ResultSize The size of the already exported content of this
417 @retval EFI_SUCCESS Guid Packages are exported successfully.
418 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
423 IN HII_DATABASE_PRIVATE_DATA
*Private
,
424 IN EFI_HII_HANDLE Handle
,
425 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
429 IN OUT UINTN
*ResultSize
432 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
435 EFI_HII_PACKAGE_HEADER PackageHeader
;
438 if (PackageList
== NULL
|| ResultSize
== NULL
) {
439 return EFI_INVALID_PARAMETER
;
442 if (BufferSize
> 0 && Buffer
== NULL
) {
443 return EFI_INVALID_PARAMETER
;
447 Status
= EFI_SUCCESS
;
449 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
450 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
451 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
452 PackageLength
+= PackageHeader
.Length
;
453 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
454 Status
= InvokeRegisteredFunction (
456 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
457 (VOID
*) GuidPackage
,
458 EFI_HII_PACKAGE_TYPE_GUID
,
461 ASSERT_EFI_ERROR (Status
);
462 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
463 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
467 *ResultSize
+= PackageLength
;
473 This function deletes all GUID packages from a package list node.
474 This is a internal function.
476 @param Private Hii database private data.
477 @param Handle Handle of the package list which contains the to
478 be removed GUID packages.
479 @param PackageList Pointer to a package list that contains removing
482 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
483 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
488 IN HII_DATABASE_PRIVATE_DATA
*Private
,
489 IN EFI_HII_HANDLE Handle
,
490 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
493 LIST_ENTRY
*ListHead
;
494 HII_GUID_PACKAGE_INSTANCE
*Package
;
496 EFI_HII_PACKAGE_HEADER PackageHeader
;
498 ListHead
= &PackageList
->GuidPkgHdr
;
500 while (!IsListEmpty (ListHead
)) {
502 ListHead
->ForwardLink
,
503 HII_GUID_PACKAGE_INSTANCE
,
505 HII_GUID_PACKAGE_SIGNATURE
507 Status
= InvokeRegisteredFunction (
509 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
511 EFI_HII_PACKAGE_TYPE_GUID
,
514 if (EFI_ERROR (Status
)) {
518 RemoveEntryList (&Package
->GuidEntry
);
519 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
520 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
521 FreePool (Package
->GuidPkg
);
530 This function insert a Form package to a package list node.
531 This is a internal function.
533 @param PackageHdr Pointer to a buffer stored with Form package
535 @param NotifyType The type of change concerning the database.
536 @param PackageList Pointer to a package list which will be inserted
538 @param Package Created Form package
540 @retval EFI_SUCCESS Form Package is inserted successfully.
541 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
543 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
549 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
550 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
551 OUT HII_IFR_PACKAGE_INSTANCE
**Package
554 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
555 EFI_HII_PACKAGE_HEADER PackageHeader
;
557 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
558 return EFI_INVALID_PARAMETER
;
562 // Get the length of the package, including package header itself
564 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
567 // Create a Form package node
569 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
570 if (FormPackage
== NULL
) {
571 return EFI_OUT_OF_RESOURCES
;
574 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
575 if (FormPackage
->IfrData
== NULL
) {
576 FreePool (FormPackage
);
577 return EFI_OUT_OF_RESOURCES
;
580 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
582 // Copy Package Header
584 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
590 FormPackage
->IfrData
,
591 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
592 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
595 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
596 *Package
= FormPackage
;
598 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
599 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
606 This function exports Form packages to a buffer.
607 This is a internal function.
609 @param Private Hii database private structure.
610 @param Handle Identification of a package list.
611 @param PackageList Pointer to a package list which will be exported.
612 @param UsedSize The length of buffer be used.
613 @param BufferSize Length of the Buffer.
614 @param Buffer Allocated space for storing exported data.
615 @param ResultSize The size of the already exported content of this
618 @retval EFI_SUCCESS Form Packages are exported successfully.
619 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
624 IN HII_DATABASE_PRIVATE_DATA
*Private
,
625 IN EFI_HII_HANDLE Handle
,
626 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
630 IN OUT UINTN
*ResultSize
633 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
638 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
639 return EFI_INVALID_PARAMETER
;
642 if (BufferSize
> 0 && Buffer
== NULL
) {
643 return EFI_INVALID_PARAMETER
;
647 Status
= EFI_SUCCESS
;
650 // Export Form packages.
652 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
653 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
654 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
655 if ((Buffer
!= NULL
) && (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
)) {
657 // Invoke registered notification if exists
659 Status
= InvokeRegisteredFunction (
661 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
662 (VOID
*) FormPackage
,
663 EFI_HII_PACKAGE_FORMS
,
666 ASSERT_EFI_ERROR (Status
);
668 // Copy the Form package content.
670 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
671 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
674 (VOID
*) FormPackage
->IfrData
,
675 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
677 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
681 *ResultSize
+= PackageLength
;
689 This function deletes all Form packages from a package list node.
690 This is a internal function.
692 @param Private Hii database private data.
693 @param Handle Handle of the package list which contains the to
694 be removed Form packages.
695 @param PackageList Pointer to a package list that contains removing
698 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
699 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
704 IN HII_DATABASE_PRIVATE_DATA
*Private
,
705 IN EFI_HII_HANDLE Handle
,
706 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
709 LIST_ENTRY
*ListHead
;
710 HII_IFR_PACKAGE_INSTANCE
*Package
;
713 ListHead
= &PackageList
->FormPkgHdr
;
715 while (!IsListEmpty (ListHead
)) {
717 ListHead
->ForwardLink
,
718 HII_IFR_PACKAGE_INSTANCE
,
720 HII_IFR_PACKAGE_SIGNATURE
722 Status
= InvokeRegisteredFunction (
724 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
726 EFI_HII_PACKAGE_FORMS
,
729 if (EFI_ERROR (Status
)) {
733 RemoveEntryList (&Package
->IfrEntry
);
734 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
735 FreePool (Package
->IfrData
);
746 This function insert a String package to a package list node.
747 This is a internal function.
749 @param Private Hii database private structure.
750 @param PackageHdr Pointer to a buffer stored with String package
752 @param NotifyType The type of change concerning the database.
753 @param PackageList Pointer to a package list which will be inserted
755 @param Package Created String package
757 @retval EFI_SUCCESS String Package is inserted successfully.
758 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
760 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
761 @retval EFI_UNSUPPORTED A string package with the same language already
762 exists in current package list.
766 InsertStringPackage (
767 IN HII_DATABASE_PRIVATE_DATA
*Private
,
769 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
770 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
771 OUT HII_STRING_PACKAGE_INSTANCE
**Package
774 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
777 EFI_HII_PACKAGE_HEADER PackageHeader
;
782 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
783 return EFI_INVALID_PARAMETER
;
785 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
786 return EFI_INVALID_PARAMETER
;
789 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
790 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
793 // It is illegal to have two string packages with same language within one packagelist
794 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
796 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
797 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
798 if (Language
== NULL
) {
799 return EFI_OUT_OF_RESOURCES
;
801 AsciiStrCpyS (Language
, LanguageSize
/ sizeof (CHAR8
), (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
802 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
803 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
804 if (HiiCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
806 return EFI_UNSUPPORTED
;
812 // Create a String package node
814 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
815 if (StringPackage
== NULL
) {
816 Status
= EFI_OUT_OF_RESOURCES
;
820 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
821 if (StringPackage
->StringPkgHdr
== NULL
) {
822 Status
= EFI_OUT_OF_RESOURCES
;
826 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
827 if (StringPackage
->StringBlock
== NULL
) {
828 Status
= EFI_OUT_OF_RESOURCES
;
832 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
833 StringPackage
->FontId
= 0;
834 InitializeListHead (&StringPackage
->FontInfoList
);
837 // Copy the String package header.
839 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
842 // Copy the String blocks
845 StringPackage
->StringBlock
,
846 (UINT8
*) PackageHdr
+ HeaderSize
,
847 PackageHeader
.Length
- HeaderSize
851 // Collect all font block info
853 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, &StringPackage
->MaxStringId
, NULL
);
854 if (EFI_ERROR (Status
)) {
859 // Insert to String package array
861 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
862 *Package
= StringPackage
;
864 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
865 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
872 if (StringPackage
!= NULL
) {
873 if (StringPackage
->StringBlock
!= NULL
) {
874 FreePool (StringPackage
->StringBlock
);
876 if (StringPackage
->StringPkgHdr
!= NULL
) {
877 FreePool (StringPackage
->StringPkgHdr
);
879 FreePool (StringPackage
);
886 Adjust all string packages in a single package list to have the same max string ID.
888 @param PackageList Pointer to a package list which will be adjusted.
890 @retval EFI_SUCCESS Adjust all string packages successfully.
891 @retval others Can't adjust string packges.
895 AdjustStringPackage (
896 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
900 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
901 UINT32 Skip2BlockSize
;
905 EFI_STRING_ID MaxStringId
;
909 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
910 Link
!= &PackageList
->StringPkgHdr
;
911 Link
= Link
->ForwardLink
913 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
914 if (MaxStringId
< StringPackage
->MaxStringId
) {
915 MaxStringId
= StringPackage
->MaxStringId
;
919 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
920 Link
!= &PackageList
->StringPkgHdr
;
921 Link
= Link
->ForwardLink
923 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
924 if (StringPackage
->MaxStringId
< MaxStringId
) {
925 OldBlockSize
= StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
927 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.
929 SkipCount
= (UINT16
) (MaxStringId
- StringPackage
->MaxStringId
);
930 Skip2BlockSize
= (UINT32
) sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
932 StringBlock
= (UINT8
*) AllocateZeroPool (OldBlockSize
+ Skip2BlockSize
);
933 if (StringBlock
== NULL
) {
934 return EFI_OUT_OF_RESOURCES
;
937 // Copy original string blocks, except the EFI_HII_SIBT_END.
939 CopyMem (StringBlock
, StringPackage
->StringBlock
, OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
));
941 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks
943 BlockPtr
= StringBlock
+ OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
);
944 *BlockPtr
= EFI_HII_SIBT_SKIP2
;
945 CopyMem (BlockPtr
+ 1, &SkipCount
, sizeof (UINT16
));
946 BlockPtr
+= sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
949 // Append a EFI_HII_SIBT_END block to the end.
951 *BlockPtr
= EFI_HII_SIBT_END
;
952 FreePool (StringPackage
->StringBlock
);
953 StringPackage
->StringBlock
= StringBlock
;
954 StringPackage
->StringPkgHdr
->Header
.Length
+= Skip2BlockSize
;
955 PackageList
->PackageListHdr
.PackageLength
+= Skip2BlockSize
;
956 StringPackage
->MaxStringId
= MaxStringId
;
964 This function exports String packages to a buffer.
965 This is a internal function.
967 @param Private Hii database private structure.
968 @param Handle Identification of a package list.
969 @param PackageList Pointer to a package list which will be exported.
970 @param UsedSize The length of buffer be used.
971 @param BufferSize Length of the Buffer.
972 @param Buffer Allocated space for storing exported data.
973 @param ResultSize The size of the already exported content of this
976 @retval EFI_SUCCESS String Packages are exported successfully.
977 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
981 ExportStringPackages (
982 IN HII_DATABASE_PRIVATE_DATA
*Private
,
983 IN EFI_HII_HANDLE Handle
,
984 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
988 IN OUT UINTN
*ResultSize
994 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
996 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
997 return EFI_INVALID_PARAMETER
;
1000 if (BufferSize
> 0 && Buffer
== NULL
) {
1001 return EFI_INVALID_PARAMETER
;
1005 Status
= EFI_SUCCESS
;
1007 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1008 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1009 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1010 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1012 // Invoke registered notification function with EXPORT_PACK notify type
1014 Status
= InvokeRegisteredFunction (
1016 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1017 (VOID
*) StringPackage
,
1018 EFI_HII_PACKAGE_STRINGS
,
1021 ASSERT_EFI_ERROR (Status
);
1023 // Copy String package header
1025 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
1026 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
1029 // Copy String blocks information
1033 StringPackage
->StringBlock
,
1034 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
1036 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1040 *ResultSize
+= PackageLength
;
1046 This function deletes all String packages from a package list node.
1047 This is a internal function.
1049 @param Private Hii database private data.
1050 @param Handle Handle of the package list which contains the to
1051 be removed String packages.
1052 @param PackageList Pointer to a package list that contains removing
1055 @retval EFI_SUCCESS String Package(s) is deleted successfully.
1056 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1060 RemoveStringPackages (
1061 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1062 IN EFI_HII_HANDLE Handle
,
1063 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1066 LIST_ENTRY
*ListHead
;
1067 HII_STRING_PACKAGE_INSTANCE
*Package
;
1068 HII_FONT_INFO
*FontInfo
;
1071 ListHead
= &PackageList
->StringPkgHdr
;
1073 while (!IsListEmpty (ListHead
)) {
1075 ListHead
->ForwardLink
,
1076 HII_STRING_PACKAGE_INSTANCE
,
1078 HII_STRING_PACKAGE_SIGNATURE
1080 Status
= InvokeRegisteredFunction (
1082 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1084 EFI_HII_PACKAGE_STRINGS
,
1087 if (EFI_ERROR (Status
)) {
1091 RemoveEntryList (&Package
->StringEntry
);
1092 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1093 FreePool (Package
->StringBlock
);
1094 FreePool (Package
->StringPkgHdr
);
1096 // Delete font information
1098 while (!IsListEmpty (&Package
->FontInfoList
)) {
1100 Package
->FontInfoList
.ForwardLink
,
1103 HII_FONT_INFO_SIGNATURE
1105 RemoveEntryList (&FontInfo
->Entry
);
1106 FreePool (FontInfo
);
1117 This function insert a Font package to a package list node.
1118 This is a internal function.
1120 @param Private Hii database private structure.
1121 @param PackageHdr Pointer to a buffer stored with Font package
1123 @param NotifyType The type of change concerning the database.
1124 @param PackageList Pointer to a package list which will be inserted
1126 @param Package Created Font package
1128 @retval EFI_SUCCESS Font Package is inserted successfully.
1129 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1131 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1132 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1133 exists in current hii database.
1138 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1139 IN VOID
*PackageHdr
,
1140 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1141 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1142 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1145 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1146 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1149 EFI_HII_PACKAGE_HEADER PackageHeader
;
1150 EFI_FONT_INFO
*FontInfo
;
1151 UINT32 FontInfoSize
;
1152 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1154 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1155 return EFI_INVALID_PARAMETER
;
1158 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1159 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1166 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1167 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1168 // attributes and identify a font uniquely.
1170 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1171 if (FontPkgHdr
== NULL
) {
1172 Status
= EFI_OUT_OF_RESOURCES
;
1175 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1177 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1178 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1179 if (FontInfo
== NULL
) {
1180 Status
= EFI_OUT_OF_RESOURCES
;
1183 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1184 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1185 StrCpyS (FontInfo
->FontName
, (FontInfoSize
- OFFSET_OF(EFI_FONT_INFO
,FontName
)) / sizeof (CHAR16
), FontPkgHdr
->FontFamily
);
1187 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1188 Status
= EFI_UNSUPPORTED
;
1193 // Create a Font package node
1195 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1196 if (FontPackage
== NULL
) {
1197 Status
= EFI_OUT_OF_RESOURCES
;
1200 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1201 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1202 InitializeListHead (&FontPackage
->GlyphInfoList
);
1204 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1205 if (FontPackage
->GlyphBlock
== NULL
) {
1206 Status
= EFI_OUT_OF_RESOURCES
;
1209 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1212 // Collect all default character cell information and backup in GlyphInfoList.
1214 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1215 if (EFI_ERROR (Status
)) {
1220 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1223 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1224 if (GlobalFont
== NULL
) {
1225 Status
= EFI_OUT_OF_RESOURCES
;
1228 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1229 GlobalFont
->FontPackage
= FontPackage
;
1230 GlobalFont
->FontInfoSize
= FontInfoSize
;
1231 GlobalFont
->FontInfo
= FontInfo
;
1232 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1235 // Insert this font package to Font package array
1237 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1238 *Package
= FontPackage
;
1240 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1241 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1248 if (FontPkgHdr
!= NULL
) {
1249 FreePool (FontPkgHdr
);
1251 if (FontInfo
!= NULL
) {
1252 FreePool (FontInfo
);
1254 if (FontPackage
!= NULL
) {
1255 if (FontPackage
->GlyphBlock
!= NULL
) {
1256 FreePool (FontPackage
->GlyphBlock
);
1258 FreePool (FontPackage
);
1260 if (GlobalFont
!= NULL
) {
1261 FreePool (GlobalFont
);
1270 This function exports Font packages to a buffer.
1271 This is a internal function.
1273 @param Private Hii database private structure.
1274 @param Handle Identification of a package list.
1275 @param PackageList Pointer to a package list which will be exported.
1276 @param UsedSize The length of buffer be used.
1277 @param BufferSize Length of the Buffer.
1278 @param Buffer Allocated space for storing exported data.
1279 @param ResultSize The size of the already exported content of this
1282 @retval EFI_SUCCESS Font Packages are exported successfully.
1283 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1287 ExportFontPackages (
1288 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1289 IN EFI_HII_HANDLE Handle
,
1290 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1292 IN UINTN BufferSize
,
1293 IN OUT VOID
*Buffer
,
1294 IN OUT UINTN
*ResultSize
1298 UINTN PackageLength
;
1300 HII_FONT_PACKAGE_INSTANCE
*Package
;
1303 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1304 return EFI_INVALID_PARAMETER
;
1307 if (BufferSize
> 0 && Buffer
== NULL
) {
1308 return EFI_INVALID_PARAMETER
;
1312 Status
= EFI_SUCCESS
;
1314 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1315 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1316 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1317 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1319 // Invoke registered notification function with EXPORT_PACK notify type
1321 Status
= InvokeRegisteredFunction (
1323 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1325 EFI_HII_PACKAGE_FONTS
,
1328 ASSERT_EFI_ERROR (Status
);
1330 // Copy Font package header
1332 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1333 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1336 // Copy Glyph blocks information
1340 Package
->GlyphBlock
,
1341 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1343 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1347 *ResultSize
+= PackageLength
;
1353 This function deletes all Font packages from a package list node.
1354 This is a internal function.
1356 @param Private Hii database private data.
1357 @param Handle Handle of the package list which contains the to
1358 be removed Font packages.
1359 @param PackageList Pointer to a package list that contains removing
1362 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1363 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1367 RemoveFontPackages (
1368 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1369 IN EFI_HII_HANDLE Handle
,
1370 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1373 LIST_ENTRY
*ListHead
;
1374 HII_FONT_PACKAGE_INSTANCE
*Package
;
1376 HII_GLYPH_INFO
*GlyphInfo
;
1378 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1380 ListHead
= &PackageList
->FontPkgHdr
;
1382 while (!IsListEmpty (ListHead
)) {
1384 ListHead
->ForwardLink
,
1385 HII_FONT_PACKAGE_INSTANCE
,
1387 HII_FONT_PACKAGE_SIGNATURE
1389 Status
= InvokeRegisteredFunction (
1391 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1393 EFI_HII_PACKAGE_FONTS
,
1396 if (EFI_ERROR (Status
)) {
1400 RemoveEntryList (&Package
->FontEntry
);
1401 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1403 if (Package
->GlyphBlock
!= NULL
) {
1404 FreePool (Package
->GlyphBlock
);
1406 FreePool (Package
->FontPkgHdr
);
1408 // Delete default character cell information
1410 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1412 Package
->GlyphInfoList
.ForwardLink
,
1415 HII_GLYPH_INFO_SIGNATURE
1417 RemoveEntryList (&GlyphInfo
->Entry
);
1418 FreePool (GlyphInfo
);
1422 // Remove corresponding global font info
1424 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1425 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1426 if (GlobalFont
->FontPackage
== Package
) {
1427 RemoveEntryList (&GlobalFont
->Entry
);
1428 FreePool (GlobalFont
->FontInfo
);
1429 FreePool (GlobalFont
);
1442 This function insert a Image package to a package list node.
1443 This is a internal function.
1445 @param PackageHdr Pointer to a buffer stored with Image package
1447 @param NotifyType The type of change concerning the database.
1448 @param PackageList Pointer to a package list which will be inserted
1450 @param Package Created Image package
1452 @retval EFI_SUCCESS Image Package is inserted successfully.
1453 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1455 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1459 InsertImagePackage (
1460 IN VOID
*PackageHdr
,
1461 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1462 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1463 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1466 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1470 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1471 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1472 UINT32 PaletteInfoOffset
;
1473 UINT32 ImageInfoOffset
;
1476 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1477 return EFI_INVALID_PARAMETER
;
1481 // Less than one image package is allowed in one package list.
1483 if (PackageList
->ImagePkg
!= NULL
) {
1484 return EFI_INVALID_PARAMETER
;
1488 // Create a Image package node
1490 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1491 if (ImagePackage
== NULL
) {
1492 return EFI_OUT_OF_RESOURCES
;
1496 // Copy the Image package header.
1498 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1500 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1501 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1504 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1507 ImagePackage
->PaletteBlock
= NULL
;
1508 if (PaletteInfoOffset
!= 0) {
1509 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1510 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1511 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1513 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1514 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1515 CurrentSize
+= sizeof (UINT16
);
1516 PaletteSize
+= (UINT32
) CurrentSize
;
1517 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1520 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1521 if (ImagePackage
->PaletteBlock
== NULL
) {
1522 FreePool (ImagePackage
);
1523 return EFI_OUT_OF_RESOURCES
;
1526 ImagePackage
->PaletteBlock
,
1527 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1533 // If ImageInfoOffset is zero, there are no images in this package.
1536 ImagePackage
->ImageBlock
= NULL
;
1537 if (ImageInfoOffset
!= 0) {
1538 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1539 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1540 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1541 if (ImagePackage
->ImageBlock
== NULL
) {
1542 FreePool (ImagePackage
->PaletteBlock
);
1543 FreePool (ImagePackage
);
1544 return EFI_OUT_OF_RESOURCES
;
1547 ImagePackage
->ImageBlock
,
1548 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1553 ImagePackage
->ImageBlockSize
= ImageSize
;
1554 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1555 PackageList
->ImagePkg
= ImagePackage
;
1556 *Package
= ImagePackage
;
1558 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1559 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1567 This function exports Image packages to a buffer.
1568 This is a internal function.
1570 @param Private Hii database private structure.
1571 @param Handle Identification of a package list.
1572 @param PackageList Pointer to a package list which will be exported.
1573 @param UsedSize The length of buffer be used.
1574 @param BufferSize Length of the Buffer.
1575 @param Buffer Allocated space for storing exported data.
1576 @param ResultSize The size of the already exported content of this
1579 @retval EFI_SUCCESS Image Packages are exported successfully.
1580 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1584 ExportImagePackages (
1585 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1586 IN EFI_HII_HANDLE Handle
,
1587 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1589 IN UINTN BufferSize
,
1590 IN OUT VOID
*Buffer
,
1591 IN OUT UINTN
*ResultSize
1594 UINTN PackageLength
;
1596 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1599 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1600 return EFI_INVALID_PARAMETER
;
1603 if (BufferSize
> 0 && Buffer
== NULL
) {
1604 return EFI_INVALID_PARAMETER
;
1607 Package
= PackageList
->ImagePkg
;
1609 if (Package
== NULL
) {
1613 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1615 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1617 // Invoke registered notification function with EXPORT_PACK notify type
1619 Status
= InvokeRegisteredFunction (
1621 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1623 EFI_HII_PACKAGE_IMAGES
,
1626 ASSERT_EFI_ERROR (Status
);
1627 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1628 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1630 // Copy Image package header,
1631 // then justify the offset for image info and palette info in the header.
1633 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1634 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1637 // Copy Image blocks information
1639 if (Package
->ImageBlockSize
!= 0) {
1640 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1641 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1644 // Copy Palette information
1646 if (Package
->PaletteInfoSize
!= 0) {
1647 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1648 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1652 *ResultSize
+= PackageLength
;
1658 This function deletes Image package from a package list node.
1659 This is a internal function.
1661 @param Private Hii database private data.
1662 @param Handle Handle of the package list which contains the to
1663 be removed Image packages.
1664 @param PackageList Package List which contains the to be removed
1667 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1668 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1672 RemoveImagePackages (
1673 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1674 IN EFI_HII_HANDLE Handle
,
1675 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1678 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1681 Package
= PackageList
->ImagePkg
;
1684 // Image package does not exist, return directly.
1686 if (Package
== NULL
) {
1690 Status
= InvokeRegisteredFunction (
1692 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1694 EFI_HII_PACKAGE_IMAGES
,
1697 if (EFI_ERROR (Status
)) {
1701 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1703 FreePool (Package
->ImageBlock
);
1704 if (Package
->PaletteBlock
!= NULL
) {
1705 FreePool (Package
->PaletteBlock
);
1709 PackageList
->ImagePkg
= NULL
;
1716 This function insert a Simple Font package to a package list node.
1717 This is a internal function.
1719 @param PackageHdr Pointer to a buffer stored with Simple Font
1720 package information.
1721 @param NotifyType The type of change concerning the database.
1722 @param PackageList Pointer to a package list which will be inserted
1724 @param Package Created Simple Font package
1726 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1727 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1728 Simple Font package.
1729 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1733 InsertSimpleFontPackage (
1734 IN VOID
*PackageHdr
,
1735 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1736 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1737 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1740 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1742 EFI_HII_PACKAGE_HEADER Header
;
1744 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1745 return EFI_INVALID_PARAMETER
;
1749 // Create a Simple Font package node
1751 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1752 if (SimpleFontPackage
== NULL
) {
1753 Status
= EFI_OUT_OF_RESOURCES
;
1756 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1759 // Copy the Simple Font package.
1761 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1763 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1764 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1765 Status
= EFI_OUT_OF_RESOURCES
;
1769 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1772 // Insert to Simple Font package array
1774 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1775 *Package
= SimpleFontPackage
;
1777 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1778 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1785 if (SimpleFontPackage
!= NULL
) {
1786 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1787 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1789 FreePool (SimpleFontPackage
);
1796 This function exports SimpleFont packages to a buffer.
1797 This is a internal function.
1799 @param Private Hii database private structure.
1800 @param Handle Identification of a package list.
1801 @param PackageList Pointer to a package list which will be exported.
1802 @param UsedSize The length of buffer be used.
1803 @param BufferSize Length of the Buffer.
1804 @param Buffer Allocated space for storing exported data.
1805 @param ResultSize The size of the already exported content of this
1808 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1809 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1813 ExportSimpleFontPackages (
1814 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1815 IN EFI_HII_HANDLE Handle
,
1816 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1818 IN UINTN BufferSize
,
1819 IN OUT VOID
*Buffer
,
1820 IN OUT UINTN
*ResultSize
1824 UINTN PackageLength
;
1826 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1828 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1829 return EFI_INVALID_PARAMETER
;
1832 if (BufferSize
> 0 && Buffer
== NULL
) {
1833 return EFI_INVALID_PARAMETER
;
1837 Status
= EFI_SUCCESS
;
1839 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1840 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1841 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1842 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1844 // Invoke registered notification function with EXPORT_PACK notify type
1846 Status
= InvokeRegisteredFunction (
1848 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1850 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1853 ASSERT_EFI_ERROR (Status
);
1856 // Copy SimpleFont package
1858 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1859 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1863 *ResultSize
+= PackageLength
;
1869 This function deletes all Simple Font packages from a package list node.
1870 This is a internal function.
1872 @param Private Hii database private data.
1873 @param Handle Handle of the package list which contains the to
1874 be removed Simple Font packages.
1875 @param PackageList Pointer to a package list that contains removing
1878 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1879 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1883 RemoveSimpleFontPackages (
1884 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1885 IN EFI_HII_HANDLE Handle
,
1886 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1889 LIST_ENTRY
*ListHead
;
1890 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1893 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1895 while (!IsListEmpty (ListHead
)) {
1897 ListHead
->ForwardLink
,
1898 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1900 HII_S_FONT_PACKAGE_SIGNATURE
1902 Status
= InvokeRegisteredFunction (
1904 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1906 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1909 if (EFI_ERROR (Status
)) {
1913 RemoveEntryList (&Package
->SimpleFontEntry
);
1914 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1915 FreePool (Package
->SimpleFontPkgHdr
);
1924 This function insert a Device path package to a package list node.
1925 This is a internal function.
1927 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1929 @param NotifyType The type of change concerning the database.
1930 @param PackageList Pointer to a package list which will be inserted
1933 @retval EFI_SUCCESS Device path Package is inserted successfully.
1934 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1935 Device path package.
1936 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1940 InsertDevicePathPackage (
1941 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1942 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1943 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1946 UINT32 PackageLength
;
1947 EFI_HII_PACKAGE_HEADER Header
;
1949 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1950 return EFI_INVALID_PARAMETER
;
1953 // Less than one device path package is allowed in one package list.
1955 if (PackageList
->DevicePathPkg
!= NULL
) {
1956 return EFI_INVALID_PARAMETER
;
1959 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1960 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1961 if (PackageList
->DevicePathPkg
== NULL
) {
1962 return EFI_OUT_OF_RESOURCES
;
1965 Header
.Length
= PackageLength
;
1966 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1967 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1969 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1971 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1975 // Since Device Path package is created by NewPackageList, either NEW_PACK
1976 // or ADD_PACK should increase the length of package list.
1978 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1984 This function exports device path package to a buffer.
1985 This is a internal function.
1987 @param Private Hii database private structure.
1988 @param Handle Identification of a package list.
1989 @param PackageList Pointer to a package list which will be exported.
1990 @param UsedSize The length of buffer be used.
1991 @param BufferSize Length of the Buffer.
1992 @param Buffer Allocated space for storing exported data.
1993 @param ResultSize The size of the already exported content of this
1996 @retval EFI_SUCCESS Device path Package is exported successfully.
1997 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2001 ExportDevicePathPackage (
2002 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2003 IN EFI_HII_HANDLE Handle
,
2004 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2006 IN UINTN BufferSize
,
2007 IN OUT VOID
*Buffer
,
2008 IN OUT UINTN
*ResultSize
2013 EFI_HII_PACKAGE_HEADER Header
;
2015 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2016 return EFI_INVALID_PARAMETER
;
2018 if (BufferSize
> 0 && Buffer
== NULL
) {
2019 return EFI_INVALID_PARAMETER
;
2022 Package
= PackageList
->DevicePathPkg
;
2024 if (Package
== NULL
) {
2028 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2030 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2032 // Invoke registered notification function with EXPORT_PACK notify type
2034 Status
= InvokeRegisteredFunction (
2036 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2038 EFI_HII_PACKAGE_DEVICE_PATH
,
2041 ASSERT_EFI_ERROR (Status
);
2044 // Copy Device path package
2046 CopyMem (Buffer
, Package
, Header
.Length
);
2049 *ResultSize
+= Header
.Length
;
2055 This function deletes Device Path package from a package list node.
2056 This is a internal function.
2058 @param Private Hii database private data.
2059 @param Handle Handle of the package list.
2060 @param PackageList Package List which contains the to be removed
2061 Device Path package.
2063 @retval EFI_SUCCESS Device Path Package is deleted successfully.
2064 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2068 RemoveDevicePathPackage (
2069 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2070 IN EFI_HII_HANDLE Handle
,
2071 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2076 EFI_HII_PACKAGE_HEADER Header
;
2078 Package
= PackageList
->DevicePathPkg
;
2081 // No device path, return directly.
2083 if (Package
== NULL
) {
2087 Status
= InvokeRegisteredFunction (
2089 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2091 EFI_HII_PACKAGE_DEVICE_PATH
,
2094 if (EFI_ERROR (Status
)) {
2098 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2099 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2103 PackageList
->DevicePathPkg
= NULL
;
2110 This function will insert a device path package to package list firstly then
2111 invoke notification functions if any.
2112 This is a internal function.
2114 @param Private Hii database private structure.
2115 @param NotifyType The type of change concerning the database.
2116 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2118 @param DatabaseRecord Pointer to a database record contains a package
2119 list which will be inserted to.
2121 @retval EFI_SUCCESS Device path Package is inserted successfully.
2122 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2123 Device path package.
2124 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2128 AddDevicePathPackage (
2129 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2130 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2131 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2132 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2137 if (DevicePath
== NULL
) {
2141 ASSERT (Private
!= NULL
);
2142 ASSERT (DatabaseRecord
!= NULL
);
2145 // Create a device path package and insert to packagelist
2147 Status
= InsertDevicePathPackage (
2150 DatabaseRecord
->PackageList
2152 if (EFI_ERROR (Status
)) {
2156 return InvokeRegisteredFunction (
2159 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2160 EFI_HII_PACKAGE_DEVICE_PATH
,
2161 DatabaseRecord
->Handle
2167 This function insert a Keyboard Layout package to a package list node.
2168 This is a internal function.
2170 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2171 package information.
2172 @param NotifyType The type of change concerning the database.
2173 @param PackageList Pointer to a package list which will be inserted
2175 @param Package Created Keyboard Layout package
2177 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2178 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2179 Keyboard Layout package.
2180 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2184 InsertKeyboardLayoutPackage (
2185 IN VOID
*PackageHdr
,
2186 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2187 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2188 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2191 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2192 EFI_HII_PACKAGE_HEADER PackageHeader
;
2195 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2196 return EFI_INVALID_PARAMETER
;
2199 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2202 // Create a Keyboard Layout package node
2204 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2205 if (KeyboardLayoutPackage
== NULL
) {
2206 Status
= EFI_OUT_OF_RESOURCES
;
2209 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2211 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2212 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2213 Status
= EFI_OUT_OF_RESOURCES
;
2217 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2218 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2220 *Package
= KeyboardLayoutPackage
;
2222 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2223 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2231 if (KeyboardLayoutPackage
!= NULL
) {
2232 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2233 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2235 FreePool (KeyboardLayoutPackage
);
2243 This function exports Keyboard Layout packages to a buffer.
2244 This is a internal function.
2246 @param Private Hii database private structure.
2247 @param Handle Identification of a package list.
2248 @param PackageList Pointer to a package list which will be exported.
2249 @param UsedSize The length of buffer be used.
2250 @param BufferSize Length of the Buffer.
2251 @param Buffer Allocated space for storing exported data.
2252 @param ResultSize The size of the already exported content of this
2255 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2257 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2261 ExportKeyboardLayoutPackages (
2262 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2263 IN EFI_HII_HANDLE Handle
,
2264 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2266 IN UINTN BufferSize
,
2267 IN OUT VOID
*Buffer
,
2268 IN OUT UINTN
*ResultSize
2272 UINTN PackageLength
;
2274 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2275 EFI_HII_PACKAGE_HEADER PackageHeader
;
2277 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2278 return EFI_INVALID_PARAMETER
;
2281 if (BufferSize
> 0 && Buffer
== NULL
) {
2282 return EFI_INVALID_PARAMETER
;
2286 Status
= EFI_SUCCESS
;
2288 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2289 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2290 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2291 PackageLength
+= PackageHeader
.Length
;
2292 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2294 // Invoke registered notification function with EXPORT_PACK notify type
2296 Status
= InvokeRegisteredFunction (
2298 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2299 (EFI_HII_PACKAGE_HEADER
*) Package
,
2300 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2303 ASSERT_EFI_ERROR (Status
);
2306 // Copy Keyboard Layout package
2308 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2309 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2313 *ResultSize
+= PackageLength
;
2319 This function deletes all Keyboard Layout packages from a package list node.
2320 This is a internal function.
2322 @param Private Hii database private data.
2323 @param Handle Handle of the package list which contains the to
2324 be removed Keyboard Layout packages.
2325 @param PackageList Pointer to a package list that contains removing
2328 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2330 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2334 RemoveKeyboardLayoutPackages (
2335 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2336 IN EFI_HII_HANDLE Handle
,
2337 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2340 LIST_ENTRY
*ListHead
;
2341 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2342 EFI_HII_PACKAGE_HEADER PackageHeader
;
2345 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2347 while (!IsListEmpty (ListHead
)) {
2349 ListHead
->ForwardLink
,
2350 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2352 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2354 Status
= InvokeRegisteredFunction (
2356 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2358 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2361 if (EFI_ERROR (Status
)) {
2365 RemoveEntryList (&Package
->KeyboardEntry
);
2366 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2367 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2368 FreePool (Package
->KeyboardPkg
);
2377 This function will insert a package list to hii database firstly then
2378 invoke notification functions if any. It is the worker function of
2379 HiiNewPackageList and HiiUpdatePackageList.
2381 This is a internal function.
2383 @param Private Hii database private structure.
2384 @param NotifyType The type of change concerning the database.
2385 @param PackageList Pointer to a package list.
2386 @param DatabaseRecord Pointer to a database record contains a package
2387 list instance which will be inserted to.
2389 @retval EFI_SUCCESS All incoming packages are inserted to current
2391 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2392 Device path package.
2393 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2398 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2399 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2400 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2401 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2405 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2406 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2407 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2408 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2409 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2410 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2411 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2412 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2413 EFI_HII_PACKAGE_HEADER PackageHeader
;
2414 UINT32 OldPackageListLen
;
2415 BOOLEAN StringPkgIsAdd
;
2418 // Initialize Variables
2420 StringPkgIsAdd
= FALSE
;
2422 StringPackage
= NULL
;
2425 ImagePackage
= NULL
;
2426 SimpleFontPackage
= NULL
;
2427 KeyboardLayoutPackage
= NULL
;
2430 // Process the package list header
2432 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2434 &DatabaseRecord
->PackageList
->PackageListHdr
,
2435 (VOID
*) PackageList
,
2436 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2438 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2439 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2442 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2443 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2445 Status
= EFI_SUCCESS
;
2447 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2448 switch (PackageHeader
.Type
) {
2449 case EFI_HII_PACKAGE_TYPE_GUID
:
2450 Status
= InsertGuidPackage (
2453 DatabaseRecord
->PackageList
,
2456 if (EFI_ERROR (Status
)) {
2459 Status
= InvokeRegisteredFunction (
2462 (VOID
*) GuidPackage
,
2463 (UINT8
) (PackageHeader
.Type
),
2464 DatabaseRecord
->Handle
2467 case EFI_HII_PACKAGE_FORMS
:
2468 Status
= InsertFormPackage (
2471 DatabaseRecord
->PackageList
,
2474 if (EFI_ERROR (Status
)) {
2477 Status
= InvokeRegisteredFunction (
2480 (VOID
*) FormPackage
,
2481 (UINT8
) (PackageHeader
.Type
),
2482 DatabaseRecord
->Handle
2485 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2486 Status
= InsertKeyboardLayoutPackage (
2489 DatabaseRecord
->PackageList
,
2490 &KeyboardLayoutPackage
2492 if (EFI_ERROR (Status
)) {
2495 Status
= InvokeRegisteredFunction (
2498 (VOID
*) KeyboardLayoutPackage
,
2499 (UINT8
) (PackageHeader
.Type
),
2500 DatabaseRecord
->Handle
2503 case EFI_HII_PACKAGE_STRINGS
:
2504 Status
= InsertStringPackage (
2508 DatabaseRecord
->PackageList
,
2511 if (EFI_ERROR (Status
)) {
2514 ASSERT (StringPackage
!= NULL
);
2515 Status
= InvokeRegisteredFunction (
2518 (VOID
*) StringPackage
,
2519 (UINT8
) (PackageHeader
.Type
),
2520 DatabaseRecord
->Handle
2522 StringPkgIsAdd
= TRUE
;
2524 case EFI_HII_PACKAGE_FONTS
:
2525 Status
= InsertFontPackage (
2529 DatabaseRecord
->PackageList
,
2532 if (EFI_ERROR (Status
)) {
2535 Status
= InvokeRegisteredFunction (
2538 (VOID
*) FontPackage
,
2539 (UINT8
) (PackageHeader
.Type
),
2540 DatabaseRecord
->Handle
2543 case EFI_HII_PACKAGE_IMAGES
:
2544 Status
= InsertImagePackage (
2547 DatabaseRecord
->PackageList
,
2550 if (EFI_ERROR (Status
)) {
2553 Status
= InvokeRegisteredFunction (
2556 (VOID
*) ImagePackage
,
2557 (UINT8
) (PackageHeader
.Type
),
2558 DatabaseRecord
->Handle
2561 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2562 Status
= InsertSimpleFontPackage (
2565 DatabaseRecord
->PackageList
,
2568 if (EFI_ERROR (Status
)) {
2571 Status
= InvokeRegisteredFunction (
2574 (VOID
*) SimpleFontPackage
,
2575 (UINT8
) (PackageHeader
.Type
),
2576 DatabaseRecord
->Handle
2579 case EFI_HII_PACKAGE_DEVICE_PATH
:
2580 Status
= AddDevicePathPackage (
2583 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2591 if (EFI_ERROR (Status
)) {
2595 // goto header of next package
2597 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2598 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2602 // Adjust String Package to make sure all string packages have the same max string ID.
2604 if (!EFI_ERROR (Status
) && StringPkgIsAdd
) {
2605 Status
= AdjustStringPackage (DatabaseRecord
->PackageList
);
2613 This function exports a package list to a buffer. It is the worker function
2614 of HiiExportPackageList.
2616 This is a internal function.
2618 @param Private Hii database private structure.
2619 @param Handle Identification of a package list.
2620 @param PackageList Pointer to a package list which will be exported.
2621 @param UsedSize The length of buffer has been used by exporting
2622 package lists when Handle is NULL.
2623 @param BufferSize Length of the Buffer.
2624 @param Buffer Allocated space for storing exported data.
2626 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2628 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2633 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2634 IN EFI_HII_HANDLE Handle
,
2635 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2636 IN OUT UINTN
*UsedSize
,
2637 IN UINTN BufferSize
,
2638 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2643 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2645 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
2646 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2647 ASSERT (IsHiiHandleValid (Handle
));
2649 if (BufferSize
> 0 && Buffer
== NULL
) {
2650 return EFI_INVALID_PARAMETER
;
2654 // Copy the package list header
2655 // ResultSize indicates the length of the exported bytes of this package list
2657 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2658 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2659 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2662 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2664 Status
= ExportGuidPackages (
2670 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2673 if (EFI_ERROR (Status
)) {
2676 Status
= ExportFormPackages (
2682 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2685 if (EFI_ERROR (Status
)) {
2688 Status
= ExportKeyboardLayoutPackages (
2694 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2697 if (EFI_ERROR (Status
)) {
2700 Status
= ExportStringPackages (
2706 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2709 if (EFI_ERROR (Status
)) {
2712 Status
= ExportFontPackages (
2718 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2721 if (EFI_ERROR (Status
)) {
2724 Status
= ExportImagePackages (
2730 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2733 if (EFI_ERROR (Status
)) {
2736 Status
= ExportSimpleFontPackages (
2742 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2745 if (EFI_ERROR (Status
)) {
2748 Status
= ExportDevicePathPackage (
2754 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2757 if (EFI_ERROR (Status
)) {
2761 // Append the package list end.
2763 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2764 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2765 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2767 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2768 (VOID
*) &EndofPackageList
,
2769 sizeof (EFI_HII_PACKAGE_HEADER
)
2773 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2780 This function adds the packages in the package list to the database and returns a handle. If there is a
2781 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2782 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2784 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2786 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2788 @param DriverHandle Associate the package list with this EFI handle.
2789 If a NULL is specified, this data will not be associate
2790 with any drivers and cannot have a callback induced.
2791 @param Handle A pointer to the EFI_HII_HANDLE instance.
2793 @retval EFI_SUCCESS The package list associated with the Handle was
2794 added to the HII database.
2795 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2797 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2798 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2804 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2805 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2806 IN CONST EFI_HANDLE DriverHandle
, OPTIONAL
2807 OUT EFI_HII_HANDLE
*Handle
2811 HII_DATABASE_PRIVATE_DATA
*Private
;
2812 HII_DATABASE_RECORD
*DatabaseRecord
;
2813 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2815 EFI_GUID PackageListGuid
;
2817 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2818 return EFI_INVALID_PARAMETER
;
2821 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2822 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2825 // Check the Package list GUID to guarantee this GUID is unique in database.
2827 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2828 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2830 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2831 &PackageListGuid
) &&
2832 DatabaseRecord
->DriverHandle
== DriverHandle
) {
2833 return EFI_INVALID_PARAMETER
;
2838 // Build a PackageList node
2840 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2841 if (EFI_ERROR (Status
)) {
2846 // Fill in information of the created Package List node
2847 // according to incoming package list.
2849 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2850 if (EFI_ERROR (Status
)) {
2854 DatabaseRecord
->DriverHandle
= DriverHandle
;
2857 // Create a Device path package and add into the package list if exists.
2859 Status
= gBS
->HandleProtocol (
2861 &gEfiDevicePathProtocolGuid
,
2862 (VOID
**) &DevicePath
2864 if (!EFI_ERROR (Status
)) {
2865 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2866 ASSERT_EFI_ERROR (Status
);
2869 *Handle
= DatabaseRecord
->Handle
;
2875 This function removes the package list that is associated with a handle Handle
2876 from the HII database. Before removing the package, any registered functions
2877 with the notification type REMOVE_PACK and the same package type will be called.
2879 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2881 @param Handle The handle that was registered to the data that is
2882 requested for removal.
2884 @retval EFI_SUCCESS The data associated with the Handle was removed
2885 from the HII database.
2886 @retval EFI_NOT_FOUND The specified andle is not in database.
2887 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2892 HiiRemovePackageList (
2893 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2894 IN EFI_HII_HANDLE Handle
2898 HII_DATABASE_PRIVATE_DATA
*Private
;
2900 HII_DATABASE_RECORD
*Node
;
2901 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2902 HII_HANDLE
*HiiHandle
;
2905 return EFI_INVALID_PARAMETER
;
2908 if (!IsHiiHandleValid (Handle
)) {
2909 return EFI_NOT_FOUND
;
2912 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2915 // Get the packagelist to be removed.
2917 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2918 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2919 if (Node
->Handle
== Handle
) {
2920 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2921 ASSERT (PackageList
!= NULL
);
2924 // Call registered functions with REMOVE_PACK before removing packages
2925 // then remove them.
2927 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2928 if (EFI_ERROR (Status
)) {
2931 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2932 if (EFI_ERROR (Status
)) {
2935 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2936 if (EFI_ERROR (Status
)) {
2939 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2940 if (EFI_ERROR (Status
)) {
2943 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2944 if (EFI_ERROR (Status
)) {
2947 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2948 if (EFI_ERROR (Status
)) {
2951 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2952 if (EFI_ERROR (Status
)) {
2955 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2956 if (EFI_ERROR (Status
)) {
2961 // Free resources of the package list
2963 RemoveEntryList (&Node
->DatabaseEntry
);
2965 HiiHandle
= (HII_HANDLE
*) Handle
;
2966 RemoveEntryList (&HiiHandle
->Handle
);
2967 Private
->HiiHandleCount
--;
2968 ASSERT (Private
->HiiHandleCount
>= 0);
2970 HiiHandle
->Signature
= 0;
2971 FreePool (HiiHandle
);
2972 FreePool (Node
->PackageList
);
2979 return EFI_NOT_FOUND
;
2984 This function updates the existing package list (which has the specified Handle)
2985 in the HII databases, using the new package list specified by PackageList.
2987 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2989 @param Handle The handle that was registered to the data that is
2990 requested to be updated.
2991 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2994 @retval EFI_SUCCESS The HII database was successfully updated.
2995 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2997 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2998 @retval EFI_NOT_FOUND The specified Handle is not in database.
3003 HiiUpdatePackageList (
3004 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3005 IN EFI_HII_HANDLE Handle
,
3006 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
3010 HII_DATABASE_PRIVATE_DATA
*Private
;
3012 HII_DATABASE_RECORD
*Node
;
3013 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
3014 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
3015 EFI_HII_PACKAGE_HEADER PackageHeader
;
3017 if (This
== NULL
|| PackageList
== NULL
) {
3018 return EFI_INVALID_PARAMETER
;
3021 if (!IsHiiHandleValid (Handle
)) {
3022 return EFI_NOT_FOUND
;
3025 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3027 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
3029 Status
= EFI_SUCCESS
;
3032 // Get original packagelist to be updated
3034 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3035 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3036 if (Node
->Handle
== Handle
) {
3037 OldPackageList
= Node
->PackageList
;
3039 // Remove the package if its type matches one of the package types which is
3040 // contained in the new package list.
3042 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3043 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
3044 switch (PackageHeader
.Type
) {
3045 case EFI_HII_PACKAGE_TYPE_GUID
:
3046 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
3048 case EFI_HII_PACKAGE_FORMS
:
3049 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
3051 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3052 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
3054 case EFI_HII_PACKAGE_STRINGS
:
3055 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
3057 case EFI_HII_PACKAGE_FONTS
:
3058 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
3060 case EFI_HII_PACKAGE_IMAGES
:
3061 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
3063 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3064 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
3066 case EFI_HII_PACKAGE_DEVICE_PATH
:
3067 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
3071 if (EFI_ERROR (Status
)) {
3075 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3076 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3080 // Add all of the packages within the new package list
3082 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3086 return EFI_NOT_FOUND
;
3091 This function returns a list of the package handles of the specified type
3092 that are currently active in the database. The pseudo-type
3093 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3095 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3097 @param PackageType Specifies the package type of the packages to list
3098 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3100 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3101 this is the pointer to the GUID which must match
3102 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3103 Otherwise, it must be NULL.
3104 @param HandleBufferLength On input, a pointer to the length of the handle
3105 buffer. On output, the length of the handle
3106 buffer that is required for the handles found.
3107 @param Handle An array of EFI_HII_HANDLE instances returned.
3109 @retval EFI_SUCCESS The matching handles are outputed successfully.
3110 HandleBufferLength is updated with the actual length.
3111 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3112 Handle is too small to support the number of
3113 handles. HandleBufferLength is updated with a
3114 value that will enable the data to fit.
3115 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3116 @retval EFI_INVALID_PARAMETER HandleBufferLength was NULL.
3117 @retval EFI_INVALID_PARAMETER The value referenced by HandleBufferLength was not
3118 zero and Handle was NULL.
3119 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3120 PackageGuid is not NULL, PackageType is a EFI_HII_
3121 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3126 HiiListPackageLists (
3127 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3128 IN UINT8 PackageType
,
3129 IN CONST EFI_GUID
*PackageGuid
,
3130 IN OUT UINTN
*HandleBufferLength
,
3131 OUT EFI_HII_HANDLE
*Handle
3134 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3135 HII_DATABASE_PRIVATE_DATA
*Private
;
3136 HII_DATABASE_RECORD
*Node
;
3139 HII_HANDLE
**Result
;
3141 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3145 // Check input parameters
3147 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3148 return EFI_INVALID_PARAMETER
;
3150 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3151 return EFI_INVALID_PARAMETER
;
3153 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3154 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3155 return EFI_INVALID_PARAMETER
;
3158 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3160 Result
= (HII_HANDLE
**) Handle
;
3163 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3164 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3165 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3166 switch (PackageType
) {
3167 case EFI_HII_PACKAGE_TYPE_GUID
:
3168 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3169 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3171 (EFI_GUID
*) PackageGuid
,
3172 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3179 case EFI_HII_PACKAGE_FORMS
:
3180 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3184 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3185 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3189 case EFI_HII_PACKAGE_STRINGS
:
3190 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3194 case EFI_HII_PACKAGE_FONTS
:
3195 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3199 case EFI_HII_PACKAGE_IMAGES
:
3200 if (PackageList
->ImagePkg
!= NULL
) {
3204 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3205 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3209 case EFI_HII_PACKAGE_DEVICE_PATH
:
3210 if (PackageList
->DevicePathPkg
!= NULL
) {
3215 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3218 case EFI_HII_PACKAGE_TYPE_ALL
:
3226 // This active package list has the specified package type, list it.
3229 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3230 if (ResultSize
<= *HandleBufferLength
) {
3231 *Result
++ = Node
->Handle
;
3237 if (ResultSize
== 0) {
3238 return EFI_NOT_FOUND
;
3241 if (*HandleBufferLength
< ResultSize
) {
3242 *HandleBufferLength
= ResultSize
;
3243 return EFI_BUFFER_TOO_SMALL
;
3246 *HandleBufferLength
= ResultSize
;
3252 This function will export one or all package lists in the database to a buffer.
3253 For each package list exported, this function will call functions registered
3254 with EXPORT_PACK and then copy the package list to the buffer.
3256 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3258 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3259 package list in the HII database to export or NULL
3260 to indicate all package lists should be exported.
3261 @param BufferSize On input, a pointer to the length of the buffer.
3262 On output, the length of the buffer that is
3263 required for the exported data.
3264 @param Buffer A pointer to a buffer that will contain the
3265 results of the export function.
3267 @retval EFI_SUCCESS Package exported.
3268 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3269 Handle is too small to support the number of
3270 handles. HandleBufferLength is updated with a
3271 value that will enable the data to fit.
3272 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3274 @retval EFI_INVALID_PARAMETER BufferSize was NULL.
3275 @retval EFI_INVALID_PARAMETER The value referenced by BufferSize was not zero
3276 and Buffer was NULL.
3281 HiiExportPackageLists (
3282 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3283 IN EFI_HII_HANDLE Handle
,
3284 IN OUT UINTN
*BufferSize
,
3285 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3290 HII_DATABASE_PRIVATE_DATA
*Private
;
3291 HII_DATABASE_RECORD
*Node
;
3294 if (This
== NULL
|| BufferSize
== NULL
) {
3295 return EFI_INVALID_PARAMETER
;
3297 if (*BufferSize
> 0 && Buffer
== NULL
) {
3298 return EFI_INVALID_PARAMETER
;
3300 if ((Handle
!= NULL
) && (!IsHiiHandleValid (Handle
))) {
3301 return EFI_NOT_FOUND
;
3304 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3307 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3308 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3309 if (Handle
== NULL
) {
3311 // Export all package lists in current hii database.
3313 Status
= ExportPackageList (
3316 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3319 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3321 ASSERT_EFI_ERROR (Status
);
3322 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3323 Status
= ExportPackageList (
3326 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3331 ASSERT_EFI_ERROR (Status
);
3332 if (*BufferSize
< UsedSize
) {
3333 *BufferSize
= UsedSize
;
3334 return EFI_BUFFER_TOO_SMALL
;
3340 if (Handle
== NULL
&& UsedSize
!= 0) {
3341 if (*BufferSize
< UsedSize
) {
3342 *BufferSize
= UsedSize
;
3343 return EFI_BUFFER_TOO_SMALL
;
3348 return EFI_NOT_FOUND
;
3353 This function registers a function which will be called when specified actions related to packages of
3354 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3355 notified when specific package types are added, removed or updated in the HII database.
3356 Each driver or application which registers a notification should use
3357 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3359 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3361 @param PackageType Specifies the package type of the packages to list
3362 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3364 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3365 this is the pointer to the GUID which must match
3367 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3369 @param PackageNotifyFn Points to the function to be called when the event
3371 NotificationType occurs.
3372 @param NotifyType Describes the types of notification which this
3373 function will be receiving.
3374 @param NotifyHandle Points to the unique handle assigned to the
3375 registered notification. Can be used in
3376 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3377 to stop notifications.
3379 @retval EFI_SUCCESS Notification registered successfully.
3380 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3381 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3382 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3383 EFI_HII_PACKAGE_TYPE_GUID.
3384 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3385 EFI_HII_PACKAGE_TYPE_GUID.
3390 HiiRegisterPackageNotify (
3391 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3392 IN UINT8 PackageType
,
3393 IN CONST EFI_GUID
*PackageGuid
,
3394 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3395 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3396 OUT EFI_HANDLE
*NotifyHandle
3399 HII_DATABASE_PRIVATE_DATA
*Private
;
3400 HII_DATABASE_NOTIFY
*Notify
;
3403 if (This
== NULL
|| NotifyHandle
== NULL
) {
3404 return EFI_INVALID_PARAMETER
;
3406 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3407 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3408 return EFI_INVALID_PARAMETER
;
3411 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3414 // Allocate a notification node
3416 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3417 if (Notify
== NULL
) {
3418 return EFI_OUT_OF_RESOURCES
;
3422 // Generate a notify handle
3424 Status
= gBS
->InstallMultipleProtocolInterfaces (
3425 &Notify
->NotifyHandle
,
3430 ASSERT_EFI_ERROR (Status
);
3433 // Fill in the information to the notification node
3435 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3436 Notify
->PackageType
= PackageType
;
3437 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3438 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3439 Notify
->NotifyType
= NotifyType
;
3441 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3442 *NotifyHandle
= Notify
->NotifyHandle
;
3449 Removes the specified HII database package-related notification.
3451 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3453 @param NotificationHandle The handle of the notification function being
3456 @retval EFI_SUCCESS Notification is unregistered successfully.
3457 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3458 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3459 in current hii database.
3464 HiiUnregisterPackageNotify (
3465 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3466 IN EFI_HANDLE NotificationHandle
3469 HII_DATABASE_PRIVATE_DATA
*Private
;
3470 HII_DATABASE_NOTIFY
*Notify
;
3475 return EFI_INVALID_PARAMETER
;
3478 if (NotificationHandle
== NULL
) {
3479 return EFI_NOT_FOUND
;
3482 Status
= gBS
->OpenProtocol (
3488 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3490 if (EFI_ERROR (Status
)) {
3491 return EFI_NOT_FOUND
;
3494 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3496 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3497 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3498 if (Notify
->NotifyHandle
== NotificationHandle
) {
3500 // Remove the matching notification node
3502 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3503 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3504 Notify
->NotifyHandle
,
3509 ASSERT_EFI_ERROR (Status
);
3516 return EFI_NOT_FOUND
;
3521 This routine retrieves an array of GUID values for each keyboard layout that
3522 was previously registered in the system.
3524 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3526 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3527 GUID buffer. On output, the length of the handle
3528 buffer that is required for the handles found.
3529 @param KeyGuidBuffer An array of keyboard layout GUID instances
3532 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3533 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3534 that KeyGuidBuffer is too small to support the
3535 number of GUIDs. KeyGuidBufferLength is
3536 updated with a value that will enable the data to
3538 @retval EFI_INVALID_PARAMETER The KeyGuidBufferLength is NULL.
3539 @retval EFI_INVALID_PARAMETER The value referenced by KeyGuidBufferLength is not
3540 zero and KeyGuidBuffer is NULL.
3541 @retval EFI_NOT_FOUND There was no keyboard layout.
3546 HiiFindKeyboardLayouts (
3547 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3548 IN OUT UINT16
*KeyGuidBufferLength
,
3549 OUT EFI_GUID
*KeyGuidBuffer
3552 HII_DATABASE_PRIVATE_DATA
*Private
;
3553 HII_DATABASE_RECORD
*Node
;
3554 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3560 UINT16 LayoutLength
;
3562 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3564 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3565 return EFI_INVALID_PARAMETER
;
3568 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3569 return EFI_INVALID_PARAMETER
;
3572 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3576 // Search all package lists in whole database to retrieve keyboard layout.
3578 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3579 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3580 PackageList
= Node
->PackageList
;
3581 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3582 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3583 Link1
= Link1
->ForwardLink
3586 // Find out all Keyboard Layout packages in this package list.
3590 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3592 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3594 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3597 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3600 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3601 ResultSize
+= sizeof (EFI_GUID
);
3602 if (ResultSize
<= *KeyGuidBufferLength
) {
3603 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3604 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3605 Layout
= Layout
+ LayoutLength
;
3611 if (ResultSize
== 0) {
3612 return EFI_NOT_FOUND
;
3615 if (*KeyGuidBufferLength
< ResultSize
) {
3616 *KeyGuidBufferLength
= ResultSize
;
3617 return EFI_BUFFER_TOO_SMALL
;
3620 *KeyGuidBufferLength
= ResultSize
;
3626 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3627 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3629 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3631 @param KeyGuid A pointer to the unique ID associated with a given
3632 keyboard layout. If KeyGuid is NULL then the
3633 current layout will be retrieved.
3634 @param KeyboardLayoutLength On input, a pointer to the length of the
3635 KeyboardLayout buffer. On output, the length of
3636 the data placed into KeyboardLayout.
3637 @param KeyboardLayout A pointer to a buffer containing the retrieved
3640 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3641 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3642 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3644 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3645 that KeyboardLayout is too small to support the
3646 requested keyboard layout. KeyboardLayoutLength is
3647 updated with a value that will enable the
3653 HiiGetKeyboardLayout (
3654 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3655 IN CONST EFI_GUID
*KeyGuid
,
3656 IN OUT UINT16
*KeyboardLayoutLength
,
3657 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3660 HII_DATABASE_PRIVATE_DATA
*Private
;
3661 HII_DATABASE_RECORD
*Node
;
3662 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3668 UINT16 LayoutLength
;
3669 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3671 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3672 return EFI_INVALID_PARAMETER
;
3674 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3675 return EFI_INVALID_PARAMETER
;
3678 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3680 // Retrieve the current keyboard layout.
3682 if (KeyGuid
== NULL
) {
3683 if (Private
->CurrentLayout
== NULL
) {
3684 return EFI_NOT_FOUND
;
3686 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3687 if (*KeyboardLayoutLength
< LayoutLength
) {
3688 *KeyboardLayoutLength
= LayoutLength
;
3689 return EFI_BUFFER_TOO_SMALL
;
3691 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3695 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3696 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3697 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3698 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3699 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3700 Link1
= Link1
->ForwardLink
3704 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3706 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3709 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3710 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3711 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3712 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3713 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3714 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3715 if (LayoutLength
<= *KeyboardLayoutLength
) {
3716 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3719 *KeyboardLayoutLength
= LayoutLength
;
3720 return EFI_BUFFER_TOO_SMALL
;
3723 Layout
= Layout
+ LayoutLength
;
3728 return EFI_NOT_FOUND
;
3733 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3734 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3735 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3736 can be notified of this change.
3738 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3740 @param KeyGuid A pointer to the unique ID associated with a given
3743 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3744 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3746 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3751 HiiSetKeyboardLayout (
3752 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3753 IN CONST EFI_GUID
*KeyGuid
3756 HII_DATABASE_PRIVATE_DATA
*Private
;
3757 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3758 UINT16 KeyboardLayoutLength
;
3761 if (This
== NULL
|| KeyGuid
== NULL
) {
3762 return EFI_INVALID_PARAMETER
;
3765 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3768 // The specified GUID equals the current keyboard layout GUID,
3771 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3776 // Try to find the incoming keyboard layout data in current database.
3778 KeyboardLayoutLength
= 0;
3779 KeyboardLayout
= NULL
;
3780 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3781 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3785 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3786 ASSERT (KeyboardLayout
!= NULL
);
3787 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3788 ASSERT_EFI_ERROR (Status
);
3791 // Backup current keyboard layout.
3793 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3794 if (Private
->CurrentLayout
!= NULL
) {
3795 FreePool(Private
->CurrentLayout
);
3797 Private
->CurrentLayout
= KeyboardLayout
;
3800 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3801 // current keyboard layout is changed.
3803 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3804 ASSERT_EFI_ERROR (Status
);
3811 Return the EFI handle associated with a package list.
3813 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3815 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3816 package list in the HIIdatabase.
3817 @param DriverHandle On return, contains the EFI_HANDLE which was
3818 registered with the package list in
3821 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3822 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3823 DriverHandle was NULL.
3824 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3830 HiiGetPackageListHandle (
3831 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3832 IN EFI_HII_HANDLE PackageListHandle
,
3833 OUT EFI_HANDLE
*DriverHandle
3836 HII_DATABASE_PRIVATE_DATA
*Private
;
3837 HII_DATABASE_RECORD
*Node
;
3840 if (This
== NULL
|| DriverHandle
== NULL
) {
3841 return EFI_INVALID_PARAMETER
;
3844 if (!IsHiiHandleValid (PackageListHandle
)) {
3845 return EFI_INVALID_PARAMETER
;
3848 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3850 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3851 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3852 if (Node
->Handle
== PackageListHandle
) {
3853 *DriverHandle
= Node
->DriverHandle
;
3858 return EFI_NOT_FOUND
;