2 Implementation for EFI_HII_DATABASE_PROTOCOL.
5 Copyright (c) 2007 - 2008, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "HiiDatabase.h"
22 EFI_GUID mHiiDatabaseNotifyGuid
= HII_DATABASE_NOTIFY_GUID
;
26 This function generates a HII_DATABASE_RECORD node and adds into hii database.
27 This is a internal function.
29 @param Private hii database private structure
30 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
33 @retval EFI_SUCCESS A database record is generated successfully.
34 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
36 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
40 GenerateHiiDatabaseRecord (
41 IN HII_DATABASE_PRIVATE_DATA
*Private
,
42 OUT HII_DATABASE_RECORD
**DatabaseNode
45 HII_DATABASE_RECORD
*DatabaseRecord
;
46 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
47 HII_HANDLE
*HiiHandle
;
49 if (Private
== NULL
|| DatabaseNode
== NULL
) {
50 return EFI_INVALID_PARAMETER
;
53 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
54 if (DatabaseRecord
== NULL
) {
55 return EFI_OUT_OF_RESOURCES
;
57 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
59 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
60 if (DatabaseRecord
->PackageList
== NULL
) {
61 FreePool (DatabaseRecord
);
62 return EFI_OUT_OF_RESOURCES
;
65 PackageList
= DatabaseRecord
->PackageList
;
67 InitializeListHead (&PackageList
->GuidPkgHdr
);
68 InitializeListHead (&PackageList
->FormPkgHdr
);
69 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
70 InitializeListHead (&PackageList
->StringPkgHdr
);
71 InitializeListHead (&PackageList
->FontPkgHdr
);
72 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
73 PackageList
->ImagePkg
= NULL
;
74 PackageList
->DevicePathPkg
= NULL
;
77 // Create a new hii handle
79 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
80 if (HiiHandle
== NULL
) {
81 FreePool (DatabaseRecord
->PackageList
);
82 FreePool (DatabaseRecord
);
83 return EFI_OUT_OF_RESOURCES
;
85 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
87 // Backup the number of Hii handles
89 Private
->HiiHandleCount
++;
90 HiiHandle
->Key
= Private
->HiiHandleCount
;
92 // Insert the handle to hii handle list of the whole database.
94 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
96 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
99 // Insert the Package List node to Package List link of the whole database.
101 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
103 *DatabaseNode
= DatabaseRecord
;
111 This function checks whether a handle is a valid EFI_HII_HANDLE
112 This is a internal function.
114 @param Handle Pointer to a EFI_HII_HANDLE
117 @retval FALSE Invalid
122 EFI_HII_HANDLE Handle
125 HII_HANDLE
*HiiHandle
;
127 HiiHandle
= (HII_HANDLE
*) Handle
;
129 if (HiiHandle
== NULL
) {
133 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
142 This function invokes the matching registered function.
143 This is a internal function.
145 @param Private HII Database driver private structure.
146 @param NotifyType The type of change concerning the database.
147 @param PackageInstance Points to the package referred to by the
149 @param PackageType Package type
150 @param Handle The handle of the package list which contains the
153 @retval EFI_SUCCESS Already checked all registered function and
155 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
159 InvokeRegisteredFunction (
160 IN HII_DATABASE_PRIVATE_DATA
*Private
,
161 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
162 IN VOID
*PackageInstance
,
163 IN UINT8 PackageType
,
164 IN EFI_HII_HANDLE Handle
167 HII_DATABASE_NOTIFY
*Notify
;
169 EFI_HII_PACKAGE_HEADER
*Package
;
173 UINT32 ImageBlockSize
;
174 UINT32 PaletteInfoSize
;
176 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
177 return EFI_INVALID_PARAMETER
;
179 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
180 return EFI_INVALID_PARAMETER
;
182 if (!IsHiiHandleValid (Handle
)) {
183 return EFI_INVALID_PARAMETER
;
190 // Convert the incoming package from hii database storage format to UEFI
191 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
193 switch (PackageType
) {
194 case EFI_HII_PACKAGE_TYPE_GUID
:
195 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
198 case EFI_HII_PACKAGE_FORMS
:
199 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
200 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
201 ASSERT (Buffer
!= NULL
);
204 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
205 sizeof (EFI_HII_PACKAGE_HEADER
)
208 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
209 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
210 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
212 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
215 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
216 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
219 case EFI_HII_PACKAGE_STRINGS
:
220 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
221 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
222 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
223 ASSERT (Buffer
!= NULL
);
226 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
231 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
232 BufferSize
- HeaderSize
234 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
237 case EFI_HII_PACKAGE_FONTS
:
238 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
239 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
240 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
241 ASSERT (Buffer
!= NULL
);
244 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
249 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
250 BufferSize
- HeaderSize
252 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
255 case EFI_HII_PACKAGE_IMAGES
:
256 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
257 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
258 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
259 ASSERT (Buffer
!= NULL
);
263 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
267 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
272 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
273 if (ImageBlockSize
!= 0) {
276 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
281 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
282 if (PaletteInfoSize
!= 0) {
284 Buffer
+ HeaderSize
+ ImageBlockSize
,
285 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
288 HeaderSize
+= ImageBlockSize
;
290 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
295 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
298 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
299 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
300 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
301 ASSERT (Buffer
!= NULL
);
304 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
307 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
310 case EFI_HII_PACKAGE_DEVICE_PATH
:
311 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
315 return EFI_INVALID_PARAMETER
;
318 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
319 Link
!= &Private
->DatabaseNotifyList
;
320 Link
= Link
->ForwardLink
322 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
323 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
325 // Check in case PackageGuid is not NULL when Package is GUID package
327 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
328 Notify
->PackageGuid
= NULL
;
331 // Status of Registered Function is unknown so did not check it
333 Notify
->PackageNotifyFn (
343 if (Buffer
!= NULL
) {
352 This function insert a GUID package to a package list node.
353 This is a internal function.
355 @param PackageHdr Pointer to a buffer stored with GUID package
357 @param NotifyType The type of change concerning the database.
358 @param PackageList Pointer to a package list which will be inserted
360 @param Package Created GUID pacakge
362 @retval EFI_SUCCESS Guid Package is inserted successfully.
363 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
365 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
371 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
372 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
373 OUT HII_GUID_PACKAGE_INSTANCE
**Package
376 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
377 EFI_HII_PACKAGE_HEADER PackageHeader
;
379 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
380 return EFI_INVALID_PARAMETER
;
383 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
386 // Create a GUID package node
388 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
389 if (GuidPackage
== NULL
) {
390 return EFI_OUT_OF_RESOURCES
;
392 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
393 if (GuidPackage
->GuidPkg
== NULL
) {
394 FreePool (GuidPackage
);
395 return EFI_OUT_OF_RESOURCES
;
398 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
399 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
400 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
401 *Package
= GuidPackage
;
403 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
404 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
412 This function exports GUID packages to a buffer.
413 This is a internal function.
415 @param Private Hii database private structure.
416 @param Handle Identification of a package list.
417 @param PackageList Pointer to a package list which will be exported.
418 @param UsedSize The length of buffer be used.
419 @param BufferSize Length of the Buffer.
420 @param Buffer Allocated space for storing exported data.
421 @param ResultSize The size of the already exported content of this
424 @retval EFI_SUCCESS Guid Packages are exported successfully.
425 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
430 IN HII_DATABASE_PRIVATE_DATA
*Private
,
431 IN EFI_HII_HANDLE Handle
,
432 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
436 IN OUT UINTN
*ResultSize
439 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
442 EFI_HII_PACKAGE_HEADER PackageHeader
;
445 if (PackageList
== NULL
|| ResultSize
== NULL
) {
446 return EFI_INVALID_PARAMETER
;
449 if (BufferSize
> 0 && Buffer
== NULL
) {
450 return EFI_INVALID_PARAMETER
;
454 Status
= EFI_SUCCESS
;
456 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
457 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
458 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
459 PackageLength
+= PackageHeader
.Length
;
460 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
461 Status
= InvokeRegisteredFunction (
463 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
464 (VOID
*) GuidPackage
,
465 EFI_HII_PACKAGE_TYPE_GUID
,
468 ASSERT_EFI_ERROR (Status
);
469 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
470 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
474 *ResultSize
+= PackageLength
;
480 This function deletes all GUID packages from a package list node.
481 This is a internal function.
483 @param Private Hii database private data.
484 @param Handle Handle of the package list which contains the to
485 be removed GUID packages.
486 @param PackageList Pointer to a package list that contains removing
489 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
490 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
495 IN HII_DATABASE_PRIVATE_DATA
*Private
,
496 IN EFI_HII_HANDLE Handle
,
497 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
500 LIST_ENTRY
*ListHead
;
501 HII_GUID_PACKAGE_INSTANCE
*Package
;
503 EFI_HII_PACKAGE_HEADER PackageHeader
;
505 ListHead
= &PackageList
->GuidPkgHdr
;
507 while (!IsListEmpty (ListHead
)) {
509 ListHead
->ForwardLink
,
510 HII_GUID_PACKAGE_INSTANCE
,
512 HII_GUID_PACKAGE_SIGNATURE
514 Status
= InvokeRegisteredFunction (
516 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
518 EFI_HII_PACKAGE_TYPE_GUID
,
521 if (EFI_ERROR (Status
)) {
525 RemoveEntryList (&Package
->GuidEntry
);
526 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
527 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
528 FreePool (Package
->GuidPkg
);
537 This function insert a Form package to a package list node.
538 This is a internal function.
540 @param PackageHdr Pointer to a buffer stored with Form package
542 @param NotifyType The type of change concerning the database.
543 @param PackageList Pointer to a package list which will be inserted
545 @param Package Created Form package
547 @retval EFI_SUCCESS Form Package is inserted successfully.
548 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
550 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
556 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
557 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
558 OUT HII_IFR_PACKAGE_INSTANCE
**Package
561 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
562 EFI_HII_PACKAGE_HEADER PackageHeader
;
564 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
565 return EFI_INVALID_PARAMETER
;
569 // Get the length of the package, including package header itself
571 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
574 // Create a Form package node
576 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
577 if (FormPackage
== NULL
) {
578 return EFI_OUT_OF_RESOURCES
;
581 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
582 if (FormPackage
->IfrData
== NULL
) {
583 FreePool (FormPackage
);
584 return EFI_OUT_OF_RESOURCES
;
587 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
589 // Copy Package Header
591 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
597 FormPackage
->IfrData
,
598 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
599 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
602 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
603 *Package
= FormPackage
;
605 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
606 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
613 This function exports Form packages to a buffer.
614 This is a internal function.
616 @param Private Hii database private structure.
617 @param Handle Identification of a package list.
618 @param PackageList Pointer to a package list which will be exported.
619 @param UsedSize The length of buffer be used.
620 @param BufferSize Length of the Buffer.
621 @param Buffer Allocated space for storing exported data.
622 @param ResultSize The size of the already exported content of this
625 @retval EFI_SUCCESS Form Packages are exported successfully.
626 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
631 IN HII_DATABASE_PRIVATE_DATA
*Private
,
632 IN EFI_HII_HANDLE Handle
,
633 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
637 IN OUT UINTN
*ResultSize
640 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
645 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
646 return EFI_INVALID_PARAMETER
;
649 if (BufferSize
> 0 && Buffer
== NULL
) {
650 return EFI_INVALID_PARAMETER
;
654 Status
= EFI_SUCCESS
;
657 // Export Form packages.
659 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
660 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
661 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
662 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
664 // Invoke registered notification if exists
666 Status
= InvokeRegisteredFunction (
668 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
669 (VOID
*) FormPackage
,
670 EFI_HII_PACKAGE_FORMS
,
673 ASSERT_EFI_ERROR (Status
);
675 // Copy the Form package content.
677 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
678 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
681 (VOID
*) FormPackage
->IfrData
,
682 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
684 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
688 *ResultSize
+= PackageLength
;
696 This function deletes all Form packages from a package list node.
697 This is a internal function.
699 @param Private Hii database private data.
700 @param Handle Handle of the package list which contains the to
701 be removed Form packages.
702 @param PackageList Pointer to a package list that contains removing
705 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
706 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
711 IN HII_DATABASE_PRIVATE_DATA
*Private
,
712 IN EFI_HII_HANDLE Handle
,
713 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
716 LIST_ENTRY
*ListHead
;
717 HII_IFR_PACKAGE_INSTANCE
*Package
;
720 ListHead
= &PackageList
->FormPkgHdr
;
722 while (!IsListEmpty (ListHead
)) {
724 ListHead
->ForwardLink
,
725 HII_IFR_PACKAGE_INSTANCE
,
727 HII_IFR_PACKAGE_SIGNATURE
729 Status
= InvokeRegisteredFunction (
731 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
733 EFI_HII_PACKAGE_FORMS
,
736 if (EFI_ERROR (Status
)) {
740 RemoveEntryList (&Package
->IfrEntry
);
741 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
742 FreePool (Package
->IfrData
);
753 This function insert a String package to a package list node.
754 This is a internal function.
756 @param Private Hii database private structure.
757 @param PackageHdr Pointer to a buffer stored with String package
759 @param NotifyType The type of change concerning the database.
760 @param PackageList Pointer to a package list which will be inserted
762 @param Package Created String package
764 @retval EFI_SUCCESS String Package is inserted successfully.
765 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
767 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
768 @retval EFI_UNSUPPORTED A string package with the same language already
769 exists in current package list.
773 InsertStringPackage (
774 IN HII_DATABASE_PRIVATE_DATA
*Private
,
776 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
777 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
778 OUT HII_STRING_PACKAGE_INSTANCE
**Package
782 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
785 EFI_HII_PACKAGE_HEADER PackageHeader
;
790 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
791 return EFI_INVALID_PARAMETER
;
793 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
794 return EFI_INVALID_PARAMETER
;
797 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
798 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
801 // It is illegal to have two string packages with same language within one packagelist
802 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
804 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
805 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
806 if (Language
== NULL
) {
807 return EFI_OUT_OF_RESOURCES
;
809 AsciiStrCpy (Language
, (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
810 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
811 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
812 if (R8_EfiLibCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
814 return EFI_UNSUPPORTED
;
820 // Create a String package node
822 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
823 if (StringPackage
== NULL
) {
824 Status
= EFI_OUT_OF_RESOURCES
;
828 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
829 if (StringPackage
->StringPkgHdr
== NULL
) {
830 Status
= EFI_OUT_OF_RESOURCES
;
834 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
835 if (StringPackage
->StringBlock
== NULL
) {
836 Status
= EFI_OUT_OF_RESOURCES
;
840 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
841 StringPackage
->FontId
= 0;
842 InitializeListHead (&StringPackage
->FontInfoList
);
845 // Copy the String package header.
847 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
850 // Copy the String blocks
853 StringPackage
->StringBlock
,
854 (UINT8
*) PackageHdr
+ HeaderSize
,
855 PackageHeader
.Length
- HeaderSize
859 // Collect all font block info
861 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, NULL
);
862 if (EFI_ERROR (Status
)) {
867 // Insert to String package array
869 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
870 *Package
= StringPackage
;
872 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
873 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
880 if (StringPackage
!= NULL
) {
881 if (StringPackage
->StringBlock
!= NULL
) {
882 FreePool (StringPackage
->StringBlock
);
884 if (StringPackage
->StringPkgHdr
!= NULL
) {
885 FreePool (StringPackage
->StringPkgHdr
);
887 FreePool (StringPackage
);
895 This function exports String packages to a buffer.
896 This is a internal function.
898 @param Private Hii database private structure.
899 @param Handle Identification of a package list.
900 @param PackageList Pointer to a package list which will be exported.
901 @param UsedSize The length of buffer be used.
902 @param BufferSize Length of the Buffer.
903 @param Buffer Allocated space for storing exported data.
904 @param ResultSize The size of the already exported content of this
907 @retval EFI_SUCCESS String Packages are exported successfully.
908 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
912 ExportStringPackages (
913 IN HII_DATABASE_PRIVATE_DATA
*Private
,
914 IN EFI_HII_HANDLE Handle
,
915 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
919 IN OUT UINTN
*ResultSize
925 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
927 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
928 return EFI_INVALID_PARAMETER
;
931 if (BufferSize
> 0 && Buffer
== NULL
) {
932 return EFI_INVALID_PARAMETER
;
936 Status
= EFI_SUCCESS
;
938 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
939 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
940 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
941 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
943 // Invoke registered notification function with EXPORT_PACK notify type
945 Status
= InvokeRegisteredFunction (
947 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
948 (VOID
*) StringPackage
,
949 EFI_HII_PACKAGE_STRINGS
,
952 ASSERT_EFI_ERROR (Status
);
954 // Copy String package header
956 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
957 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
960 // Copy String blocks information
964 StringPackage
->StringBlock
,
965 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
967 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
971 *ResultSize
+= PackageLength
;
977 This function deletes all String packages from a package list node.
978 This is a internal function.
980 @param Private Hii database private data.
981 @param Handle Handle of the package list which contains the to
982 be removed String packages.
983 @param PackageList Pointer to a package list that contains removing
986 @retval EFI_SUCCESS String Package(s) is deleted successfully.
987 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
991 RemoveStringPackages (
992 IN HII_DATABASE_PRIVATE_DATA
*Private
,
993 IN EFI_HII_HANDLE Handle
,
994 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
997 LIST_ENTRY
*ListHead
;
998 HII_STRING_PACKAGE_INSTANCE
*Package
;
999 HII_FONT_INFO
*FontInfo
;
1002 ListHead
= &PackageList
->StringPkgHdr
;
1004 while (!IsListEmpty (ListHead
)) {
1006 ListHead
->ForwardLink
,
1007 HII_STRING_PACKAGE_INSTANCE
,
1009 HII_STRING_PACKAGE_SIGNATURE
1011 Status
= InvokeRegisteredFunction (
1013 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1015 EFI_HII_PACKAGE_STRINGS
,
1018 if (EFI_ERROR (Status
)) {
1022 RemoveEntryList (&Package
->StringEntry
);
1023 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1024 FreePool (Package
->StringBlock
);
1025 FreePool (Package
->StringPkgHdr
);
1027 // Delete font information
1029 while (!IsListEmpty (&Package
->FontInfoList
)) {
1031 Package
->FontInfoList
.ForwardLink
,
1034 HII_FONT_INFO_SIGNATURE
1036 RemoveEntryList (&FontInfo
->Entry
);
1037 FreePool (FontInfo
);
1048 This function insert a Font package to a package list node.
1049 This is a internal function.
1051 @param Private Hii database private structure.
1052 @param PackageHdr Pointer to a buffer stored with Font package
1054 @param NotifyType The type of change concerning the database.
1055 @param PackageList Pointer to a package list which will be inserted
1057 @param Package Created Font package
1059 @retval EFI_SUCCESS Font Package is inserted successfully.
1060 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1062 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1063 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1064 exists in current hii database.
1069 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1070 IN VOID
*PackageHdr
,
1071 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1072 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1073 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1076 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1077 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1080 EFI_HII_PACKAGE_HEADER PackageHeader
;
1081 EFI_FONT_INFO
*FontInfo
;
1082 UINT32 FontInfoSize
;
1083 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1085 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1086 return EFI_INVALID_PARAMETER
;
1089 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1090 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1097 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1098 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1099 // attributes and identify a font uniquely.
1101 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1102 if (FontPkgHdr
== NULL
) {
1103 Status
= EFI_OUT_OF_RESOURCES
;
1106 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1108 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1109 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1110 if (FontInfo
== NULL
) {
1111 Status
= EFI_OUT_OF_RESOURCES
;
1114 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1115 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1116 StrCpy (FontInfo
->FontName
, FontPkgHdr
->FontFamily
);
1118 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1119 Status
= EFI_UNSUPPORTED
;
1124 // Create a Font package node
1126 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1127 if (FontPackage
== NULL
) {
1128 Status
= EFI_OUT_OF_RESOURCES
;
1131 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1132 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1133 InitializeListHead (&FontPackage
->GlyphInfoList
);
1135 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1136 if (FontPackage
->GlyphBlock
== NULL
) {
1137 Status
= EFI_OUT_OF_RESOURCES
;
1140 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1143 // Collect all default character cell information and backup in GlyphInfoList.
1145 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1146 if (EFI_ERROR (Status
)) {
1151 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1154 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1155 if (GlobalFont
== NULL
) {
1156 Status
= EFI_OUT_OF_RESOURCES
;
1159 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1160 GlobalFont
->FontPackage
= FontPackage
;
1161 GlobalFont
->FontInfoSize
= FontInfoSize
;
1162 GlobalFont
->FontInfo
= FontInfo
;
1163 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1166 // Insert this font package to Font package array
1168 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1169 *Package
= FontPackage
;
1171 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1172 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1179 if (FontPkgHdr
!= NULL
) {
1180 FreePool (FontPkgHdr
);
1182 if (FontInfo
!= NULL
) {
1183 FreePool (FontInfo
);
1185 if (FontPackage
!= NULL
) {
1186 if (FontPackage
->GlyphBlock
!= NULL
) {
1187 FreePool (FontPackage
->GlyphBlock
);
1189 FreePool (FontPackage
);
1191 if (GlobalFont
!= NULL
) {
1192 FreePool (GlobalFont
);
1201 This function exports Font packages to a buffer.
1202 This is a internal function.
1204 @param Private Hii database private structure.
1205 @param Handle Identification of a package list.
1206 @param PackageList Pointer to a package list which will be exported.
1207 @param UsedSize The length of buffer be used.
1208 @param BufferSize Length of the Buffer.
1209 @param Buffer Allocated space for storing exported data.
1210 @param ResultSize The size of the already exported content of this
1213 @retval EFI_SUCCESS Font Packages are exported successfully.
1214 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1218 ExportFontPackages (
1219 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1220 IN EFI_HII_HANDLE Handle
,
1221 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1223 IN UINTN BufferSize
,
1224 IN OUT VOID
*Buffer
,
1225 IN OUT UINTN
*ResultSize
1229 UINTN PackageLength
;
1231 HII_FONT_PACKAGE_INSTANCE
*Package
;
1234 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1235 return EFI_INVALID_PARAMETER
;
1238 if (BufferSize
> 0 && Buffer
== NULL
) {
1239 return EFI_INVALID_PARAMETER
;
1243 Status
= EFI_SUCCESS
;
1245 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1246 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1247 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1248 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1250 // Invoke registered notification function with EXPORT_PACK notify type
1252 Status
= InvokeRegisteredFunction (
1254 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1256 EFI_HII_PACKAGE_FONTS
,
1259 ASSERT_EFI_ERROR (Status
);
1261 // Copy Font package header
1263 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1264 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1267 // Copy Glyph blocks information
1271 Package
->GlyphBlock
,
1272 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1274 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1278 *ResultSize
+= PackageLength
;
1284 This function deletes all Font packages from a package list node.
1285 This is a internal function.
1287 @param Private Hii database private data.
1288 @param Handle Handle of the package list which contains the to
1289 be removed Font packages.
1290 @param PackageList Pointer to a package list that contains removing
1293 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1294 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1298 RemoveFontPackages (
1299 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1300 IN EFI_HII_HANDLE Handle
,
1301 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1304 LIST_ENTRY
*ListHead
;
1305 HII_FONT_PACKAGE_INSTANCE
*Package
;
1307 HII_GLYPH_INFO
*GlyphInfo
;
1309 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1311 ListHead
= &PackageList
->FontPkgHdr
;
1313 while (!IsListEmpty (ListHead
)) {
1315 ListHead
->ForwardLink
,
1316 HII_FONT_PACKAGE_INSTANCE
,
1318 HII_FONT_PACKAGE_SIGNATURE
1320 Status
= InvokeRegisteredFunction (
1322 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1324 EFI_HII_PACKAGE_FONTS
,
1327 if (EFI_ERROR (Status
)) {
1331 RemoveEntryList (&Package
->FontEntry
);
1332 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1334 if (Package
->GlyphBlock
!= NULL
) {
1335 FreePool (Package
->GlyphBlock
);
1337 FreePool (Package
->FontPkgHdr
);
1339 // Delete default character cell information
1341 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1343 Package
->GlyphInfoList
.ForwardLink
,
1346 HII_GLYPH_INFO_SIGNATURE
1348 RemoveEntryList (&GlyphInfo
->Entry
);
1349 FreePool (GlyphInfo
);
1353 // Remove corresponding global font info
1355 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1356 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1357 if (GlobalFont
->FontPackage
== Package
) {
1358 RemoveEntryList (&GlobalFont
->Entry
);
1359 FreePool (GlobalFont
->FontInfo
);
1360 FreePool (GlobalFont
);
1373 This function insert a Image package to a package list node.
1374 This is a internal function.
1376 @param PackageHdr Pointer to a buffer stored with Image package
1378 @param NotifyType The type of change concerning the database.
1379 @param PackageList Pointer to a package list which will be inserted
1381 @param Package Created Image package
1383 @retval EFI_SUCCESS Image Package is inserted successfully.
1384 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1386 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1390 InsertImagePackage (
1391 IN VOID
*PackageHdr
,
1392 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1393 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1394 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1397 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1401 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1402 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1403 UINT32 PaletteInfoOffset
;
1404 UINT32 ImageInfoOffset
;
1407 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1408 return EFI_INVALID_PARAMETER
;
1412 // Less than one image package is allowed in one package list.
1414 if (PackageList
->ImagePkg
!= NULL
) {
1415 return EFI_INVALID_PARAMETER
;
1419 // Create a Image package node
1421 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1422 if (ImagePackage
== NULL
) {
1423 return EFI_OUT_OF_RESOURCES
;
1427 // Copy the Image package header.
1429 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1431 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1432 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1435 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1438 ImagePackage
->PaletteBlock
= NULL
;
1439 if (PaletteInfoOffset
!= 0) {
1440 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1441 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1442 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1444 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1445 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1446 CurrentSize
+= sizeof (UINT16
);
1447 PaletteSize
+= (UINT32
) CurrentSize
;
1448 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1451 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1452 if (ImagePackage
->PaletteBlock
== NULL
) {
1453 FreePool (ImagePackage
);
1454 return EFI_OUT_OF_RESOURCES
;
1457 ImagePackage
->PaletteBlock
,
1458 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1464 // If ImageInfoOffset is zero, there are no images in this package.
1467 ImagePackage
->ImageBlock
= NULL
;
1468 if (ImageInfoOffset
!= 0) {
1469 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1470 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1471 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1472 if (ImagePackage
->ImageBlock
== NULL
) {
1473 FreePool (ImagePackage
->PaletteBlock
);
1474 FreePool (ImagePackage
);
1475 return EFI_OUT_OF_RESOURCES
;
1478 ImagePackage
->ImageBlock
,
1479 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1484 ImagePackage
->ImageBlockSize
= ImageSize
;
1485 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1486 PackageList
->ImagePkg
= ImagePackage
;
1487 *Package
= ImagePackage
;
1489 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1490 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1498 This function exports Image packages to a buffer.
1499 This is a internal function.
1501 @param Private Hii database private structure.
1502 @param Handle Identification of a package list.
1503 @param PackageList Pointer to a package list which will be exported.
1504 @param UsedSize The length of buffer be used.
1505 @param BufferSize Length of the Buffer.
1506 @param Buffer Allocated space for storing exported data.
1507 @param ResultSize The size of the already exported content of this
1510 @retval EFI_SUCCESS Image Packages are exported successfully.
1511 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1515 ExportImagePackages (
1516 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1517 IN EFI_HII_HANDLE Handle
,
1518 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1520 IN UINTN BufferSize
,
1521 IN OUT VOID
*Buffer
,
1522 IN OUT UINTN
*ResultSize
1525 UINTN PackageLength
;
1527 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1530 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1531 return EFI_INVALID_PARAMETER
;
1534 if (BufferSize
> 0 && Buffer
== NULL
) {
1535 return EFI_INVALID_PARAMETER
;
1538 Package
= PackageList
->ImagePkg
;
1540 if (Package
== NULL
) {
1544 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1546 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1548 // Invoke registered notification function with EXPORT_PACK notify type
1550 Status
= InvokeRegisteredFunction (
1552 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1554 EFI_HII_PACKAGE_IMAGES
,
1557 ASSERT_EFI_ERROR (Status
);
1558 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1559 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1561 // Copy Image package header,
1562 // then justify the offset for image info and palette info in the header.
1564 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1565 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1568 // Copy Image blocks information
1570 if (Package
->ImageBlockSize
!= 0) {
1571 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1572 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1575 // Copy Palette information
1577 if (Package
->PaletteInfoSize
!= 0) {
1578 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1579 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1583 *ResultSize
+= PackageLength
;
1589 This function deletes Image package from a package list node.
1590 This is a internal function.
1592 @param Private Hii database private data.
1593 @param Handle Handle of the package list which contains the to
1594 be removed Image packages.
1595 @param PackageList Package List which contains the to be removed
1598 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1599 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1603 RemoveImagePackages (
1604 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1605 IN EFI_HII_HANDLE Handle
,
1606 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1609 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1612 Package
= PackageList
->ImagePkg
;
1615 // Image package does not exist, return directly.
1617 if (Package
== NULL
) {
1621 Status
= InvokeRegisteredFunction (
1623 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1625 EFI_HII_PACKAGE_IMAGES
,
1628 if (EFI_ERROR (Status
)) {
1632 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1634 FreePool (Package
->ImageBlock
);
1635 if (Package
->PaletteBlock
!= NULL
) {
1636 FreePool (Package
->PaletteBlock
);
1640 PackageList
->ImagePkg
= NULL
;
1647 This function insert a Simple Font package to a package list node.
1648 This is a internal function.
1650 @param PackageHdr Pointer to a buffer stored with Simple Font
1651 package information.
1652 @param NotifyType The type of change concerning the database.
1653 @param PackageList Pointer to a package list which will be inserted
1655 @param Package Created Simple Font package
1657 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1658 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1659 Simple Font package.
1660 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1664 InsertSimpleFontPackage (
1665 IN VOID
*PackageHdr
,
1666 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1667 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1668 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1671 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1673 EFI_HII_PACKAGE_HEADER Header
;
1675 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1676 return EFI_INVALID_PARAMETER
;
1680 // Create a Simple Font package node
1682 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1683 if (SimpleFontPackage
== NULL
) {
1684 Status
= EFI_OUT_OF_RESOURCES
;
1687 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1690 // Copy the Simple Font package.
1692 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1694 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1695 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1696 Status
= EFI_OUT_OF_RESOURCES
;
1700 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1703 // Insert to Simple Font package array
1705 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1706 *Package
= SimpleFontPackage
;
1708 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1709 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1716 if (SimpleFontPackage
!= NULL
) {
1717 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1718 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1720 FreePool (SimpleFontPackage
);
1727 This function exports SimpleFont packages to a buffer.
1728 This is a internal function.
1730 @param Private Hii database private structure.
1731 @param Handle Identification of a package list.
1732 @param PackageList Pointer to a package list which will be exported.
1733 @param UsedSize The length of buffer be used.
1734 @param BufferSize Length of the Buffer.
1735 @param Buffer Allocated space for storing exported data.
1736 @param ResultSize The size of the already exported content of this
1739 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1740 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1744 ExportSimpleFontPackages (
1745 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1746 IN EFI_HII_HANDLE Handle
,
1747 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1749 IN UINTN BufferSize
,
1750 IN OUT VOID
*Buffer
,
1751 IN OUT UINTN
*ResultSize
1755 UINTN PackageLength
;
1757 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1759 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1760 return EFI_INVALID_PARAMETER
;
1763 if (BufferSize
> 0 && Buffer
== NULL
) {
1764 return EFI_INVALID_PARAMETER
;
1768 Status
= EFI_SUCCESS
;
1770 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1771 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1772 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1773 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1775 // Invoke registered notification function with EXPORT_PACK notify type
1777 Status
= InvokeRegisteredFunction (
1779 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1781 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1784 ASSERT_EFI_ERROR (Status
);
1787 // Copy SimpleFont package
1789 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1790 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1794 *ResultSize
+= PackageLength
;
1800 This function deletes all Simple Font packages from a package list node.
1801 This is a internal function.
1803 @param Private Hii database private data.
1804 @param Handle Handle of the package list which contains the to
1805 be removed Simple Font packages.
1806 @param PackageList Pointer to a package list that contains removing
1809 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1810 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1814 RemoveSimpleFontPackages (
1815 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1816 IN EFI_HII_HANDLE Handle
,
1817 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1820 LIST_ENTRY
*ListHead
;
1821 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1824 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1826 while (!IsListEmpty (ListHead
)) {
1828 ListHead
->ForwardLink
,
1829 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1831 HII_S_FONT_PACKAGE_SIGNATURE
1833 Status
= InvokeRegisteredFunction (
1835 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1837 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1840 if (EFI_ERROR (Status
)) {
1844 RemoveEntryList (&Package
->SimpleFontEntry
);
1845 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1846 FreePool (Package
->SimpleFontPkgHdr
);
1855 This function insert a Device path package to a package list node.
1856 This is a internal function.
1858 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1860 @param NotifyType The type of change concerning the database.
1861 @param PackageList Pointer to a package list which will be inserted
1864 @retval EFI_SUCCESS Device path Package is inserted successfully.
1865 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1866 Device path package.
1867 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1871 InsertDevicePathPackage (
1872 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1873 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1874 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1877 UINT32 PackageLength
;
1878 EFI_HII_PACKAGE_HEADER Header
;
1880 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1881 return EFI_INVALID_PARAMETER
;
1884 // Less than one device path package is allowed in one package list.
1886 if (PackageList
->DevicePathPkg
!= NULL
) {
1887 return EFI_INVALID_PARAMETER
;
1890 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1891 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1892 if (PackageList
->DevicePathPkg
== NULL
) {
1893 return EFI_OUT_OF_RESOURCES
;
1896 Header
.Length
= PackageLength
;
1897 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1898 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1900 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1902 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1906 // Since Device Path package is created by NewPackageList, either NEW_PACK
1907 // or ADD_PACK should increase the length of package list.
1909 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1915 This function exports device path package to a buffer.
1916 This is a internal function.
1918 @param Private Hii database private structure.
1919 @param Handle Identification of a package list.
1920 @param PackageList Pointer to a package list which will be exported.
1921 @param UsedSize The length of buffer be used.
1922 @param BufferSize Length of the Buffer.
1923 @param Buffer Allocated space for storing exported data.
1924 @param ResultSize The size of the already exported content of this
1927 @retval EFI_SUCCESS Device path Package is exported successfully.
1928 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1932 ExportDevicePathPackage (
1933 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1934 IN EFI_HII_HANDLE Handle
,
1935 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1937 IN UINTN BufferSize
,
1938 IN OUT VOID
*Buffer
,
1939 IN OUT UINTN
*ResultSize
1944 EFI_HII_PACKAGE_HEADER Header
;
1946 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1947 return EFI_INVALID_PARAMETER
;
1949 if (BufferSize
> 0 && Buffer
== NULL
) {
1950 return EFI_INVALID_PARAMETER
;
1953 Package
= PackageList
->DevicePathPkg
;
1955 if (Package
== NULL
) {
1959 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
1961 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1963 // Invoke registered notification function with EXPORT_PACK notify type
1965 Status
= InvokeRegisteredFunction (
1967 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1969 EFI_HII_PACKAGE_DEVICE_PATH
,
1972 ASSERT_EFI_ERROR (Status
);
1975 // Copy Device path package
1977 CopyMem (Buffer
, Package
, Header
.Length
);
1980 *ResultSize
+= Header
.Length
;
1986 This function deletes Device Path package from a package list node.
1987 This is a internal function.
1989 @param Private Hii database private data.
1990 @param Handle Handle of the package list.
1991 @param PackageList Package List which contains the to be removed
1992 Device Path package.
1994 @retval EFI_SUCCESS Device Path Package is deleted successfully.
1995 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1999 RemoveDevicePathPackage (
2000 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2001 IN EFI_HII_HANDLE Handle
,
2002 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2007 EFI_HII_PACKAGE_HEADER Header
;
2009 Package
= PackageList
->DevicePathPkg
;
2012 // No device path, return directly.
2014 if (Package
== NULL
) {
2018 Status
= InvokeRegisteredFunction (
2020 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2022 EFI_HII_PACKAGE_DEVICE_PATH
,
2025 if (EFI_ERROR (Status
)) {
2029 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2030 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2034 PackageList
->DevicePathPkg
= NULL
;
2041 This function will insert a device path package to package list firstly then
2042 invoke notification functions if any.
2043 This is a internal function.
2045 @param Private Hii database private structure.
2046 @param NotifyType The type of change concerning the database.
2047 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2049 @param DatabaseRecord Pointer to a database record contains a package
2050 list which will be inserted to.
2052 @retval EFI_SUCCESS Device path Package is inserted successfully.
2053 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2054 Device path package.
2055 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2059 AddDevicePathPackage (
2060 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2061 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2062 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2063 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2068 if (DevicePath
== NULL
) {
2072 ASSERT (Private
!= NULL
);
2073 ASSERT (DatabaseRecord
!= NULL
);
2076 // Create a device path package and insert to packagelist
2078 Status
= InsertDevicePathPackage (
2081 DatabaseRecord
->PackageList
2083 if (EFI_ERROR (Status
)) {
2087 return InvokeRegisteredFunction (
2090 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2091 EFI_HII_PACKAGE_DEVICE_PATH
,
2092 DatabaseRecord
->Handle
2098 This function insert a Keyboard Layout package to a package list node.
2099 This is a internal function.
2101 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2102 package information.
2103 @param NotifyType The type of change concerning the database.
2104 @param PackageList Pointer to a package list which will be inserted
2106 @param Package Created Keyboard Layout package
2108 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2109 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2110 Keyboard Layout package.
2111 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2115 InsertKeyboardLayoutPackage (
2116 IN VOID
*PackageHdr
,
2117 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2118 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2119 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2122 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2123 EFI_HII_PACKAGE_HEADER PackageHeader
;
2126 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2127 return EFI_INVALID_PARAMETER
;
2130 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2133 // Create a Keyboard Layout package node
2135 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2136 if (KeyboardLayoutPackage
== NULL
) {
2137 Status
= EFI_OUT_OF_RESOURCES
;
2140 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2142 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2143 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2144 Status
= EFI_OUT_OF_RESOURCES
;
2148 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2149 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2151 *Package
= KeyboardLayoutPackage
;
2153 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2154 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2162 if (KeyboardLayoutPackage
!= NULL
) {
2163 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2164 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2166 FreePool (KeyboardLayoutPackage
);
2174 This function exports Keyboard Layout packages to a buffer.
2175 This is a internal function.
2177 @param Private Hii database private structure.
2178 @param Handle Identification of a package list.
2179 @param PackageList Pointer to a package list which will be exported.
2180 @param UsedSize The length of buffer be used.
2181 @param BufferSize Length of the Buffer.
2182 @param Buffer Allocated space for storing exported data.
2183 @param ResultSize The size of the already exported content of this
2186 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2188 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2192 ExportKeyboardLayoutPackages (
2193 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2194 IN EFI_HII_HANDLE Handle
,
2195 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2197 IN UINTN BufferSize
,
2198 IN OUT VOID
*Buffer
,
2199 IN OUT UINTN
*ResultSize
2203 UINTN PackageLength
;
2205 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2206 EFI_HII_PACKAGE_HEADER PackageHeader
;
2208 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2209 return EFI_INVALID_PARAMETER
;
2212 if (BufferSize
> 0 && Buffer
== NULL
) {
2213 return EFI_INVALID_PARAMETER
;
2217 Status
= EFI_SUCCESS
;
2219 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2220 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2221 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2222 PackageLength
+= PackageHeader
.Length
;
2223 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2225 // Invoke registered notification function with EXPORT_PACK notify type
2227 Status
= InvokeRegisteredFunction (
2229 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2230 (EFI_HII_PACKAGE_HEADER
*) Package
,
2231 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2234 ASSERT_EFI_ERROR (Status
);
2237 // Copy Keyboard Layout package
2239 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2240 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2244 *ResultSize
+= PackageLength
;
2250 This function deletes all Keyboard Layout packages from a package list node.
2251 This is a internal function.
2253 @param Private Hii database private data.
2254 @param Handle Handle of the package list which contains the to
2255 be removed Keyboard Layout packages.
2256 @param PackageList Pointer to a package list that contains removing
2259 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2261 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2265 RemoveKeyboardLayoutPackages (
2266 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2267 IN EFI_HII_HANDLE Handle
,
2268 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2271 LIST_ENTRY
*ListHead
;
2272 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2273 EFI_HII_PACKAGE_HEADER PackageHeader
;
2276 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2278 while (!IsListEmpty (ListHead
)) {
2280 ListHead
->ForwardLink
,
2281 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2283 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2285 Status
= InvokeRegisteredFunction (
2287 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2289 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2292 if (EFI_ERROR (Status
)) {
2296 RemoveEntryList (&Package
->KeyboardEntry
);
2297 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2298 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2299 FreePool (Package
->KeyboardPkg
);
2308 This function will insert a package list to hii database firstly then
2309 invoke notification functions if any. It is the worker function of
2310 HiiNewPackageList and HiiUpdatePackageList.
2312 This is a internal function.
2314 @param Private Hii database private structure.
2315 @param NotifyType The type of change concerning the database.
2316 @param PackageList Pointer to a package list.
2317 @param DatabaseRecord Pointer to a database record contains a package
2318 list instance which will be inserted to.
2320 @retval EFI_SUCCESS All incoming packages are inserted to current
2322 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2323 Device path package.
2324 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2329 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2330 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2331 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2332 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2336 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2337 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2338 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2339 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2340 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2341 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2342 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2343 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2344 EFI_HII_PACKAGE_HEADER PackageHeader
;
2345 UINT32 OldPackageListLen
;
2348 // Initialize Variables
2353 // Process the package list header
2355 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2357 &DatabaseRecord
->PackageList
->PackageListHdr
,
2358 (VOID
*) PackageList
,
2359 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2361 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2362 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2365 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2366 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2368 Status
= EFI_SUCCESS
;
2370 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2371 switch (PackageHeader
.Type
) {
2372 case EFI_HII_PACKAGE_TYPE_GUID
:
2373 Status
= InsertGuidPackage (
2376 DatabaseRecord
->PackageList
,
2379 if (EFI_ERROR (Status
)) {
2382 Status
= InvokeRegisteredFunction (
2385 (VOID
*) GuidPackage
,
2386 (UINT8
) (PackageHeader
.Type
),
2387 DatabaseRecord
->Handle
2390 case EFI_HII_PACKAGE_FORMS
:
2391 Status
= InsertFormPackage (
2394 DatabaseRecord
->PackageList
,
2397 if (EFI_ERROR (Status
)) {
2400 Status
= InvokeRegisteredFunction (
2403 (VOID
*) FormPackage
,
2404 (UINT8
) (PackageHeader
.Type
),
2405 DatabaseRecord
->Handle
2408 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2409 Status
= InsertKeyboardLayoutPackage (
2412 DatabaseRecord
->PackageList
,
2413 &KeyboardLayoutPackage
2415 if (EFI_ERROR (Status
)) {
2418 Status
= InvokeRegisteredFunction (
2421 (VOID
*) KeyboardLayoutPackage
,
2422 (UINT8
) (PackageHeader
.Type
),
2423 DatabaseRecord
->Handle
2426 case EFI_HII_PACKAGE_STRINGS
:
2427 Status
= InsertStringPackage (
2431 DatabaseRecord
->PackageList
,
2434 if (EFI_ERROR (Status
)) {
2437 Status
= InvokeRegisteredFunction (
2440 (VOID
*) StringPackage
,
2441 (UINT8
) (PackageHeader
.Type
),
2442 DatabaseRecord
->Handle
2445 case EFI_HII_PACKAGE_FONTS
:
2446 Status
= InsertFontPackage (
2450 DatabaseRecord
->PackageList
,
2453 if (EFI_ERROR (Status
)) {
2456 Status
= InvokeRegisteredFunction (
2459 (VOID
*) FontPackage
,
2460 (UINT8
) (PackageHeader
.Type
),
2461 DatabaseRecord
->Handle
2464 case EFI_HII_PACKAGE_IMAGES
:
2465 Status
= InsertImagePackage (
2468 DatabaseRecord
->PackageList
,
2471 if (EFI_ERROR (Status
)) {
2474 Status
= InvokeRegisteredFunction (
2477 (VOID
*) ImagePackage
,
2478 (UINT8
) (PackageHeader
.Type
),
2479 DatabaseRecord
->Handle
2482 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2483 Status
= InsertSimpleFontPackage (
2486 DatabaseRecord
->PackageList
,
2489 if (EFI_ERROR (Status
)) {
2492 Status
= InvokeRegisteredFunction (
2495 (VOID
*) SimpleFontPackage
,
2496 (UINT8
) (PackageHeader
.Type
),
2497 DatabaseRecord
->Handle
2500 case EFI_HII_PACKAGE_DEVICE_PATH
:
2501 Status
= AddDevicePathPackage (
2504 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2512 if (EFI_ERROR (Status
)) {
2516 // goto header of next package
2518 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2519 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2527 This function exports a package list to a buffer. It is the worker function
2528 of HiiExportPackageList.
2530 This is a internal function.
2532 @param Private Hii database private structure.
2533 @param Handle Identification of a package list.
2534 @param PackageList Pointer to a package list which will be exported.
2535 @param UsedSize The length of buffer has been used by exporting
2536 package lists when Handle is NULL.
2537 @param BufferSize Length of the Buffer.
2538 @param Buffer Allocated space for storing exported data.
2540 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2542 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2547 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2548 IN EFI_HII_HANDLE Handle
,
2549 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2550 IN OUT UINTN
*UsedSize
,
2551 IN UINTN BufferSize
,
2552 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2557 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2559 ASSERT (Private
!= NULL
|| PackageList
!= NULL
|| UsedSize
!= NULL
);
2560 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2561 ASSERT (IsHiiHandleValid (Handle
));
2563 if (BufferSize
> 0 && Buffer
== NULL
) {
2564 return EFI_INVALID_PARAMETER
;
2568 // Copy the package list header
2569 // ResultSize indicates the length of the exported bytes of this package list
2571 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2572 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2573 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2576 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2578 Status
= ExportGuidPackages (
2584 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2587 if (EFI_ERROR (Status
)) {
2590 Status
= ExportFormPackages (
2596 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2599 if (EFI_ERROR (Status
)) {
2602 Status
= ExportKeyboardLayoutPackages (
2608 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2611 if (EFI_ERROR (Status
)) {
2614 Status
= ExportStringPackages (
2620 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2623 if (EFI_ERROR (Status
)) {
2626 Status
= ExportFontPackages (
2632 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2635 if (EFI_ERROR (Status
)) {
2638 Status
= ExportImagePackages (
2644 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2647 if (EFI_ERROR (Status
)) {
2650 Status
= ExportSimpleFontPackages (
2656 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2659 if (EFI_ERROR (Status
)) {
2662 Status
= ExportDevicePathPackage (
2668 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2671 if (EFI_ERROR (Status
)) {
2675 // Append the package list end.
2677 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2678 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2679 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2681 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2682 (VOID
*) &EndofPackageList
,
2683 sizeof (EFI_HII_PACKAGE_HEADER
)
2687 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2694 This function adds the packages in the package list to the database and returns a handle. If there is a
2695 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2696 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2698 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2700 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2702 @param DriverHandle Associate the package list with this EFI handle.
2703 @param Handle A pointer to the EFI_HII_HANDLE instance.
2705 @retval EFI_SUCCESS The package list associated with the Handle was
2706 added to the HII database.
2707 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2709 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2710 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2716 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2717 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2718 IN CONST EFI_HANDLE DriverHandle
,
2719 OUT EFI_HII_HANDLE
*Handle
2723 HII_DATABASE_PRIVATE_DATA
*Private
;
2724 HII_DATABASE_RECORD
*DatabaseRecord
;
2725 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2727 EFI_GUID PackageListGuid
;
2729 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2730 return EFI_INVALID_PARAMETER
;
2733 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2734 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2737 // Check the Package list GUID to guarantee this GUID is unique in database.
2739 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2740 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2742 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2746 return EFI_INVALID_PARAMETER
;
2751 // Build a PackageList node
2753 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2754 if (EFI_ERROR (Status
)) {
2759 // Fill in information of the created Package List node
2760 // according to incoming package list.
2762 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2763 if (EFI_ERROR (Status
)) {
2767 DatabaseRecord
->DriverHandle
= DriverHandle
;
2770 // Create a Device path package and add into the package list if exists.
2772 Status
= gBS
->HandleProtocol (
2774 &gEfiDevicePathProtocolGuid
,
2775 (VOID
**) &DevicePath
2777 if (!EFI_ERROR (Status
)) {
2778 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2779 ASSERT_EFI_ERROR (Status
);
2782 *Handle
= DatabaseRecord
->Handle
;
2788 This function removes the package list that is associated with a handle Handle
2789 from the HII database. Before removing the package, any registered functions
2790 with the notification type REMOVE_PACK and the same package type will be called.
2792 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2794 @param Handle The handle that was registered to the data that is
2795 requested for removal.
2797 @retval EFI_SUCCESS The data associated with the Handle was removed
2798 from the HII database.
2799 @retval EFI_NOT_FOUND The specified andle is not in database.
2800 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2805 HiiRemovePackageList (
2806 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2807 IN EFI_HII_HANDLE Handle
2811 HII_DATABASE_PRIVATE_DATA
*Private
;
2813 HII_DATABASE_RECORD
*Node
;
2814 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2815 HII_HANDLE
*HiiHandle
;
2818 return EFI_INVALID_PARAMETER
;
2821 if (!IsHiiHandleValid (Handle
)) {
2822 return EFI_NOT_FOUND
;
2825 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2828 // Get the packagelist to be removed.
2830 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2831 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2832 if (Node
->Handle
== Handle
) {
2833 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2834 ASSERT (PackageList
!= NULL
);
2837 // Call registered functions with REMOVE_PACK before removing packages
2838 // then remove them.
2840 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2841 if (EFI_ERROR (Status
)) {
2844 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2845 if (EFI_ERROR (Status
)) {
2848 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2849 if (EFI_ERROR (Status
)) {
2852 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2853 if (EFI_ERROR (Status
)) {
2856 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2857 if (EFI_ERROR (Status
)) {
2860 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2861 if (EFI_ERROR (Status
)) {
2864 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2865 if (EFI_ERROR (Status
)) {
2868 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2869 if (EFI_ERROR (Status
)) {
2874 // Free resources of the package list
2876 RemoveEntryList (&Node
->DatabaseEntry
);
2878 HiiHandle
= (HII_HANDLE
*) Handle
;
2879 RemoveEntryList (&HiiHandle
->Handle
);
2880 Private
->HiiHandleCount
--;
2881 ASSERT (Private
->HiiHandleCount
>= 0);
2883 HiiHandle
->Signature
= 0;
2884 FreePool (HiiHandle
);
2885 FreePool (Node
->PackageList
);
2892 return EFI_NOT_FOUND
;
2897 This function updates the existing package list (which has the specified Handle)
2898 in the HII databases, using the new package list specified by PackageList.
2900 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2902 @param Handle The handle that was registered to the data that is
2903 requested to be updated.
2904 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2907 @retval EFI_SUCCESS The HII database was successfully updated.
2908 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2910 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2911 @retval EFI_NOT_FOUND The specified Handle is not in database.
2916 HiiUpdatePackageList (
2917 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2918 IN EFI_HII_HANDLE Handle
,
2919 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
2923 HII_DATABASE_PRIVATE_DATA
*Private
;
2925 HII_DATABASE_RECORD
*Node
;
2926 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2927 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
2928 EFI_HII_PACKAGE_HEADER PackageHeader
;
2930 if (This
== NULL
|| PackageList
== NULL
) {
2931 return EFI_INVALID_PARAMETER
;
2934 if (!IsHiiHandleValid (Handle
)) {
2935 return EFI_NOT_FOUND
;
2938 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2940 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2942 Status
= EFI_SUCCESS
;
2945 // Get original packagelist to be updated
2947 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2948 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2949 if (Node
->Handle
== Handle
) {
2950 OldPackageList
= Node
->PackageList
;
2952 // Remove the package if its type matches one of the package types which is
2953 // contained in the new package list.
2955 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2956 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2957 switch (PackageHeader
.Type
) {
2958 case EFI_HII_PACKAGE_TYPE_GUID
:
2959 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
2961 case EFI_HII_PACKAGE_FORMS
:
2962 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
2964 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2965 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
2967 case EFI_HII_PACKAGE_STRINGS
:
2968 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
2970 case EFI_HII_PACKAGE_FONTS
:
2971 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
2973 case EFI_HII_PACKAGE_IMAGES
:
2974 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
2976 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2977 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
2979 case EFI_HII_PACKAGE_DEVICE_PATH
:
2980 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
2984 if (EFI_ERROR (Status
)) {
2988 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2989 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2993 // Add all of the packages within the new package list
2995 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
2999 return EFI_NOT_FOUND
;
3004 This function returns a list of the package handles of the specified type
3005 that are currently active in the database. The pseudo-type
3006 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3008 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3010 @param PackageType Specifies the package type of the packages to list
3011 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3013 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3014 this is the pointer to the GUID which must match
3015 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3016 Otherwise, it must be NULL.
3017 @param HandleBufferLength On input, a pointer to the length of the handle
3018 buffer. On output, the length of the handle
3019 buffer that is required for the handles found.
3020 @param Handle An array of EFI_HII_HANDLE instances returned.
3022 @retval EFI_SUCCESS The matching handles are outputed successfully.
3023 HandleBufferLength is updated with the actual length.
3024 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3025 Handle is too small to support the number of
3026 handles. HandleBufferLength is updated with a
3027 value that will enable the data to fit.
3028 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3029 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3031 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3032 PackageGuid is not NULL, PackageType is a EFI_HII_
3033 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3038 HiiListPackageLists (
3039 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3040 IN UINT8 PackageType
,
3041 IN CONST EFI_GUID
*PackageGuid
,
3042 IN OUT UINTN
*HandleBufferLength
,
3043 OUT EFI_HII_HANDLE
*Handle
3046 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3047 HII_DATABASE_PRIVATE_DATA
*Private
;
3048 HII_DATABASE_RECORD
*Node
;
3051 HII_HANDLE
**Result
;
3053 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3057 // Check input parameters
3059 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3060 return EFI_INVALID_PARAMETER
;
3062 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3063 return EFI_INVALID_PARAMETER
;
3065 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3066 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3067 return EFI_INVALID_PARAMETER
;
3070 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3072 Result
= (HII_HANDLE
**) Handle
;
3075 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3076 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3077 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3078 switch (PackageType
) {
3079 case EFI_HII_PACKAGE_TYPE_GUID
:
3080 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3081 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3083 (EFI_GUID
*) PackageGuid
,
3084 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3091 case EFI_HII_PACKAGE_FORMS
:
3092 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3096 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3097 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3101 case EFI_HII_PACKAGE_STRINGS
:
3102 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3106 case EFI_HII_PACKAGE_FONTS
:
3107 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3111 case EFI_HII_PACKAGE_IMAGES
:
3112 if (PackageList
->ImagePkg
!= NULL
) {
3116 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3117 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3121 case EFI_HII_PACKAGE_DEVICE_PATH
:
3122 if (PackageList
->DevicePathPkg
!= NULL
) {
3127 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3130 case EFI_HII_PACKAGE_TYPE_ALL
:
3138 // This active package list has the specified package type, list it.
3141 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3142 if (ResultSize
<= *HandleBufferLength
) {
3143 *Result
++ = Node
->Handle
;
3149 if (ResultSize
== 0) {
3150 return EFI_NOT_FOUND
;
3153 if (*HandleBufferLength
< ResultSize
) {
3154 *HandleBufferLength
= ResultSize
;
3155 return EFI_BUFFER_TOO_SMALL
;
3158 *HandleBufferLength
= ResultSize
;
3164 This function will export one or all package lists in the database to a buffer.
3165 For each package list exported, this function will call functions registered
3166 with EXPORT_PACK and then copy the package list to the buffer.
3168 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3170 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3171 package list in the HII database to export or NULL
3172 to indicate all package lists should be exported.
3173 @param BufferSize On input, a pointer to the length of the buffer.
3174 On output, the length of the buffer that is
3175 required for the exported data.
3176 @param Buffer A pointer to a buffer that will contain the
3177 results of the export function.
3179 @retval EFI_SUCCESS Package exported.
3180 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3181 Handle is too small to support the number of
3182 handles. HandleBufferLength is updated with a
3183 value that will enable the data to fit.
3184 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3186 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3191 HiiExportPackageLists (
3192 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3193 IN EFI_HII_HANDLE Handle
,
3194 IN OUT UINTN
*BufferSize
,
3195 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3200 HII_DATABASE_PRIVATE_DATA
*Private
;
3201 HII_DATABASE_RECORD
*Node
;
3204 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3205 return EFI_INVALID_PARAMETER
;
3207 if (*BufferSize
> 0 && Buffer
== NULL
) {
3208 return EFI_INVALID_PARAMETER
;
3210 if (!IsHiiHandleValid (Handle
)) {
3211 return EFI_NOT_FOUND
;
3214 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3217 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3218 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3219 if (Handle
== NULL
) {
3221 // Export all package lists in current hii database.
3223 Status
= ExportPackageList (
3226 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3229 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3231 ASSERT_EFI_ERROR (Status
);
3233 else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3234 Status
= ExportPackageList (
3237 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3242 ASSERT_EFI_ERROR (Status
);
3243 if (*BufferSize
< UsedSize
) {
3244 *BufferSize
= UsedSize
;
3245 return EFI_BUFFER_TOO_SMALL
;
3251 if (Handle
== NULL
&& UsedSize
!= 0) {
3252 if (*BufferSize
< UsedSize
) {
3253 *BufferSize
= UsedSize
;
3254 return EFI_BUFFER_TOO_SMALL
;
3259 return EFI_NOT_FOUND
;
3264 This function registers a function which will be called when specified actions related to packages of
3265 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3266 notified when specific package types are added, removed or updated in the HII database.
3267 Each driver or application which registers a notification should use
3268 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3270 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3272 @param PackageType Specifies the package type of the packages to list
3273 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3275 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3276 this is the pointer to the GUID which must match
3278 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3280 @param PackageNotifyFn Points to the function to be called when the event
3282 NotificationType occurs.
3283 @param NotifyType Describes the types of notification which this
3284 function will be receiving.
3285 @param NotifyHandle Points to the unique handle assigned to the
3286 registered notification. Can be used in
3287 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3288 to stop notifications.
3290 @retval EFI_SUCCESS Notification registered successfully.
3291 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3292 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3293 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3294 EFI_HII_PACKAGE_TYPE_GUID.
3295 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3296 EFI_HII_PACKAGE_TYPE_GUID.
3301 HiiRegisterPackageNotify (
3302 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3303 IN UINT8 PackageType
,
3304 IN CONST EFI_GUID
*PackageGuid
,
3305 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3306 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3307 OUT EFI_HANDLE
*NotifyHandle
3310 HII_DATABASE_PRIVATE_DATA
*Private
;
3311 HII_DATABASE_NOTIFY
*Notify
;
3314 if (This
== NULL
|| NotifyHandle
== NULL
) {
3315 return EFI_INVALID_PARAMETER
;
3317 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3318 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3319 return EFI_INVALID_PARAMETER
;
3322 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3325 // Allocate a notification node
3327 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3328 if (Notify
== NULL
) {
3329 return EFI_OUT_OF_RESOURCES
;
3333 // Generate a notify handle
3335 Status
= gBS
->InstallMultipleProtocolInterfaces (
3336 &Notify
->NotifyHandle
,
3337 &mHiiDatabaseNotifyGuid
,
3341 ASSERT_EFI_ERROR (Status
);
3344 // Fill in the information to the notification node
3346 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3347 Notify
->PackageType
= PackageType
;
3348 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3349 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3350 Notify
->NotifyType
= NotifyType
;
3352 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3353 *NotifyHandle
= Notify
->NotifyHandle
;
3360 Removes the specified HII database package-related notification.
3362 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3364 @param NotificationHandle The handle of the notification function being
3367 @retval EFI_SUCCESS Notification is unregistered successfully.
3368 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3369 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3370 in current hii database.
3375 HiiUnregisterPackageNotify (
3376 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3377 IN EFI_HANDLE NotificationHandle
3380 HII_DATABASE_PRIVATE_DATA
*Private
;
3381 HII_DATABASE_NOTIFY
*Notify
;
3386 return EFI_INVALID_PARAMETER
;
3389 if (NotificationHandle
== NULL
) {
3390 return EFI_NOT_FOUND
;
3393 Status
= gBS
->OpenProtocol (
3395 &mHiiDatabaseNotifyGuid
,
3399 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3401 if (EFI_ERROR (Status
)) {
3402 return EFI_NOT_FOUND
;
3405 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3407 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3408 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3409 if (Notify
->NotifyHandle
== NotificationHandle
) {
3411 // Remove the matching notification node
3413 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3414 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3415 Notify
->NotifyHandle
,
3416 &mHiiDatabaseNotifyGuid
,
3420 ASSERT_EFI_ERROR (Status
);
3427 return EFI_NOT_FOUND
;
3432 This routine retrieves an array of GUID values for each keyboard layout that
3433 was previously registered in the system.
3435 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3437 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3438 GUID buffer. On output, the length of the handle
3439 buffer that is required for the handles found.
3440 @param KeyGuidBuffer An array of keyboard layout GUID instances
3443 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3444 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3445 that KeyGuidBuffer is too small to support the
3446 number of GUIDs. KeyGuidBufferLength is
3447 updated with a value that will enable the data to
3449 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3450 @retval EFI_NOT_FOUND There was no keyboard layout.
3455 HiiFindKeyboardLayouts (
3456 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3457 IN OUT UINT16
*KeyGuidBufferLength
,
3458 OUT EFI_GUID
*KeyGuidBuffer
3461 HII_DATABASE_PRIVATE_DATA
*Private
;
3462 HII_DATABASE_RECORD
*Node
;
3463 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3469 UINT16 LayoutLength
;
3471 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3473 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3474 return EFI_INVALID_PARAMETER
;
3477 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3478 return EFI_INVALID_PARAMETER
;
3481 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3485 // Search all package lists in whole database to retrieve keyboard layout.
3487 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3488 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3489 PackageList
= Node
->PackageList
;
3490 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3491 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3492 Link1
= Link1
->ForwardLink
3495 // Find out all Keyboard Layout packages in this package list.
3499 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3501 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3503 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3506 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3509 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3510 ResultSize
+= sizeof (EFI_GUID
);
3511 if (ResultSize
<= *KeyGuidBufferLength
) {
3512 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3513 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3514 Layout
= Layout
+ LayoutLength
;
3520 if (ResultSize
== 0) {
3521 return EFI_NOT_FOUND
;
3524 if (*KeyGuidBufferLength
< ResultSize
) {
3525 *KeyGuidBufferLength
= ResultSize
;
3526 return EFI_BUFFER_TOO_SMALL
;
3529 *KeyGuidBufferLength
= ResultSize
;
3535 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3536 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3538 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3540 @param KeyGuid A pointer to the unique ID associated with a given
3541 keyboard layout. If KeyGuid is NULL then the
3542 current layout will be retrieved.
3543 @param KeyboardLayoutLength On input, a pointer to the length of the
3544 KeyboardLayout buffer. On output, the length of
3545 the data placed into KeyboardLayout.
3546 @param KeyboardLayout A pointer to a buffer containing the retrieved
3549 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3550 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3551 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3553 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3554 that KeyboardLayout is too small to support the
3555 requested keyboard layout. KeyboardLayoutLength is
3556 updated with a value that will enable the
3562 HiiGetKeyboardLayout (
3563 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3564 IN CONST EFI_GUID
*KeyGuid
,
3565 IN OUT UINT16
*KeyboardLayoutLength
,
3566 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3569 HII_DATABASE_PRIVATE_DATA
*Private
;
3570 HII_DATABASE_RECORD
*Node
;
3571 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3577 UINT16 LayoutLength
;
3578 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3580 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3581 return EFI_INVALID_PARAMETER
;
3583 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3584 return EFI_INVALID_PARAMETER
;
3587 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3589 // Retrieve the current keyboard layout.
3591 if (KeyGuid
== NULL
) {
3592 if (Private
->CurrentLayout
== NULL
) {
3593 return EFI_NOT_FOUND
;
3595 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3596 if (*KeyboardLayoutLength
< LayoutLength
) {
3597 *KeyboardLayoutLength
= LayoutLength
;
3598 return EFI_BUFFER_TOO_SMALL
;
3600 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3604 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3605 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3606 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3607 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3608 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3609 Link1
= Link1
->ForwardLink
3613 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3615 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3618 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3619 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3620 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3621 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3622 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3623 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3624 if (LayoutLength
<= *KeyboardLayoutLength
) {
3625 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3628 *KeyboardLayoutLength
= LayoutLength
;
3629 return EFI_BUFFER_TOO_SMALL
;
3632 Layout
= Layout
+ LayoutLength
;
3637 return EFI_NOT_FOUND
;
3642 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3643 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3644 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3645 can be notified of this change.
3647 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3649 @param KeyGuid A pointer to the unique ID associated with a given
3652 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3653 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3655 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3660 HiiSetKeyboardLayout (
3661 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3662 IN CONST EFI_GUID
*KeyGuid
3665 HII_DATABASE_PRIVATE_DATA
*Private
;
3666 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3667 UINT16 KeyboardLayoutLength
;
3670 if (This
== NULL
|| KeyGuid
== NULL
) {
3671 return EFI_INVALID_PARAMETER
;
3674 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3677 // The specified GUID equals the current keyboard layout GUID,
3680 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3685 // Try to find the incoming keyboard layout data in current database.
3687 KeyboardLayoutLength
= 0;
3688 KeyboardLayout
= NULL
;
3689 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3690 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3694 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3695 ASSERT (KeyboardLayout
!= NULL
);
3696 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3697 ASSERT_EFI_ERROR (Status
);
3700 // Backup current keyboard layout.
3702 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3703 if (Private
->CurrentLayout
!= NULL
) {
3704 FreePool(Private
->CurrentLayout
);
3706 Private
->CurrentLayout
= KeyboardLayout
;
3709 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3710 // current keyboard layout is changed.
3712 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3713 ASSERT_EFI_ERROR (Status
);
3720 Return the EFI handle associated with a package list.
3722 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3724 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3725 package list in the HIIdatabase.
3726 @param DriverHandle On return, contains the EFI_HANDLE which was
3727 registered with the package list in
3730 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3731 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3732 DriverHandle was NULL.
3733 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3739 HiiGetPackageListHandle (
3740 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3741 IN EFI_HII_HANDLE PackageListHandle
,
3742 OUT EFI_HANDLE
*DriverHandle
3745 HII_DATABASE_PRIVATE_DATA
*Private
;
3746 HII_DATABASE_RECORD
*Node
;
3749 if (This
== NULL
|| DriverHandle
== NULL
) {
3750 return EFI_INVALID_PARAMETER
;
3753 if (!IsHiiHandleValid (PackageListHandle
)) {
3754 return EFI_INVALID_PARAMETER
;
3757 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3759 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3760 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3761 if (Node
->Handle
== PackageListHandle
) {
3762 *DriverHandle
= Node
->DriverHandle
;
3767 return EFI_NOT_FOUND
;