2 Implementation for EFI_HII_DATABASE_PROTOCOL.
4 Copyright (c) 2007 - 2010, Intel Corporation
5 All rights reserved. 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"
21 EFI_GUID mHiiDatabaseNotifyGuid
= HII_DATABASE_NOTIFY_GUID
;
25 This function generates a HII_DATABASE_RECORD node and adds into hii database.
26 This is a internal function.
28 @param Private hii database private structure
29 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
32 @retval EFI_SUCCESS A database record is generated successfully.
33 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
35 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
39 GenerateHiiDatabaseRecord (
40 IN HII_DATABASE_PRIVATE_DATA
*Private
,
41 OUT HII_DATABASE_RECORD
**DatabaseNode
44 HII_DATABASE_RECORD
*DatabaseRecord
;
45 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
46 HII_HANDLE
*HiiHandle
;
48 if (Private
== NULL
|| DatabaseNode
== NULL
) {
49 return EFI_INVALID_PARAMETER
;
52 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
53 if (DatabaseRecord
== NULL
) {
54 return EFI_OUT_OF_RESOURCES
;
56 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
58 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
59 if (DatabaseRecord
->PackageList
== NULL
) {
60 FreePool (DatabaseRecord
);
61 return EFI_OUT_OF_RESOURCES
;
64 PackageList
= DatabaseRecord
->PackageList
;
66 InitializeListHead (&PackageList
->GuidPkgHdr
);
67 InitializeListHead (&PackageList
->FormPkgHdr
);
68 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
69 InitializeListHead (&PackageList
->StringPkgHdr
);
70 InitializeListHead (&PackageList
->FontPkgHdr
);
71 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
72 PackageList
->ImagePkg
= NULL
;
73 PackageList
->DevicePathPkg
= NULL
;
76 // Create a new hii handle
78 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
79 if (HiiHandle
== NULL
) {
80 FreePool (DatabaseRecord
->PackageList
);
81 FreePool (DatabaseRecord
);
82 return EFI_OUT_OF_RESOURCES
;
84 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
86 // Backup the number of Hii handles
88 Private
->HiiHandleCount
++;
89 HiiHandle
->Key
= Private
->HiiHandleCount
;
91 // Insert the handle to hii handle list of the whole database.
93 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
95 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
98 // Insert the Package List node to Package List link of the whole database.
100 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
102 *DatabaseNode
= DatabaseRecord
;
110 This function checks whether a handle is a valid EFI_HII_HANDLE
111 This is a internal function.
113 @param Handle Pointer to a EFI_HII_HANDLE
116 @retval FALSE Invalid
121 EFI_HII_HANDLE Handle
124 HII_HANDLE
*HiiHandle
;
126 HiiHandle
= (HII_HANDLE
*) Handle
;
128 if (HiiHandle
== NULL
) {
132 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
141 This function invokes the matching registered function.
142 This is a internal function.
144 @param Private HII Database driver private structure.
145 @param NotifyType The type of change concerning the database.
146 @param PackageInstance Points to the package referred to by the
148 @param PackageType Package type
149 @param Handle The handle of the package list which contains the
152 @retval EFI_SUCCESS Already checked all registered function and
154 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
158 InvokeRegisteredFunction (
159 IN HII_DATABASE_PRIVATE_DATA
*Private
,
160 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
161 IN VOID
*PackageInstance
,
162 IN UINT8 PackageType
,
163 IN EFI_HII_HANDLE Handle
166 HII_DATABASE_NOTIFY
*Notify
;
168 EFI_HII_PACKAGE_HEADER
*Package
;
172 UINT32 ImageBlockSize
;
173 UINT32 PaletteInfoSize
;
175 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
176 return EFI_INVALID_PARAMETER
;
178 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
179 return EFI_INVALID_PARAMETER
;
181 if (!IsHiiHandleValid (Handle
)) {
182 return EFI_INVALID_PARAMETER
;
189 // Convert the incoming package from hii database storage format to UEFI
190 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
192 switch (PackageType
) {
193 case EFI_HII_PACKAGE_TYPE_GUID
:
194 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
197 case EFI_HII_PACKAGE_FORMS
:
198 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
199 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
200 ASSERT (Buffer
!= NULL
);
203 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
204 sizeof (EFI_HII_PACKAGE_HEADER
)
207 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
208 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
209 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
211 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
214 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
215 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
218 case EFI_HII_PACKAGE_STRINGS
:
219 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
220 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
221 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
222 ASSERT (Buffer
!= NULL
);
225 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
230 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
231 BufferSize
- HeaderSize
233 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
236 case EFI_HII_PACKAGE_FONTS
:
237 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
238 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
239 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
240 ASSERT (Buffer
!= NULL
);
243 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
248 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
249 BufferSize
- HeaderSize
251 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
254 case EFI_HII_PACKAGE_IMAGES
:
255 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
256 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
257 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
258 ASSERT (Buffer
!= NULL
);
262 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
266 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
271 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
272 if (ImageBlockSize
!= 0) {
275 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
280 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
281 if (PaletteInfoSize
!= 0) {
283 Buffer
+ HeaderSize
+ ImageBlockSize
,
284 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
287 HeaderSize
+= ImageBlockSize
;
289 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
294 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
297 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
298 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
299 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
300 ASSERT (Buffer
!= NULL
);
303 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
306 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
309 case EFI_HII_PACKAGE_DEVICE_PATH
:
310 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
314 return EFI_INVALID_PARAMETER
;
317 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
318 Link
!= &Private
->DatabaseNotifyList
;
319 Link
= Link
->ForwardLink
321 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
322 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
324 // Check in case PackageGuid is not NULL when Package is GUID package
326 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
327 Notify
->PackageGuid
= NULL
;
330 // Status of Registered Function is unknown so did not check it
332 Notify
->PackageNotifyFn (
342 if (Buffer
!= NULL
) {
351 This function insert a GUID package to a package list node.
352 This is a internal function.
354 @param PackageHdr Pointer to a buffer stored with GUID package
356 @param NotifyType The type of change concerning the database.
357 @param PackageList Pointer to a package list which will be inserted
359 @param Package Created GUID pacakge
361 @retval EFI_SUCCESS Guid Package is inserted successfully.
362 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
364 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
370 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
371 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
372 OUT HII_GUID_PACKAGE_INSTANCE
**Package
375 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
376 EFI_HII_PACKAGE_HEADER PackageHeader
;
378 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
379 return EFI_INVALID_PARAMETER
;
382 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
385 // Create a GUID package node
387 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
388 if (GuidPackage
== NULL
) {
389 return EFI_OUT_OF_RESOURCES
;
391 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
392 if (GuidPackage
->GuidPkg
== NULL
) {
393 FreePool (GuidPackage
);
394 return EFI_OUT_OF_RESOURCES
;
397 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
398 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
399 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
400 *Package
= GuidPackage
;
402 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
403 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
411 This function exports GUID packages to a buffer.
412 This is a internal function.
414 @param Private Hii database private structure.
415 @param Handle Identification of a package list.
416 @param PackageList Pointer to a package list which will be exported.
417 @param UsedSize The length of buffer be used.
418 @param BufferSize Length of the Buffer.
419 @param Buffer Allocated space for storing exported data.
420 @param ResultSize The size of the already exported content of this
423 @retval EFI_SUCCESS Guid Packages are exported successfully.
424 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
429 IN HII_DATABASE_PRIVATE_DATA
*Private
,
430 IN EFI_HII_HANDLE Handle
,
431 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
435 IN OUT UINTN
*ResultSize
438 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
441 EFI_HII_PACKAGE_HEADER PackageHeader
;
444 if (PackageList
== NULL
|| ResultSize
== NULL
) {
445 return EFI_INVALID_PARAMETER
;
448 if (BufferSize
> 0 && Buffer
== NULL
) {
449 return EFI_INVALID_PARAMETER
;
453 Status
= EFI_SUCCESS
;
455 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
456 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
457 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
458 PackageLength
+= PackageHeader
.Length
;
459 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
460 Status
= InvokeRegisteredFunction (
462 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
463 (VOID
*) GuidPackage
,
464 EFI_HII_PACKAGE_TYPE_GUID
,
467 ASSERT_EFI_ERROR (Status
);
468 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
469 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
473 *ResultSize
+= PackageLength
;
479 This function deletes all GUID packages from a package list node.
480 This is a internal function.
482 @param Private Hii database private data.
483 @param Handle Handle of the package list which contains the to
484 be removed GUID packages.
485 @param PackageList Pointer to a package list that contains removing
488 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
489 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
494 IN HII_DATABASE_PRIVATE_DATA
*Private
,
495 IN EFI_HII_HANDLE Handle
,
496 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
499 LIST_ENTRY
*ListHead
;
500 HII_GUID_PACKAGE_INSTANCE
*Package
;
502 EFI_HII_PACKAGE_HEADER PackageHeader
;
504 ListHead
= &PackageList
->GuidPkgHdr
;
506 while (!IsListEmpty (ListHead
)) {
508 ListHead
->ForwardLink
,
509 HII_GUID_PACKAGE_INSTANCE
,
511 HII_GUID_PACKAGE_SIGNATURE
513 Status
= InvokeRegisteredFunction (
515 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
517 EFI_HII_PACKAGE_TYPE_GUID
,
520 if (EFI_ERROR (Status
)) {
524 RemoveEntryList (&Package
->GuidEntry
);
525 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
526 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
527 FreePool (Package
->GuidPkg
);
536 This function insert a Form package to a package list node.
537 This is a internal function.
539 @param PackageHdr Pointer to a buffer stored with Form package
541 @param NotifyType The type of change concerning the database.
542 @param PackageList Pointer to a package list which will be inserted
544 @param Package Created Form package
546 @retval EFI_SUCCESS Form Package is inserted successfully.
547 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
549 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
555 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
556 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
557 OUT HII_IFR_PACKAGE_INSTANCE
**Package
560 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
561 EFI_HII_PACKAGE_HEADER PackageHeader
;
563 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
564 return EFI_INVALID_PARAMETER
;
568 // Get the length of the package, including package header itself
570 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
573 // Create a Form package node
575 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
576 if (FormPackage
== NULL
) {
577 return EFI_OUT_OF_RESOURCES
;
580 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
581 if (FormPackage
->IfrData
== NULL
) {
582 FreePool (FormPackage
);
583 return EFI_OUT_OF_RESOURCES
;
586 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
588 // Copy Package Header
590 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
596 FormPackage
->IfrData
,
597 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
598 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
601 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
602 *Package
= FormPackage
;
604 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
605 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
612 This function exports Form packages to a buffer.
613 This is a internal function.
615 @param Private Hii database private structure.
616 @param Handle Identification of a package list.
617 @param PackageList Pointer to a package list which will be exported.
618 @param UsedSize The length of buffer be used.
619 @param BufferSize Length of the Buffer.
620 @param Buffer Allocated space for storing exported data.
621 @param ResultSize The size of the already exported content of this
624 @retval EFI_SUCCESS Form Packages are exported successfully.
625 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
630 IN HII_DATABASE_PRIVATE_DATA
*Private
,
631 IN EFI_HII_HANDLE Handle
,
632 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
636 IN OUT UINTN
*ResultSize
639 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
644 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
645 return EFI_INVALID_PARAMETER
;
648 if (BufferSize
> 0 && Buffer
== NULL
) {
649 return EFI_INVALID_PARAMETER
;
653 Status
= EFI_SUCCESS
;
656 // Export Form packages.
658 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
659 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
660 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
661 if ((Buffer
!= NULL
) && (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
)) {
663 // Invoke registered notification if exists
665 Status
= InvokeRegisteredFunction (
667 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
668 (VOID
*) FormPackage
,
669 EFI_HII_PACKAGE_FORMS
,
672 ASSERT_EFI_ERROR (Status
);
674 // Copy the Form package content.
676 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
677 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
680 (VOID
*) FormPackage
->IfrData
,
681 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
683 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
687 *ResultSize
+= PackageLength
;
695 This function deletes all Form packages from a package list node.
696 This is a internal function.
698 @param Private Hii database private data.
699 @param Handle Handle of the package list which contains the to
700 be removed Form packages.
701 @param PackageList Pointer to a package list that contains removing
704 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
705 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
710 IN HII_DATABASE_PRIVATE_DATA
*Private
,
711 IN EFI_HII_HANDLE Handle
,
712 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
715 LIST_ENTRY
*ListHead
;
716 HII_IFR_PACKAGE_INSTANCE
*Package
;
719 ListHead
= &PackageList
->FormPkgHdr
;
721 while (!IsListEmpty (ListHead
)) {
723 ListHead
->ForwardLink
,
724 HII_IFR_PACKAGE_INSTANCE
,
726 HII_IFR_PACKAGE_SIGNATURE
728 Status
= InvokeRegisteredFunction (
730 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
732 EFI_HII_PACKAGE_FORMS
,
735 if (EFI_ERROR (Status
)) {
739 RemoveEntryList (&Package
->IfrEntry
);
740 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
741 FreePool (Package
->IfrData
);
752 This function insert a String package to a package list node.
753 This is a internal function.
755 @param Private Hii database private structure.
756 @param PackageHdr Pointer to a buffer stored with String package
758 @param NotifyType The type of change concerning the database.
759 @param PackageList Pointer to a package list which will be inserted
761 @param Package Created String package
763 @retval EFI_SUCCESS String Package is inserted successfully.
764 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
766 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
767 @retval EFI_UNSUPPORTED A string package with the same language already
768 exists in current package list.
772 InsertStringPackage (
773 IN HII_DATABASE_PRIVATE_DATA
*Private
,
775 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
776 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
777 OUT HII_STRING_PACKAGE_INSTANCE
**Package
780 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
783 EFI_HII_PACKAGE_HEADER PackageHeader
;
788 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
789 return EFI_INVALID_PARAMETER
;
791 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
792 return EFI_INVALID_PARAMETER
;
795 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
796 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
799 // It is illegal to have two string packages with same language within one packagelist
800 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
802 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
803 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
804 if (Language
== NULL
) {
805 return EFI_OUT_OF_RESOURCES
;
807 AsciiStrCpy (Language
, (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
808 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
809 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
810 if (HiiCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
812 return EFI_UNSUPPORTED
;
818 // Create a String package node
820 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
821 if (StringPackage
== NULL
) {
822 Status
= EFI_OUT_OF_RESOURCES
;
826 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
827 if (StringPackage
->StringPkgHdr
== NULL
) {
828 Status
= EFI_OUT_OF_RESOURCES
;
832 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
833 if (StringPackage
->StringBlock
== NULL
) {
834 Status
= EFI_OUT_OF_RESOURCES
;
838 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
839 StringPackage
->FontId
= 0;
840 InitializeListHead (&StringPackage
->FontInfoList
);
843 // Copy the String package header.
845 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
848 // Copy the String blocks
851 StringPackage
->StringBlock
,
852 (UINT8
*) PackageHdr
+ HeaderSize
,
853 PackageHeader
.Length
- HeaderSize
857 // Collect all font block info
859 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, &StringPackage
->MaxStringId
);
860 if (EFI_ERROR (Status
)) {
865 // Insert to String package array
867 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
868 *Package
= StringPackage
;
870 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
871 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
878 if (StringPackage
!= NULL
) {
879 if (StringPackage
->StringBlock
!= NULL
) {
880 FreePool (StringPackage
->StringBlock
);
882 if (StringPackage
->StringPkgHdr
!= NULL
) {
883 FreePool (StringPackage
->StringPkgHdr
);
885 FreePool (StringPackage
);
892 Adjust all string packages in a single package list to have the same max string ID.
894 @param PackageList Pointer to a package list which will be adjusted.
896 @retval EFI_SUCCESS Adjust all string packages successfully.
897 @retval others Can't adjust string packges.
901 AdjustStringPackage (
902 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
906 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
907 UINT32 Skip2BlockSize
;
911 EFI_STRING_ID MaxStringId
;
915 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
916 Link
!= &PackageList
->StringPkgHdr
;
917 Link
= Link
->ForwardLink
919 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
920 if (MaxStringId
< StringPackage
->MaxStringId
) {
921 MaxStringId
= StringPackage
->MaxStringId
;
925 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
;
926 Link
!= &PackageList
->StringPkgHdr
;
927 Link
= Link
->ForwardLink
929 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
930 if (StringPackage
->MaxStringId
< MaxStringId
) {
931 OldBlockSize
= StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
933 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.
935 SkipCount
= (UINT16
) (MaxStringId
- StringPackage
->MaxStringId
);
936 Skip2BlockSize
= (UINT32
) sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
938 StringBlock
= (UINT8
*) AllocateZeroPool (OldBlockSize
+ Skip2BlockSize
);
939 if (StringBlock
== NULL
) {
940 return EFI_OUT_OF_RESOURCES
;
943 // Copy original string blocks, except the EFI_HII_SIBT_END.
945 CopyMem (StringBlock
, StringPackage
->StringBlock
, OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
));
947 // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks
949 BlockPtr
= StringBlock
+ OldBlockSize
- sizeof (EFI_HII_SIBT_END_BLOCK
);
950 *BlockPtr
= EFI_HII_SIBT_SKIP2
;
951 CopyMem (BlockPtr
+ 1, &SkipCount
, sizeof (UINT16
));
952 BlockPtr
+= sizeof (EFI_HII_SIBT_SKIP2_BLOCK
);
955 // Append a EFI_HII_SIBT_END block to the end.
957 *BlockPtr
= EFI_HII_SIBT_END
;
958 FreePool (StringPackage
->StringBlock
);
959 StringPackage
->StringBlock
= StringBlock
;
960 StringPackage
->StringPkgHdr
->Header
.Length
+= Skip2BlockSize
;
961 PackageList
->PackageListHdr
.PackageLength
+= Skip2BlockSize
;
962 StringPackage
->MaxStringId
= MaxStringId
;
970 This function exports String packages to a buffer.
971 This is a internal function.
973 @param Private Hii database private structure.
974 @param Handle Identification of a package list.
975 @param PackageList Pointer to a package list which will be exported.
976 @param UsedSize The length of buffer be used.
977 @param BufferSize Length of the Buffer.
978 @param Buffer Allocated space for storing exported data.
979 @param ResultSize The size of the already exported content of this
982 @retval EFI_SUCCESS String Packages are exported successfully.
983 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
987 ExportStringPackages (
988 IN HII_DATABASE_PRIVATE_DATA
*Private
,
989 IN EFI_HII_HANDLE Handle
,
990 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
994 IN OUT UINTN
*ResultSize
1000 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
1002 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1003 return EFI_INVALID_PARAMETER
;
1006 if (BufferSize
> 0 && Buffer
== NULL
) {
1007 return EFI_INVALID_PARAMETER
;
1011 Status
= EFI_SUCCESS
;
1013 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
1014 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
1015 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
1016 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1018 // Invoke registered notification function with EXPORT_PACK notify type
1020 Status
= InvokeRegisteredFunction (
1022 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1023 (VOID
*) StringPackage
,
1024 EFI_HII_PACKAGE_STRINGS
,
1027 ASSERT_EFI_ERROR (Status
);
1029 // Copy String package header
1031 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
1032 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
1035 // Copy String blocks information
1039 StringPackage
->StringBlock
,
1040 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
1042 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
1046 *ResultSize
+= PackageLength
;
1052 This function deletes all String packages from a package list node.
1053 This is a internal function.
1055 @param Private Hii database private data.
1056 @param Handle Handle of the package list which contains the to
1057 be removed String packages.
1058 @param PackageList Pointer to a package list that contains removing
1061 @retval EFI_SUCCESS String Package(s) is deleted successfully.
1062 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1066 RemoveStringPackages (
1067 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1068 IN EFI_HII_HANDLE Handle
,
1069 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1072 LIST_ENTRY
*ListHead
;
1073 HII_STRING_PACKAGE_INSTANCE
*Package
;
1074 HII_FONT_INFO
*FontInfo
;
1077 ListHead
= &PackageList
->StringPkgHdr
;
1079 while (!IsListEmpty (ListHead
)) {
1081 ListHead
->ForwardLink
,
1082 HII_STRING_PACKAGE_INSTANCE
,
1084 HII_STRING_PACKAGE_SIGNATURE
1086 Status
= InvokeRegisteredFunction (
1088 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1090 EFI_HII_PACKAGE_STRINGS
,
1093 if (EFI_ERROR (Status
)) {
1097 RemoveEntryList (&Package
->StringEntry
);
1098 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1099 FreePool (Package
->StringBlock
);
1100 FreePool (Package
->StringPkgHdr
);
1102 // Delete font information
1104 while (!IsListEmpty (&Package
->FontInfoList
)) {
1106 Package
->FontInfoList
.ForwardLink
,
1109 HII_FONT_INFO_SIGNATURE
1111 RemoveEntryList (&FontInfo
->Entry
);
1112 FreePool (FontInfo
);
1123 This function insert a Font package to a package list node.
1124 This is a internal function.
1126 @param Private Hii database private structure.
1127 @param PackageHdr Pointer to a buffer stored with Font package
1129 @param NotifyType The type of change concerning the database.
1130 @param PackageList Pointer to a package list which will be inserted
1132 @param Package Created Font package
1134 @retval EFI_SUCCESS Font Package is inserted successfully.
1135 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1137 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1138 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1139 exists in current hii database.
1144 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1145 IN VOID
*PackageHdr
,
1146 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1147 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1148 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1151 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1152 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1155 EFI_HII_PACKAGE_HEADER PackageHeader
;
1156 EFI_FONT_INFO
*FontInfo
;
1157 UINT32 FontInfoSize
;
1158 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1160 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1161 return EFI_INVALID_PARAMETER
;
1164 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1165 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1172 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1173 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1174 // attributes and identify a font uniquely.
1176 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1177 if (FontPkgHdr
== NULL
) {
1178 Status
= EFI_OUT_OF_RESOURCES
;
1181 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1183 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1184 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1185 if (FontInfo
== NULL
) {
1186 Status
= EFI_OUT_OF_RESOURCES
;
1189 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1190 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1191 StrCpy (FontInfo
->FontName
, FontPkgHdr
->FontFamily
);
1193 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1194 Status
= EFI_UNSUPPORTED
;
1199 // Create a Font package node
1201 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1202 if (FontPackage
== NULL
) {
1203 Status
= EFI_OUT_OF_RESOURCES
;
1206 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1207 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1208 InitializeListHead (&FontPackage
->GlyphInfoList
);
1210 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1211 if (FontPackage
->GlyphBlock
== NULL
) {
1212 Status
= EFI_OUT_OF_RESOURCES
;
1215 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1218 // Collect all default character cell information and backup in GlyphInfoList.
1220 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1221 if (EFI_ERROR (Status
)) {
1226 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1229 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1230 if (GlobalFont
== NULL
) {
1231 Status
= EFI_OUT_OF_RESOURCES
;
1234 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1235 GlobalFont
->FontPackage
= FontPackage
;
1236 GlobalFont
->FontInfoSize
= FontInfoSize
;
1237 GlobalFont
->FontInfo
= FontInfo
;
1238 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1241 // Insert this font package to Font package array
1243 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1244 *Package
= FontPackage
;
1246 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1247 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1254 if (FontPkgHdr
!= NULL
) {
1255 FreePool (FontPkgHdr
);
1257 if (FontInfo
!= NULL
) {
1258 FreePool (FontInfo
);
1260 if (FontPackage
!= NULL
) {
1261 if (FontPackage
->GlyphBlock
!= NULL
) {
1262 FreePool (FontPackage
->GlyphBlock
);
1264 FreePool (FontPackage
);
1266 if (GlobalFont
!= NULL
) {
1267 FreePool (GlobalFont
);
1276 This function exports Font packages to a buffer.
1277 This is a internal function.
1279 @param Private Hii database private structure.
1280 @param Handle Identification of a package list.
1281 @param PackageList Pointer to a package list which will be exported.
1282 @param UsedSize The length of buffer be used.
1283 @param BufferSize Length of the Buffer.
1284 @param Buffer Allocated space for storing exported data.
1285 @param ResultSize The size of the already exported content of this
1288 @retval EFI_SUCCESS Font Packages are exported successfully.
1289 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1293 ExportFontPackages (
1294 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1295 IN EFI_HII_HANDLE Handle
,
1296 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1298 IN UINTN BufferSize
,
1299 IN OUT VOID
*Buffer
,
1300 IN OUT UINTN
*ResultSize
1304 UINTN PackageLength
;
1306 HII_FONT_PACKAGE_INSTANCE
*Package
;
1309 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1310 return EFI_INVALID_PARAMETER
;
1313 if (BufferSize
> 0 && Buffer
== NULL
) {
1314 return EFI_INVALID_PARAMETER
;
1318 Status
= EFI_SUCCESS
;
1320 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1321 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1322 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1323 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1325 // Invoke registered notification function with EXPORT_PACK notify type
1327 Status
= InvokeRegisteredFunction (
1329 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1331 EFI_HII_PACKAGE_FONTS
,
1334 ASSERT_EFI_ERROR (Status
);
1336 // Copy Font package header
1338 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1339 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1342 // Copy Glyph blocks information
1346 Package
->GlyphBlock
,
1347 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1349 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1353 *ResultSize
+= PackageLength
;
1359 This function deletes all Font packages from a package list node.
1360 This is a internal function.
1362 @param Private Hii database private data.
1363 @param Handle Handle of the package list which contains the to
1364 be removed Font packages.
1365 @param PackageList Pointer to a package list that contains removing
1368 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1369 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1373 RemoveFontPackages (
1374 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1375 IN EFI_HII_HANDLE Handle
,
1376 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1379 LIST_ENTRY
*ListHead
;
1380 HII_FONT_PACKAGE_INSTANCE
*Package
;
1382 HII_GLYPH_INFO
*GlyphInfo
;
1384 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1386 ListHead
= &PackageList
->FontPkgHdr
;
1388 while (!IsListEmpty (ListHead
)) {
1390 ListHead
->ForwardLink
,
1391 HII_FONT_PACKAGE_INSTANCE
,
1393 HII_FONT_PACKAGE_SIGNATURE
1395 Status
= InvokeRegisteredFunction (
1397 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1399 EFI_HII_PACKAGE_FONTS
,
1402 if (EFI_ERROR (Status
)) {
1406 RemoveEntryList (&Package
->FontEntry
);
1407 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1409 if (Package
->GlyphBlock
!= NULL
) {
1410 FreePool (Package
->GlyphBlock
);
1412 FreePool (Package
->FontPkgHdr
);
1414 // Delete default character cell information
1416 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1418 Package
->GlyphInfoList
.ForwardLink
,
1421 HII_GLYPH_INFO_SIGNATURE
1423 RemoveEntryList (&GlyphInfo
->Entry
);
1424 FreePool (GlyphInfo
);
1428 // Remove corresponding global font info
1430 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1431 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1432 if (GlobalFont
->FontPackage
== Package
) {
1433 RemoveEntryList (&GlobalFont
->Entry
);
1434 FreePool (GlobalFont
->FontInfo
);
1435 FreePool (GlobalFont
);
1448 This function insert a Image package to a package list node.
1449 This is a internal function.
1451 @param PackageHdr Pointer to a buffer stored with Image package
1453 @param NotifyType The type of change concerning the database.
1454 @param PackageList Pointer to a package list which will be inserted
1456 @param Package Created Image package
1458 @retval EFI_SUCCESS Image Package is inserted successfully.
1459 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1461 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1465 InsertImagePackage (
1466 IN VOID
*PackageHdr
,
1467 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1468 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1469 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1472 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1476 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1477 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1478 UINT32 PaletteInfoOffset
;
1479 UINT32 ImageInfoOffset
;
1482 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1483 return EFI_INVALID_PARAMETER
;
1487 // Less than one image package is allowed in one package list.
1489 if (PackageList
->ImagePkg
!= NULL
) {
1490 return EFI_INVALID_PARAMETER
;
1494 // Create a Image package node
1496 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1497 if (ImagePackage
== NULL
) {
1498 return EFI_OUT_OF_RESOURCES
;
1502 // Copy the Image package header.
1504 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1506 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1507 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1510 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1513 ImagePackage
->PaletteBlock
= NULL
;
1514 if (PaletteInfoOffset
!= 0) {
1515 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1516 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1517 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1519 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1520 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1521 CurrentSize
+= sizeof (UINT16
);
1522 PaletteSize
+= (UINT32
) CurrentSize
;
1523 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1526 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1527 if (ImagePackage
->PaletteBlock
== NULL
) {
1528 FreePool (ImagePackage
);
1529 return EFI_OUT_OF_RESOURCES
;
1532 ImagePackage
->PaletteBlock
,
1533 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1539 // If ImageInfoOffset is zero, there are no images in this package.
1542 ImagePackage
->ImageBlock
= NULL
;
1543 if (ImageInfoOffset
!= 0) {
1544 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1545 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1546 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1547 if (ImagePackage
->ImageBlock
== NULL
) {
1548 FreePool (ImagePackage
->PaletteBlock
);
1549 FreePool (ImagePackage
);
1550 return EFI_OUT_OF_RESOURCES
;
1553 ImagePackage
->ImageBlock
,
1554 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1559 ImagePackage
->ImageBlockSize
= ImageSize
;
1560 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1561 PackageList
->ImagePkg
= ImagePackage
;
1562 *Package
= ImagePackage
;
1564 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1565 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1573 This function exports Image packages to a buffer.
1574 This is a internal function.
1576 @param Private Hii database private structure.
1577 @param Handle Identification of a package list.
1578 @param PackageList Pointer to a package list which will be exported.
1579 @param UsedSize The length of buffer be used.
1580 @param BufferSize Length of the Buffer.
1581 @param Buffer Allocated space for storing exported data.
1582 @param ResultSize The size of the already exported content of this
1585 @retval EFI_SUCCESS Image Packages are exported successfully.
1586 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1590 ExportImagePackages (
1591 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1592 IN EFI_HII_HANDLE Handle
,
1593 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1595 IN UINTN BufferSize
,
1596 IN OUT VOID
*Buffer
,
1597 IN OUT UINTN
*ResultSize
1600 UINTN PackageLength
;
1602 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1605 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1606 return EFI_INVALID_PARAMETER
;
1609 if (BufferSize
> 0 && Buffer
== NULL
) {
1610 return EFI_INVALID_PARAMETER
;
1613 Package
= PackageList
->ImagePkg
;
1615 if (Package
== NULL
) {
1619 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1621 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1623 // Invoke registered notification function with EXPORT_PACK notify type
1625 Status
= InvokeRegisteredFunction (
1627 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1629 EFI_HII_PACKAGE_IMAGES
,
1632 ASSERT_EFI_ERROR (Status
);
1633 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1634 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1636 // Copy Image package header,
1637 // then justify the offset for image info and palette info in the header.
1639 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1640 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1643 // Copy Image blocks information
1645 if (Package
->ImageBlockSize
!= 0) {
1646 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1647 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1650 // Copy Palette information
1652 if (Package
->PaletteInfoSize
!= 0) {
1653 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1654 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1658 *ResultSize
+= PackageLength
;
1664 This function deletes Image package from a package list node.
1665 This is a internal function.
1667 @param Private Hii database private data.
1668 @param Handle Handle of the package list which contains the to
1669 be removed Image packages.
1670 @param PackageList Package List which contains the to be removed
1673 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1674 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1678 RemoveImagePackages (
1679 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1680 IN EFI_HII_HANDLE Handle
,
1681 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1684 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1687 Package
= PackageList
->ImagePkg
;
1690 // Image package does not exist, return directly.
1692 if (Package
== NULL
) {
1696 Status
= InvokeRegisteredFunction (
1698 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1700 EFI_HII_PACKAGE_IMAGES
,
1703 if (EFI_ERROR (Status
)) {
1707 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1709 FreePool (Package
->ImageBlock
);
1710 if (Package
->PaletteBlock
!= NULL
) {
1711 FreePool (Package
->PaletteBlock
);
1715 PackageList
->ImagePkg
= NULL
;
1722 This function insert a Simple Font package to a package list node.
1723 This is a internal function.
1725 @param PackageHdr Pointer to a buffer stored with Simple Font
1726 package information.
1727 @param NotifyType The type of change concerning the database.
1728 @param PackageList Pointer to a package list which will be inserted
1730 @param Package Created Simple Font package
1732 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1733 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1734 Simple Font package.
1735 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1739 InsertSimpleFontPackage (
1740 IN VOID
*PackageHdr
,
1741 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1742 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1743 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1746 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1748 EFI_HII_PACKAGE_HEADER Header
;
1750 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1751 return EFI_INVALID_PARAMETER
;
1755 // Create a Simple Font package node
1757 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1758 if (SimpleFontPackage
== NULL
) {
1759 Status
= EFI_OUT_OF_RESOURCES
;
1762 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1765 // Copy the Simple Font package.
1767 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1769 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1770 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1771 Status
= EFI_OUT_OF_RESOURCES
;
1775 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1778 // Insert to Simple Font package array
1780 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1781 *Package
= SimpleFontPackage
;
1783 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1784 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1791 if (SimpleFontPackage
!= NULL
) {
1792 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1793 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1795 FreePool (SimpleFontPackage
);
1802 This function exports SimpleFont packages to a buffer.
1803 This is a internal function.
1805 @param Private Hii database private structure.
1806 @param Handle Identification of a package list.
1807 @param PackageList Pointer to a package list which will be exported.
1808 @param UsedSize The length of buffer be used.
1809 @param BufferSize Length of the Buffer.
1810 @param Buffer Allocated space for storing exported data.
1811 @param ResultSize The size of the already exported content of this
1814 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1815 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1819 ExportSimpleFontPackages (
1820 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1821 IN EFI_HII_HANDLE Handle
,
1822 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1824 IN UINTN BufferSize
,
1825 IN OUT VOID
*Buffer
,
1826 IN OUT UINTN
*ResultSize
1830 UINTN PackageLength
;
1832 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1834 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1835 return EFI_INVALID_PARAMETER
;
1838 if (BufferSize
> 0 && Buffer
== NULL
) {
1839 return EFI_INVALID_PARAMETER
;
1843 Status
= EFI_SUCCESS
;
1845 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1846 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1847 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1848 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1850 // Invoke registered notification function with EXPORT_PACK notify type
1852 Status
= InvokeRegisteredFunction (
1854 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1856 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1859 ASSERT_EFI_ERROR (Status
);
1862 // Copy SimpleFont package
1864 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1865 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1869 *ResultSize
+= PackageLength
;
1875 This function deletes all Simple Font packages from a package list node.
1876 This is a internal function.
1878 @param Private Hii database private data.
1879 @param Handle Handle of the package list which contains the to
1880 be removed Simple Font packages.
1881 @param PackageList Pointer to a package list that contains removing
1884 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1885 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1889 RemoveSimpleFontPackages (
1890 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1891 IN EFI_HII_HANDLE Handle
,
1892 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1895 LIST_ENTRY
*ListHead
;
1896 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1899 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1901 while (!IsListEmpty (ListHead
)) {
1903 ListHead
->ForwardLink
,
1904 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1906 HII_S_FONT_PACKAGE_SIGNATURE
1908 Status
= InvokeRegisteredFunction (
1910 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1912 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1915 if (EFI_ERROR (Status
)) {
1919 RemoveEntryList (&Package
->SimpleFontEntry
);
1920 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1921 FreePool (Package
->SimpleFontPkgHdr
);
1930 This function insert a Device path package to a package list node.
1931 This is a internal function.
1933 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1935 @param NotifyType The type of change concerning the database.
1936 @param PackageList Pointer to a package list which will be inserted
1939 @retval EFI_SUCCESS Device path Package is inserted successfully.
1940 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1941 Device path package.
1942 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1946 InsertDevicePathPackage (
1947 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1948 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1949 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1952 UINT32 PackageLength
;
1953 EFI_HII_PACKAGE_HEADER Header
;
1955 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1956 return EFI_INVALID_PARAMETER
;
1959 // Less than one device path package is allowed in one package list.
1961 if (PackageList
->DevicePathPkg
!= NULL
) {
1962 return EFI_INVALID_PARAMETER
;
1965 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1966 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1967 if (PackageList
->DevicePathPkg
== NULL
) {
1968 return EFI_OUT_OF_RESOURCES
;
1971 Header
.Length
= PackageLength
;
1972 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1973 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1975 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1977 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1981 // Since Device Path package is created by NewPackageList, either NEW_PACK
1982 // or ADD_PACK should increase the length of package list.
1984 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1990 This function exports device path package to a buffer.
1991 This is a internal function.
1993 @param Private Hii database private structure.
1994 @param Handle Identification of a package list.
1995 @param PackageList Pointer to a package list which will be exported.
1996 @param UsedSize The length of buffer be used.
1997 @param BufferSize Length of the Buffer.
1998 @param Buffer Allocated space for storing exported data.
1999 @param ResultSize The size of the already exported content of this
2002 @retval EFI_SUCCESS Device path Package is exported successfully.
2003 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2007 ExportDevicePathPackage (
2008 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2009 IN EFI_HII_HANDLE Handle
,
2010 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2012 IN UINTN BufferSize
,
2013 IN OUT VOID
*Buffer
,
2014 IN OUT UINTN
*ResultSize
2019 EFI_HII_PACKAGE_HEADER Header
;
2021 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2022 return EFI_INVALID_PARAMETER
;
2024 if (BufferSize
> 0 && Buffer
== NULL
) {
2025 return EFI_INVALID_PARAMETER
;
2028 Package
= PackageList
->DevicePathPkg
;
2030 if (Package
== NULL
) {
2034 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2036 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2038 // Invoke registered notification function with EXPORT_PACK notify type
2040 Status
= InvokeRegisteredFunction (
2042 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2044 EFI_HII_PACKAGE_DEVICE_PATH
,
2047 ASSERT_EFI_ERROR (Status
);
2050 // Copy Device path package
2052 CopyMem (Buffer
, Package
, Header
.Length
);
2055 *ResultSize
+= Header
.Length
;
2061 This function deletes Device Path package from a package list node.
2062 This is a internal function.
2064 @param Private Hii database private data.
2065 @param Handle Handle of the package list.
2066 @param PackageList Package List which contains the to be removed
2067 Device Path package.
2069 @retval EFI_SUCCESS Device Path Package is deleted successfully.
2070 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2074 RemoveDevicePathPackage (
2075 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2076 IN EFI_HII_HANDLE Handle
,
2077 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2082 EFI_HII_PACKAGE_HEADER Header
;
2084 Package
= PackageList
->DevicePathPkg
;
2087 // No device path, return directly.
2089 if (Package
== NULL
) {
2093 Status
= InvokeRegisteredFunction (
2095 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2097 EFI_HII_PACKAGE_DEVICE_PATH
,
2100 if (EFI_ERROR (Status
)) {
2104 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2105 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2109 PackageList
->DevicePathPkg
= NULL
;
2116 This function will insert a device path package to package list firstly then
2117 invoke notification functions if any.
2118 This is a internal function.
2120 @param Private Hii database private structure.
2121 @param NotifyType The type of change concerning the database.
2122 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2124 @param DatabaseRecord Pointer to a database record contains a package
2125 list which will be inserted to.
2127 @retval EFI_SUCCESS Device path Package is inserted successfully.
2128 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2129 Device path package.
2130 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2134 AddDevicePathPackage (
2135 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2136 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2137 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2138 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2143 if (DevicePath
== NULL
) {
2147 ASSERT (Private
!= NULL
);
2148 ASSERT (DatabaseRecord
!= NULL
);
2151 // Create a device path package and insert to packagelist
2153 Status
= InsertDevicePathPackage (
2156 DatabaseRecord
->PackageList
2158 if (EFI_ERROR (Status
)) {
2162 return InvokeRegisteredFunction (
2165 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2166 EFI_HII_PACKAGE_DEVICE_PATH
,
2167 DatabaseRecord
->Handle
2173 This function insert a Keyboard Layout package to a package list node.
2174 This is a internal function.
2176 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2177 package information.
2178 @param NotifyType The type of change concerning the database.
2179 @param PackageList Pointer to a package list which will be inserted
2181 @param Package Created Keyboard Layout package
2183 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2184 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2185 Keyboard Layout package.
2186 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2190 InsertKeyboardLayoutPackage (
2191 IN VOID
*PackageHdr
,
2192 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2193 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2194 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2197 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2198 EFI_HII_PACKAGE_HEADER PackageHeader
;
2201 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2202 return EFI_INVALID_PARAMETER
;
2205 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2208 // Create a Keyboard Layout package node
2210 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2211 if (KeyboardLayoutPackage
== NULL
) {
2212 Status
= EFI_OUT_OF_RESOURCES
;
2215 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2217 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2218 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2219 Status
= EFI_OUT_OF_RESOURCES
;
2223 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2224 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2226 *Package
= KeyboardLayoutPackage
;
2228 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2229 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2237 if (KeyboardLayoutPackage
!= NULL
) {
2238 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2239 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2241 FreePool (KeyboardLayoutPackage
);
2249 This function exports Keyboard Layout packages to a buffer.
2250 This is a internal function.
2252 @param Private Hii database private structure.
2253 @param Handle Identification of a package list.
2254 @param PackageList Pointer to a package list which will be exported.
2255 @param UsedSize The length of buffer be used.
2256 @param BufferSize Length of the Buffer.
2257 @param Buffer Allocated space for storing exported data.
2258 @param ResultSize The size of the already exported content of this
2261 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2263 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2267 ExportKeyboardLayoutPackages (
2268 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2269 IN EFI_HII_HANDLE Handle
,
2270 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2272 IN UINTN BufferSize
,
2273 IN OUT VOID
*Buffer
,
2274 IN OUT UINTN
*ResultSize
2278 UINTN PackageLength
;
2280 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2281 EFI_HII_PACKAGE_HEADER PackageHeader
;
2283 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2284 return EFI_INVALID_PARAMETER
;
2287 if (BufferSize
> 0 && Buffer
== NULL
) {
2288 return EFI_INVALID_PARAMETER
;
2292 Status
= EFI_SUCCESS
;
2294 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2295 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2296 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2297 PackageLength
+= PackageHeader
.Length
;
2298 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2300 // Invoke registered notification function with EXPORT_PACK notify type
2302 Status
= InvokeRegisteredFunction (
2304 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2305 (EFI_HII_PACKAGE_HEADER
*) Package
,
2306 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2309 ASSERT_EFI_ERROR (Status
);
2312 // Copy Keyboard Layout package
2314 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2315 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2319 *ResultSize
+= PackageLength
;
2325 This function deletes all Keyboard Layout packages from a package list node.
2326 This is a internal function.
2328 @param Private Hii database private data.
2329 @param Handle Handle of the package list which contains the to
2330 be removed Keyboard Layout packages.
2331 @param PackageList Pointer to a package list that contains removing
2334 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2336 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2340 RemoveKeyboardLayoutPackages (
2341 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2342 IN EFI_HII_HANDLE Handle
,
2343 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2346 LIST_ENTRY
*ListHead
;
2347 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2348 EFI_HII_PACKAGE_HEADER PackageHeader
;
2351 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2353 while (!IsListEmpty (ListHead
)) {
2355 ListHead
->ForwardLink
,
2356 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2358 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2360 Status
= InvokeRegisteredFunction (
2362 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2364 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2367 if (EFI_ERROR (Status
)) {
2371 RemoveEntryList (&Package
->KeyboardEntry
);
2372 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2373 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2374 FreePool (Package
->KeyboardPkg
);
2383 This function will insert a package list to hii database firstly then
2384 invoke notification functions if any. It is the worker function of
2385 HiiNewPackageList and HiiUpdatePackageList.
2387 This is a internal function.
2389 @param Private Hii database private structure.
2390 @param NotifyType The type of change concerning the database.
2391 @param PackageList Pointer to a package list.
2392 @param DatabaseRecord Pointer to a database record contains a package
2393 list instance which will be inserted to.
2395 @retval EFI_SUCCESS All incoming packages are inserted to current
2397 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2398 Device path package.
2399 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2404 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2405 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2406 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2407 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2411 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2412 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2413 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2414 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2415 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2416 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2417 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2418 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2419 EFI_HII_PACKAGE_HEADER PackageHeader
;
2420 UINT32 OldPackageListLen
;
2421 BOOLEAN StringPkgIsAdd
;
2424 // Initialize Variables
2426 StringPkgIsAdd
= FALSE
;
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 Status
= InvokeRegisteredFunction (
2517 (VOID
*) StringPackage
,
2518 (UINT8
) (PackageHeader
.Type
),
2519 DatabaseRecord
->Handle
2521 StringPkgIsAdd
= TRUE
;
2523 case EFI_HII_PACKAGE_FONTS
:
2524 Status
= InsertFontPackage (
2528 DatabaseRecord
->PackageList
,
2531 if (EFI_ERROR (Status
)) {
2534 Status
= InvokeRegisteredFunction (
2537 (VOID
*) FontPackage
,
2538 (UINT8
) (PackageHeader
.Type
),
2539 DatabaseRecord
->Handle
2542 case EFI_HII_PACKAGE_IMAGES
:
2543 Status
= InsertImagePackage (
2546 DatabaseRecord
->PackageList
,
2549 if (EFI_ERROR (Status
)) {
2552 Status
= InvokeRegisteredFunction (
2555 (VOID
*) ImagePackage
,
2556 (UINT8
) (PackageHeader
.Type
),
2557 DatabaseRecord
->Handle
2560 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2561 Status
= InsertSimpleFontPackage (
2564 DatabaseRecord
->PackageList
,
2567 if (EFI_ERROR (Status
)) {
2570 Status
= InvokeRegisteredFunction (
2573 (VOID
*) SimpleFontPackage
,
2574 (UINT8
) (PackageHeader
.Type
),
2575 DatabaseRecord
->Handle
2578 case EFI_HII_PACKAGE_DEVICE_PATH
:
2579 Status
= AddDevicePathPackage (
2582 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2590 if (EFI_ERROR (Status
)) {
2594 // goto header of next package
2596 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2597 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2601 // Adjust String Package to make sure all string packages have the same max string ID.
2603 if (!EFI_ERROR (Status
) && StringPkgIsAdd
) {
2604 Status
= AdjustStringPackage (DatabaseRecord
->PackageList
);
2612 This function exports a package list to a buffer. It is the worker function
2613 of HiiExportPackageList.
2615 This is a internal function.
2617 @param Private Hii database private structure.
2618 @param Handle Identification of a package list.
2619 @param PackageList Pointer to a package list which will be exported.
2620 @param UsedSize The length of buffer has been used by exporting
2621 package lists when Handle is NULL.
2622 @param BufferSize Length of the Buffer.
2623 @param Buffer Allocated space for storing exported data.
2625 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2627 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2632 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2633 IN EFI_HII_HANDLE Handle
,
2634 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2635 IN OUT UINTN
*UsedSize
,
2636 IN UINTN BufferSize
,
2637 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2642 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2644 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
2645 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2646 ASSERT (IsHiiHandleValid (Handle
));
2648 if (BufferSize
> 0 && Buffer
== NULL
) {
2649 return EFI_INVALID_PARAMETER
;
2653 // Copy the package list header
2654 // ResultSize indicates the length of the exported bytes of this package list
2656 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2657 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2658 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2661 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2663 Status
= ExportGuidPackages (
2669 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2672 if (EFI_ERROR (Status
)) {
2675 Status
= ExportFormPackages (
2681 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2684 if (EFI_ERROR (Status
)) {
2687 Status
= ExportKeyboardLayoutPackages (
2693 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2696 if (EFI_ERROR (Status
)) {
2699 Status
= ExportStringPackages (
2705 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2708 if (EFI_ERROR (Status
)) {
2711 Status
= ExportFontPackages (
2717 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2720 if (EFI_ERROR (Status
)) {
2723 Status
= ExportImagePackages (
2729 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2732 if (EFI_ERROR (Status
)) {
2735 Status
= ExportSimpleFontPackages (
2741 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2744 if (EFI_ERROR (Status
)) {
2747 Status
= ExportDevicePathPackage (
2753 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2756 if (EFI_ERROR (Status
)) {
2760 // Append the package list end.
2762 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2763 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2764 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2766 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2767 (VOID
*) &EndofPackageList
,
2768 sizeof (EFI_HII_PACKAGE_HEADER
)
2772 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2779 This function adds the packages in the package list to the database and returns a handle. If there is a
2780 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2781 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2783 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2785 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2787 @param DriverHandle Associate the package list with this EFI handle.
2788 If a NULL is specified, this data will not be associate
2789 with any drivers and cannot have a callback induced.
2790 @param Handle A pointer to the EFI_HII_HANDLE instance.
2792 @retval EFI_SUCCESS The package list associated with the Handle was
2793 added to the HII database.
2794 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2796 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2797 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2803 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2804 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2805 IN CONST EFI_HANDLE DriverHandle
, OPTIONAL
2806 OUT EFI_HII_HANDLE
*Handle
2810 HII_DATABASE_PRIVATE_DATA
*Private
;
2811 HII_DATABASE_RECORD
*DatabaseRecord
;
2812 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2814 EFI_GUID PackageListGuid
;
2816 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2817 return EFI_INVALID_PARAMETER
;
2820 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2821 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2824 // Check the Package list GUID to guarantee this GUID is unique in database.
2826 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2827 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2829 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2830 &PackageListGuid
) &&
2831 DatabaseRecord
->DriverHandle
== DriverHandle
) {
2832 return EFI_INVALID_PARAMETER
;
2837 // Build a PackageList node
2839 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2840 if (EFI_ERROR (Status
)) {
2845 // Fill in information of the created Package List node
2846 // according to incoming package list.
2848 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2849 if (EFI_ERROR (Status
)) {
2853 DatabaseRecord
->DriverHandle
= DriverHandle
;
2856 // Create a Device path package and add into the package list if exists.
2858 Status
= gBS
->HandleProtocol (
2860 &gEfiDevicePathProtocolGuid
,
2861 (VOID
**) &DevicePath
2863 if (!EFI_ERROR (Status
)) {
2864 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2865 ASSERT_EFI_ERROR (Status
);
2868 *Handle
= DatabaseRecord
->Handle
;
2874 This function removes the package list that is associated with a handle Handle
2875 from the HII database. Before removing the package, any registered functions
2876 with the notification type REMOVE_PACK and the same package type will be called.
2878 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2880 @param Handle The handle that was registered to the data that is
2881 requested for removal.
2883 @retval EFI_SUCCESS The data associated with the Handle was removed
2884 from the HII database.
2885 @retval EFI_NOT_FOUND The specified andle is not in database.
2886 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2891 HiiRemovePackageList (
2892 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2893 IN EFI_HII_HANDLE Handle
2897 HII_DATABASE_PRIVATE_DATA
*Private
;
2899 HII_DATABASE_RECORD
*Node
;
2900 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2901 HII_HANDLE
*HiiHandle
;
2904 return EFI_INVALID_PARAMETER
;
2907 if (!IsHiiHandleValid (Handle
)) {
2908 return EFI_NOT_FOUND
;
2911 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2914 // Get the packagelist to be removed.
2916 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2917 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2918 if (Node
->Handle
== Handle
) {
2919 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2920 ASSERT (PackageList
!= NULL
);
2923 // Call registered functions with REMOVE_PACK before removing packages
2924 // then remove them.
2926 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2927 if (EFI_ERROR (Status
)) {
2930 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2931 if (EFI_ERROR (Status
)) {
2934 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2935 if (EFI_ERROR (Status
)) {
2938 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2939 if (EFI_ERROR (Status
)) {
2942 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2943 if (EFI_ERROR (Status
)) {
2946 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2947 if (EFI_ERROR (Status
)) {
2950 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2951 if (EFI_ERROR (Status
)) {
2954 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2955 if (EFI_ERROR (Status
)) {
2960 // Free resources of the package list
2962 RemoveEntryList (&Node
->DatabaseEntry
);
2964 HiiHandle
= (HII_HANDLE
*) Handle
;
2965 RemoveEntryList (&HiiHandle
->Handle
);
2966 Private
->HiiHandleCount
--;
2967 ASSERT (Private
->HiiHandleCount
>= 0);
2969 HiiHandle
->Signature
= 0;
2970 FreePool (HiiHandle
);
2971 FreePool (Node
->PackageList
);
2978 return EFI_NOT_FOUND
;
2983 This function updates the existing package list (which has the specified Handle)
2984 in the HII databases, using the new package list specified by PackageList.
2986 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2988 @param Handle The handle that was registered to the data that is
2989 requested to be updated.
2990 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2993 @retval EFI_SUCCESS The HII database was successfully updated.
2994 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2996 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2997 @retval EFI_NOT_FOUND The specified Handle is not in database.
3002 HiiUpdatePackageList (
3003 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3004 IN EFI_HII_HANDLE Handle
,
3005 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
3009 HII_DATABASE_PRIVATE_DATA
*Private
;
3011 HII_DATABASE_RECORD
*Node
;
3012 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
3013 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
3014 EFI_HII_PACKAGE_HEADER PackageHeader
;
3016 if (This
== NULL
|| PackageList
== NULL
) {
3017 return EFI_INVALID_PARAMETER
;
3020 if (!IsHiiHandleValid (Handle
)) {
3021 return EFI_NOT_FOUND
;
3024 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3026 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
3028 Status
= EFI_SUCCESS
;
3031 // Get original packagelist to be updated
3033 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3034 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3035 if (Node
->Handle
== Handle
) {
3036 OldPackageList
= Node
->PackageList
;
3038 // Remove the package if its type matches one of the package types which is
3039 // contained in the new package list.
3041 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3042 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
3043 switch (PackageHeader
.Type
) {
3044 case EFI_HII_PACKAGE_TYPE_GUID
:
3045 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
3047 case EFI_HII_PACKAGE_FORMS
:
3048 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
3050 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3051 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
3053 case EFI_HII_PACKAGE_STRINGS
:
3054 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
3056 case EFI_HII_PACKAGE_FONTS
:
3057 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
3059 case EFI_HII_PACKAGE_IMAGES
:
3060 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
3062 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3063 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
3065 case EFI_HII_PACKAGE_DEVICE_PATH
:
3066 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
3070 if (EFI_ERROR (Status
)) {
3074 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
3075 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
3079 // Add all of the packages within the new package list
3081 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3085 return EFI_NOT_FOUND
;
3090 This function returns a list of the package handles of the specified type
3091 that are currently active in the database. The pseudo-type
3092 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3094 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3096 @param PackageType Specifies the package type of the packages to list
3097 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3099 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3100 this is the pointer to the GUID which must match
3101 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3102 Otherwise, it must be NULL.
3103 @param HandleBufferLength On input, a pointer to the length of the handle
3104 buffer. On output, the length of the handle
3105 buffer that is required for the handles found.
3106 @param Handle An array of EFI_HII_HANDLE instances returned.
3108 @retval EFI_SUCCESS The matching handles are outputed successfully.
3109 HandleBufferLength is updated with the actual length.
3110 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3111 Handle is too small to support the number of
3112 handles. HandleBufferLength is updated with a
3113 value that will enable the data to fit.
3114 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3115 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3117 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3118 PackageGuid is not NULL, PackageType is a EFI_HII_
3119 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3124 HiiListPackageLists (
3125 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3126 IN UINT8 PackageType
,
3127 IN CONST EFI_GUID
*PackageGuid
,
3128 IN OUT UINTN
*HandleBufferLength
,
3129 OUT EFI_HII_HANDLE
*Handle
3132 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3133 HII_DATABASE_PRIVATE_DATA
*Private
;
3134 HII_DATABASE_RECORD
*Node
;
3137 HII_HANDLE
**Result
;
3139 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3143 // Check input parameters
3145 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3146 return EFI_INVALID_PARAMETER
;
3148 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3149 return EFI_INVALID_PARAMETER
;
3151 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3152 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3153 return EFI_INVALID_PARAMETER
;
3156 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3158 Result
= (HII_HANDLE
**) Handle
;
3161 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3162 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3163 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3164 switch (PackageType
) {
3165 case EFI_HII_PACKAGE_TYPE_GUID
:
3166 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3167 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3169 (EFI_GUID
*) PackageGuid
,
3170 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3177 case EFI_HII_PACKAGE_FORMS
:
3178 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3182 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3183 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3187 case EFI_HII_PACKAGE_STRINGS
:
3188 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3192 case EFI_HII_PACKAGE_FONTS
:
3193 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3197 case EFI_HII_PACKAGE_IMAGES
:
3198 if (PackageList
->ImagePkg
!= NULL
) {
3202 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3203 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3207 case EFI_HII_PACKAGE_DEVICE_PATH
:
3208 if (PackageList
->DevicePathPkg
!= NULL
) {
3213 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3216 case EFI_HII_PACKAGE_TYPE_ALL
:
3224 // This active package list has the specified package type, list it.
3227 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3228 if (ResultSize
<= *HandleBufferLength
) {
3229 *Result
++ = Node
->Handle
;
3235 if (ResultSize
== 0) {
3236 return EFI_NOT_FOUND
;
3239 if (*HandleBufferLength
< ResultSize
) {
3240 *HandleBufferLength
= ResultSize
;
3241 return EFI_BUFFER_TOO_SMALL
;
3244 *HandleBufferLength
= ResultSize
;
3250 This function will export one or all package lists in the database to a buffer.
3251 For each package list exported, this function will call functions registered
3252 with EXPORT_PACK and then copy the package list to the buffer.
3254 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3256 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3257 package list in the HII database to export or NULL
3258 to indicate all package lists should be exported.
3259 @param BufferSize On input, a pointer to the length of the buffer.
3260 On output, the length of the buffer that is
3261 required for the exported data.
3262 @param Buffer A pointer to a buffer that will contain the
3263 results of the export function.
3265 @retval EFI_SUCCESS Package exported.
3266 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3267 Handle is too small to support the number of
3268 handles. HandleBufferLength is updated with a
3269 value that will enable the data to fit.
3270 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3272 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3277 HiiExportPackageLists (
3278 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3279 IN EFI_HII_HANDLE Handle
,
3280 IN OUT UINTN
*BufferSize
,
3281 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3286 HII_DATABASE_PRIVATE_DATA
*Private
;
3287 HII_DATABASE_RECORD
*Node
;
3290 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3291 return EFI_INVALID_PARAMETER
;
3293 if (*BufferSize
> 0 && Buffer
== NULL
) {
3294 return EFI_INVALID_PARAMETER
;
3296 if (!IsHiiHandleValid (Handle
)) {
3297 return EFI_NOT_FOUND
;
3300 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3303 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3304 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3305 if (Handle
== NULL
) {
3307 // Export all package lists in current hii database.
3309 Status
= ExportPackageList (
3312 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3315 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3317 ASSERT_EFI_ERROR (Status
);
3318 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3319 Status
= ExportPackageList (
3322 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3327 ASSERT_EFI_ERROR (Status
);
3328 if (*BufferSize
< UsedSize
) {
3329 *BufferSize
= UsedSize
;
3330 return EFI_BUFFER_TOO_SMALL
;
3336 if (Handle
== NULL
&& UsedSize
!= 0) {
3337 if (*BufferSize
< UsedSize
) {
3338 *BufferSize
= UsedSize
;
3339 return EFI_BUFFER_TOO_SMALL
;
3344 return EFI_NOT_FOUND
;
3349 This function registers a function which will be called when specified actions related to packages of
3350 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3351 notified when specific package types are added, removed or updated in the HII database.
3352 Each driver or application which registers a notification should use
3353 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3355 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3357 @param PackageType Specifies the package type of the packages to list
3358 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3360 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3361 this is the pointer to the GUID which must match
3363 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3365 @param PackageNotifyFn Points to the function to be called when the event
3367 NotificationType occurs.
3368 @param NotifyType Describes the types of notification which this
3369 function will be receiving.
3370 @param NotifyHandle Points to the unique handle assigned to the
3371 registered notification. Can be used in
3372 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3373 to stop notifications.
3375 @retval EFI_SUCCESS Notification registered successfully.
3376 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3377 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3378 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3379 EFI_HII_PACKAGE_TYPE_GUID.
3380 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3381 EFI_HII_PACKAGE_TYPE_GUID.
3386 HiiRegisterPackageNotify (
3387 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3388 IN UINT8 PackageType
,
3389 IN CONST EFI_GUID
*PackageGuid
,
3390 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3391 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3392 OUT EFI_HANDLE
*NotifyHandle
3395 HII_DATABASE_PRIVATE_DATA
*Private
;
3396 HII_DATABASE_NOTIFY
*Notify
;
3399 if (This
== NULL
|| NotifyHandle
== NULL
) {
3400 return EFI_INVALID_PARAMETER
;
3402 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3403 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3404 return EFI_INVALID_PARAMETER
;
3407 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3410 // Allocate a notification node
3412 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3413 if (Notify
== NULL
) {
3414 return EFI_OUT_OF_RESOURCES
;
3418 // Generate a notify handle
3420 Status
= gBS
->InstallMultipleProtocolInterfaces (
3421 &Notify
->NotifyHandle
,
3422 &mHiiDatabaseNotifyGuid
,
3426 ASSERT_EFI_ERROR (Status
);
3429 // Fill in the information to the notification node
3431 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3432 Notify
->PackageType
= PackageType
;
3433 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3434 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3435 Notify
->NotifyType
= NotifyType
;
3437 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3438 *NotifyHandle
= Notify
->NotifyHandle
;
3445 Removes the specified HII database package-related notification.
3447 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3449 @param NotificationHandle The handle of the notification function being
3452 @retval EFI_SUCCESS Notification is unregistered successfully.
3453 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3454 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3455 in current hii database.
3460 HiiUnregisterPackageNotify (
3461 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3462 IN EFI_HANDLE NotificationHandle
3465 HII_DATABASE_PRIVATE_DATA
*Private
;
3466 HII_DATABASE_NOTIFY
*Notify
;
3471 return EFI_INVALID_PARAMETER
;
3474 if (NotificationHandle
== NULL
) {
3475 return EFI_NOT_FOUND
;
3478 Status
= gBS
->OpenProtocol (
3480 &mHiiDatabaseNotifyGuid
,
3484 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3486 if (EFI_ERROR (Status
)) {
3487 return EFI_NOT_FOUND
;
3490 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3492 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3493 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3494 if (Notify
->NotifyHandle
== NotificationHandle
) {
3496 // Remove the matching notification node
3498 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3499 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3500 Notify
->NotifyHandle
,
3501 &mHiiDatabaseNotifyGuid
,
3505 ASSERT_EFI_ERROR (Status
);
3512 return EFI_NOT_FOUND
;
3517 This routine retrieves an array of GUID values for each keyboard layout that
3518 was previously registered in the system.
3520 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3522 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3523 GUID buffer. On output, the length of the handle
3524 buffer that is required for the handles found.
3525 @param KeyGuidBuffer An array of keyboard layout GUID instances
3528 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3529 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3530 that KeyGuidBuffer is too small to support the
3531 number of GUIDs. KeyGuidBufferLength is
3532 updated with a value that will enable the data to
3534 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3535 @retval EFI_NOT_FOUND There was no keyboard layout.
3540 HiiFindKeyboardLayouts (
3541 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3542 IN OUT UINT16
*KeyGuidBufferLength
,
3543 OUT EFI_GUID
*KeyGuidBuffer
3546 HII_DATABASE_PRIVATE_DATA
*Private
;
3547 HII_DATABASE_RECORD
*Node
;
3548 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3554 UINT16 LayoutLength
;
3556 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3558 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3559 return EFI_INVALID_PARAMETER
;
3562 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3563 return EFI_INVALID_PARAMETER
;
3566 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3570 // Search all package lists in whole database to retrieve keyboard layout.
3572 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3573 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3574 PackageList
= Node
->PackageList
;
3575 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3576 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3577 Link1
= Link1
->ForwardLink
3580 // Find out all Keyboard Layout packages in this package list.
3584 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3586 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3588 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3591 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3594 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3595 ResultSize
+= sizeof (EFI_GUID
);
3596 if (ResultSize
<= *KeyGuidBufferLength
) {
3597 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3598 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3599 Layout
= Layout
+ LayoutLength
;
3605 if (ResultSize
== 0) {
3606 return EFI_NOT_FOUND
;
3609 if (*KeyGuidBufferLength
< ResultSize
) {
3610 *KeyGuidBufferLength
= ResultSize
;
3611 return EFI_BUFFER_TOO_SMALL
;
3614 *KeyGuidBufferLength
= ResultSize
;
3620 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3621 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3623 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3625 @param KeyGuid A pointer to the unique ID associated with a given
3626 keyboard layout. If KeyGuid is NULL then the
3627 current layout will be retrieved.
3628 @param KeyboardLayoutLength On input, a pointer to the length of the
3629 KeyboardLayout buffer. On output, the length of
3630 the data placed into KeyboardLayout.
3631 @param KeyboardLayout A pointer to a buffer containing the retrieved
3634 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3635 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3636 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3638 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3639 that KeyboardLayout is too small to support the
3640 requested keyboard layout. KeyboardLayoutLength is
3641 updated with a value that will enable the
3647 HiiGetKeyboardLayout (
3648 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3649 IN CONST EFI_GUID
*KeyGuid
,
3650 IN OUT UINT16
*KeyboardLayoutLength
,
3651 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3654 HII_DATABASE_PRIVATE_DATA
*Private
;
3655 HII_DATABASE_RECORD
*Node
;
3656 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3662 UINT16 LayoutLength
;
3663 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3665 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3666 return EFI_INVALID_PARAMETER
;
3668 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3669 return EFI_INVALID_PARAMETER
;
3672 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3674 // Retrieve the current keyboard layout.
3676 if (KeyGuid
== NULL
) {
3677 if (Private
->CurrentLayout
== NULL
) {
3678 return EFI_NOT_FOUND
;
3680 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3681 if (*KeyboardLayoutLength
< LayoutLength
) {
3682 *KeyboardLayoutLength
= LayoutLength
;
3683 return EFI_BUFFER_TOO_SMALL
;
3685 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3689 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3690 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3691 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3692 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3693 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3694 Link1
= Link1
->ForwardLink
3698 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3700 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3703 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3704 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3705 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3706 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3707 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3708 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3709 if (LayoutLength
<= *KeyboardLayoutLength
) {
3710 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3713 *KeyboardLayoutLength
= LayoutLength
;
3714 return EFI_BUFFER_TOO_SMALL
;
3717 Layout
= Layout
+ LayoutLength
;
3722 return EFI_NOT_FOUND
;
3727 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3728 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3729 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3730 can be notified of this change.
3732 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3734 @param KeyGuid A pointer to the unique ID associated with a given
3737 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3738 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3740 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3745 HiiSetKeyboardLayout (
3746 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3747 IN CONST EFI_GUID
*KeyGuid
3750 HII_DATABASE_PRIVATE_DATA
*Private
;
3751 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3752 UINT16 KeyboardLayoutLength
;
3755 if (This
== NULL
|| KeyGuid
== NULL
) {
3756 return EFI_INVALID_PARAMETER
;
3759 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3762 // The specified GUID equals the current keyboard layout GUID,
3765 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3770 // Try to find the incoming keyboard layout data in current database.
3772 KeyboardLayoutLength
= 0;
3773 KeyboardLayout
= NULL
;
3774 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3775 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3779 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3780 ASSERT (KeyboardLayout
!= NULL
);
3781 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3782 ASSERT_EFI_ERROR (Status
);
3785 // Backup current keyboard layout.
3787 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3788 if (Private
->CurrentLayout
!= NULL
) {
3789 FreePool(Private
->CurrentLayout
);
3791 Private
->CurrentLayout
= KeyboardLayout
;
3794 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3795 // current keyboard layout is changed.
3797 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3798 ASSERT_EFI_ERROR (Status
);
3805 Return the EFI handle associated with a package list.
3807 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3809 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3810 package list in the HIIdatabase.
3811 @param DriverHandle On return, contains the EFI_HANDLE which was
3812 registered with the package list in
3815 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3816 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3817 DriverHandle was NULL.
3818 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3824 HiiGetPackageListHandle (
3825 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3826 IN EFI_HII_HANDLE PackageListHandle
,
3827 OUT EFI_HANDLE
*DriverHandle
3830 HII_DATABASE_PRIVATE_DATA
*Private
;
3831 HII_DATABASE_RECORD
*Node
;
3834 if (This
== NULL
|| DriverHandle
== NULL
) {
3835 return EFI_INVALID_PARAMETER
;
3838 if (!IsHiiHandleValid (PackageListHandle
)) {
3839 return EFI_INVALID_PARAMETER
;
3842 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3844 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3845 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3846 if (Node
->Handle
== PackageListHandle
) {
3847 *DriverHandle
= Node
->DriverHandle
;
3852 return EFI_NOT_FOUND
;