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 ((Buffer
!= NULL
) && (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
;
787 CHAR8
*MatchedLanguage
;
791 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
792 return EFI_INVALID_PARAMETER
;
794 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
795 return EFI_INVALID_PARAMETER
;
798 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
799 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
802 // It is illegal to have two string packages with same language within one packagelist
803 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
805 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
806 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
807 if (Language
== NULL
) {
808 return EFI_OUT_OF_RESOURCES
;
810 AsciiStrCpy (Language
, (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
811 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
812 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
813 MatchedLanguage
= GetBestLanguage (StringPackage
->StringPkgHdr
->Language
, FALSE
, (CHAR8
*) Language
, NULL
);
814 if (MatchedLanguage
!= NULL
) {
816 FreePool (MatchedLanguage
);
817 return EFI_UNSUPPORTED
;
823 // Create a String package node
825 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
826 if (StringPackage
== NULL
) {
827 Status
= EFI_OUT_OF_RESOURCES
;
831 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
832 if (StringPackage
->StringPkgHdr
== NULL
) {
833 Status
= EFI_OUT_OF_RESOURCES
;
837 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
838 if (StringPackage
->StringBlock
== NULL
) {
839 Status
= EFI_OUT_OF_RESOURCES
;
843 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
844 StringPackage
->FontId
= 0;
845 InitializeListHead (&StringPackage
->FontInfoList
);
848 // Copy the String package header.
850 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
853 // Copy the String blocks
856 StringPackage
->StringBlock
,
857 (UINT8
*) PackageHdr
+ HeaderSize
,
858 PackageHeader
.Length
- HeaderSize
862 // Collect all font block info
864 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, NULL
);
865 if (EFI_ERROR (Status
)) {
870 // Insert to String package array
872 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
873 *Package
= StringPackage
;
875 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
876 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
883 if (StringPackage
!= NULL
) {
884 if (StringPackage
->StringBlock
!= NULL
) {
885 FreePool (StringPackage
->StringBlock
);
887 if (StringPackage
->StringPkgHdr
!= NULL
) {
888 FreePool (StringPackage
->StringPkgHdr
);
890 FreePool (StringPackage
);
898 This function exports String packages to a buffer.
899 This is a internal function.
901 @param Private Hii database private structure.
902 @param Handle Identification of a package list.
903 @param PackageList Pointer to a package list which will be exported.
904 @param UsedSize The length of buffer be used.
905 @param BufferSize Length of the Buffer.
906 @param Buffer Allocated space for storing exported data.
907 @param ResultSize The size of the already exported content of this
910 @retval EFI_SUCCESS String Packages are exported successfully.
911 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
915 ExportStringPackages (
916 IN HII_DATABASE_PRIVATE_DATA
*Private
,
917 IN EFI_HII_HANDLE Handle
,
918 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
922 IN OUT UINTN
*ResultSize
928 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
930 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
931 return EFI_INVALID_PARAMETER
;
934 if (BufferSize
> 0 && Buffer
== NULL
) {
935 return EFI_INVALID_PARAMETER
;
939 Status
= EFI_SUCCESS
;
941 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
942 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
943 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
944 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
946 // Invoke registered notification function with EXPORT_PACK notify type
948 Status
= InvokeRegisteredFunction (
950 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
951 (VOID
*) StringPackage
,
952 EFI_HII_PACKAGE_STRINGS
,
955 ASSERT_EFI_ERROR (Status
);
957 // Copy String package header
959 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
960 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
963 // Copy String blocks information
967 StringPackage
->StringBlock
,
968 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
970 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
974 *ResultSize
+= PackageLength
;
980 This function deletes all String packages from a package list node.
981 This is a internal function.
983 @param Private Hii database private data.
984 @param Handle Handle of the package list which contains the to
985 be removed String packages.
986 @param PackageList Pointer to a package list that contains removing
989 @retval EFI_SUCCESS String Package(s) is deleted successfully.
990 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
994 RemoveStringPackages (
995 IN HII_DATABASE_PRIVATE_DATA
*Private
,
996 IN EFI_HII_HANDLE Handle
,
997 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1000 LIST_ENTRY
*ListHead
;
1001 HII_STRING_PACKAGE_INSTANCE
*Package
;
1002 HII_FONT_INFO
*FontInfo
;
1005 ListHead
= &PackageList
->StringPkgHdr
;
1007 while (!IsListEmpty (ListHead
)) {
1009 ListHead
->ForwardLink
,
1010 HII_STRING_PACKAGE_INSTANCE
,
1012 HII_STRING_PACKAGE_SIGNATURE
1014 Status
= InvokeRegisteredFunction (
1016 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1018 EFI_HII_PACKAGE_STRINGS
,
1021 if (EFI_ERROR (Status
)) {
1025 RemoveEntryList (&Package
->StringEntry
);
1026 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1027 FreePool (Package
->StringBlock
);
1028 FreePool (Package
->StringPkgHdr
);
1030 // Delete font information
1032 while (!IsListEmpty (&Package
->FontInfoList
)) {
1034 Package
->FontInfoList
.ForwardLink
,
1037 HII_FONT_INFO_SIGNATURE
1039 RemoveEntryList (&FontInfo
->Entry
);
1040 FreePool (FontInfo
);
1051 This function insert a Font package to a package list node.
1052 This is a internal function.
1054 @param Private Hii database private structure.
1055 @param PackageHdr Pointer to a buffer stored with Font package
1057 @param NotifyType The type of change concerning the database.
1058 @param PackageList Pointer to a package list which will be inserted
1060 @param Package Created Font package
1062 @retval EFI_SUCCESS Font Package is inserted successfully.
1063 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1065 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1066 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1067 exists in current hii database.
1072 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1073 IN VOID
*PackageHdr
,
1074 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1075 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1076 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1079 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1080 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1083 EFI_HII_PACKAGE_HEADER PackageHeader
;
1084 EFI_FONT_INFO
*FontInfo
;
1085 UINT32 FontInfoSize
;
1086 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1088 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1089 return EFI_INVALID_PARAMETER
;
1092 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1093 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1100 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1101 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1102 // attributes and identify a font uniquely.
1104 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1105 if (FontPkgHdr
== NULL
) {
1106 Status
= EFI_OUT_OF_RESOURCES
;
1109 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1111 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1112 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1113 if (FontInfo
== NULL
) {
1114 Status
= EFI_OUT_OF_RESOURCES
;
1117 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1118 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1119 StrCpy (FontInfo
->FontName
, FontPkgHdr
->FontFamily
);
1121 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1122 Status
= EFI_UNSUPPORTED
;
1127 // Create a Font package node
1129 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1130 if (FontPackage
== NULL
) {
1131 Status
= EFI_OUT_OF_RESOURCES
;
1134 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1135 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1136 InitializeListHead (&FontPackage
->GlyphInfoList
);
1138 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1139 if (FontPackage
->GlyphBlock
== NULL
) {
1140 Status
= EFI_OUT_OF_RESOURCES
;
1143 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1146 // Collect all default character cell information and backup in GlyphInfoList.
1148 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1149 if (EFI_ERROR (Status
)) {
1154 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1157 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1158 if (GlobalFont
== NULL
) {
1159 Status
= EFI_OUT_OF_RESOURCES
;
1162 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1163 GlobalFont
->FontPackage
= FontPackage
;
1164 GlobalFont
->FontInfoSize
= FontInfoSize
;
1165 GlobalFont
->FontInfo
= FontInfo
;
1166 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1169 // Insert this font package to Font package array
1171 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1172 *Package
= FontPackage
;
1174 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1175 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1182 if (FontPkgHdr
!= NULL
) {
1183 FreePool (FontPkgHdr
);
1185 if (FontInfo
!= NULL
) {
1186 FreePool (FontInfo
);
1188 if (FontPackage
!= NULL
) {
1189 if (FontPackage
->GlyphBlock
!= NULL
) {
1190 FreePool (FontPackage
->GlyphBlock
);
1192 FreePool (FontPackage
);
1194 if (GlobalFont
!= NULL
) {
1195 FreePool (GlobalFont
);
1204 This function exports Font packages to a buffer.
1205 This is a internal function.
1207 @param Private Hii database private structure.
1208 @param Handle Identification of a package list.
1209 @param PackageList Pointer to a package list which will be exported.
1210 @param UsedSize The length of buffer be used.
1211 @param BufferSize Length of the Buffer.
1212 @param Buffer Allocated space for storing exported data.
1213 @param ResultSize The size of the already exported content of this
1216 @retval EFI_SUCCESS Font Packages are exported successfully.
1217 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1221 ExportFontPackages (
1222 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1223 IN EFI_HII_HANDLE Handle
,
1224 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1226 IN UINTN BufferSize
,
1227 IN OUT VOID
*Buffer
,
1228 IN OUT UINTN
*ResultSize
1232 UINTN PackageLength
;
1234 HII_FONT_PACKAGE_INSTANCE
*Package
;
1237 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1238 return EFI_INVALID_PARAMETER
;
1241 if (BufferSize
> 0 && Buffer
== NULL
) {
1242 return EFI_INVALID_PARAMETER
;
1246 Status
= EFI_SUCCESS
;
1248 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1249 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1250 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1251 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1253 // Invoke registered notification function with EXPORT_PACK notify type
1255 Status
= InvokeRegisteredFunction (
1257 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1259 EFI_HII_PACKAGE_FONTS
,
1262 ASSERT_EFI_ERROR (Status
);
1264 // Copy Font package header
1266 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1267 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1270 // Copy Glyph blocks information
1274 Package
->GlyphBlock
,
1275 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1277 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1281 *ResultSize
+= PackageLength
;
1287 This function deletes all Font packages from a package list node.
1288 This is a internal function.
1290 @param Private Hii database private data.
1291 @param Handle Handle of the package list which contains the to
1292 be removed Font packages.
1293 @param PackageList Pointer to a package list that contains removing
1296 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1297 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1301 RemoveFontPackages (
1302 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1303 IN EFI_HII_HANDLE Handle
,
1304 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1307 LIST_ENTRY
*ListHead
;
1308 HII_FONT_PACKAGE_INSTANCE
*Package
;
1310 HII_GLYPH_INFO
*GlyphInfo
;
1312 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1314 ListHead
= &PackageList
->FontPkgHdr
;
1316 while (!IsListEmpty (ListHead
)) {
1318 ListHead
->ForwardLink
,
1319 HII_FONT_PACKAGE_INSTANCE
,
1321 HII_FONT_PACKAGE_SIGNATURE
1323 Status
= InvokeRegisteredFunction (
1325 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1327 EFI_HII_PACKAGE_FONTS
,
1330 if (EFI_ERROR (Status
)) {
1334 RemoveEntryList (&Package
->FontEntry
);
1335 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1337 if (Package
->GlyphBlock
!= NULL
) {
1338 FreePool (Package
->GlyphBlock
);
1340 FreePool (Package
->FontPkgHdr
);
1342 // Delete default character cell information
1344 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1346 Package
->GlyphInfoList
.ForwardLink
,
1349 HII_GLYPH_INFO_SIGNATURE
1351 RemoveEntryList (&GlyphInfo
->Entry
);
1352 FreePool (GlyphInfo
);
1356 // Remove corresponding global font info
1358 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1359 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1360 if (GlobalFont
->FontPackage
== Package
) {
1361 RemoveEntryList (&GlobalFont
->Entry
);
1362 FreePool (GlobalFont
->FontInfo
);
1363 FreePool (GlobalFont
);
1376 This function insert a Image package to a package list node.
1377 This is a internal function.
1379 @param PackageHdr Pointer to a buffer stored with Image package
1381 @param NotifyType The type of change concerning the database.
1382 @param PackageList Pointer to a package list which will be inserted
1384 @param Package Created Image package
1386 @retval EFI_SUCCESS Image Package is inserted successfully.
1387 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1389 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1393 InsertImagePackage (
1394 IN VOID
*PackageHdr
,
1395 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1396 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1397 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1400 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1404 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1405 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1406 UINT32 PaletteInfoOffset
;
1407 UINT32 ImageInfoOffset
;
1410 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1411 return EFI_INVALID_PARAMETER
;
1415 // Less than one image package is allowed in one package list.
1417 if (PackageList
->ImagePkg
!= NULL
) {
1418 return EFI_INVALID_PARAMETER
;
1422 // Create a Image package node
1424 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1425 if (ImagePackage
== NULL
) {
1426 return EFI_OUT_OF_RESOURCES
;
1430 // Copy the Image package header.
1432 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1434 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1435 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1438 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1441 ImagePackage
->PaletteBlock
= NULL
;
1442 if (PaletteInfoOffset
!= 0) {
1443 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1444 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1445 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1447 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1448 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1449 CurrentSize
+= sizeof (UINT16
);
1450 PaletteSize
+= (UINT32
) CurrentSize
;
1451 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1454 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1455 if (ImagePackage
->PaletteBlock
== NULL
) {
1456 FreePool (ImagePackage
);
1457 return EFI_OUT_OF_RESOURCES
;
1460 ImagePackage
->PaletteBlock
,
1461 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1467 // If ImageInfoOffset is zero, there are no images in this package.
1470 ImagePackage
->ImageBlock
= NULL
;
1471 if (ImageInfoOffset
!= 0) {
1472 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1473 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1474 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1475 if (ImagePackage
->ImageBlock
== NULL
) {
1476 FreePool (ImagePackage
->PaletteBlock
);
1477 FreePool (ImagePackage
);
1478 return EFI_OUT_OF_RESOURCES
;
1481 ImagePackage
->ImageBlock
,
1482 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1487 ImagePackage
->ImageBlockSize
= ImageSize
;
1488 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1489 PackageList
->ImagePkg
= ImagePackage
;
1490 *Package
= ImagePackage
;
1492 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1493 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1501 This function exports Image packages to a buffer.
1502 This is a internal function.
1504 @param Private Hii database private structure.
1505 @param Handle Identification of a package list.
1506 @param PackageList Pointer to a package list which will be exported.
1507 @param UsedSize The length of buffer be used.
1508 @param BufferSize Length of the Buffer.
1509 @param Buffer Allocated space for storing exported data.
1510 @param ResultSize The size of the already exported content of this
1513 @retval EFI_SUCCESS Image Packages are exported successfully.
1514 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1518 ExportImagePackages (
1519 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1520 IN EFI_HII_HANDLE Handle
,
1521 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1523 IN UINTN BufferSize
,
1524 IN OUT VOID
*Buffer
,
1525 IN OUT UINTN
*ResultSize
1528 UINTN PackageLength
;
1530 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1533 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1534 return EFI_INVALID_PARAMETER
;
1537 if (BufferSize
> 0 && Buffer
== NULL
) {
1538 return EFI_INVALID_PARAMETER
;
1541 Package
= PackageList
->ImagePkg
;
1543 if (Package
== NULL
) {
1547 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1549 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1551 // Invoke registered notification function with EXPORT_PACK notify type
1553 Status
= InvokeRegisteredFunction (
1555 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1557 EFI_HII_PACKAGE_IMAGES
,
1560 ASSERT_EFI_ERROR (Status
);
1561 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1562 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1564 // Copy Image package header,
1565 // then justify the offset for image info and palette info in the header.
1567 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1568 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1571 // Copy Image blocks information
1573 if (Package
->ImageBlockSize
!= 0) {
1574 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1575 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1578 // Copy Palette information
1580 if (Package
->PaletteInfoSize
!= 0) {
1581 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1582 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1586 *ResultSize
+= PackageLength
;
1592 This function deletes Image package from a package list node.
1593 This is a internal function.
1595 @param Private Hii database private data.
1596 @param Handle Handle of the package list which contains the to
1597 be removed Image packages.
1598 @param PackageList Package List which contains the to be removed
1601 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1602 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1606 RemoveImagePackages (
1607 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1608 IN EFI_HII_HANDLE Handle
,
1609 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1612 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1615 Package
= PackageList
->ImagePkg
;
1618 // Image package does not exist, return directly.
1620 if (Package
== NULL
) {
1624 Status
= InvokeRegisteredFunction (
1626 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1628 EFI_HII_PACKAGE_IMAGES
,
1631 if (EFI_ERROR (Status
)) {
1635 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1637 FreePool (Package
->ImageBlock
);
1638 if (Package
->PaletteBlock
!= NULL
) {
1639 FreePool (Package
->PaletteBlock
);
1643 PackageList
->ImagePkg
= NULL
;
1650 This function insert a Simple Font package to a package list node.
1651 This is a internal function.
1653 @param PackageHdr Pointer to a buffer stored with Simple Font
1654 package information.
1655 @param NotifyType The type of change concerning the database.
1656 @param PackageList Pointer to a package list which will be inserted
1658 @param Package Created Simple Font package
1660 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1661 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1662 Simple Font package.
1663 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1667 InsertSimpleFontPackage (
1668 IN VOID
*PackageHdr
,
1669 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1670 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1671 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1674 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1676 EFI_HII_PACKAGE_HEADER Header
;
1678 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1679 return EFI_INVALID_PARAMETER
;
1683 // Create a Simple Font package node
1685 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1686 if (SimpleFontPackage
== NULL
) {
1687 Status
= EFI_OUT_OF_RESOURCES
;
1690 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1693 // Copy the Simple Font package.
1695 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1697 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1698 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1699 Status
= EFI_OUT_OF_RESOURCES
;
1703 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1706 // Insert to Simple Font package array
1708 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1709 *Package
= SimpleFontPackage
;
1711 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1712 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1719 if (SimpleFontPackage
!= NULL
) {
1720 if (SimpleFontPackage
->SimpleFontPkgHdr
!= NULL
) {
1721 FreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1723 FreePool (SimpleFontPackage
);
1730 This function exports SimpleFont packages to a buffer.
1731 This is a internal function.
1733 @param Private Hii database private structure.
1734 @param Handle Identification of a package list.
1735 @param PackageList Pointer to a package list which will be exported.
1736 @param UsedSize The length of buffer be used.
1737 @param BufferSize Length of the Buffer.
1738 @param Buffer Allocated space for storing exported data.
1739 @param ResultSize The size of the already exported content of this
1742 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1743 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1747 ExportSimpleFontPackages (
1748 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1749 IN EFI_HII_HANDLE Handle
,
1750 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1752 IN UINTN BufferSize
,
1753 IN OUT VOID
*Buffer
,
1754 IN OUT UINTN
*ResultSize
1758 UINTN PackageLength
;
1760 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1762 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1763 return EFI_INVALID_PARAMETER
;
1766 if (BufferSize
> 0 && Buffer
== NULL
) {
1767 return EFI_INVALID_PARAMETER
;
1771 Status
= EFI_SUCCESS
;
1773 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1774 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1775 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1776 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1778 // Invoke registered notification function with EXPORT_PACK notify type
1780 Status
= InvokeRegisteredFunction (
1782 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1784 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1787 ASSERT_EFI_ERROR (Status
);
1790 // Copy SimpleFont package
1792 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1793 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1797 *ResultSize
+= PackageLength
;
1803 This function deletes all Simple Font packages from a package list node.
1804 This is a internal function.
1806 @param Private Hii database private data.
1807 @param Handle Handle of the package list which contains the to
1808 be removed Simple Font packages.
1809 @param PackageList Pointer to a package list that contains removing
1812 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1813 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1817 RemoveSimpleFontPackages (
1818 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1819 IN EFI_HII_HANDLE Handle
,
1820 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1823 LIST_ENTRY
*ListHead
;
1824 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1827 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1829 while (!IsListEmpty (ListHead
)) {
1831 ListHead
->ForwardLink
,
1832 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1834 HII_S_FONT_PACKAGE_SIGNATURE
1836 Status
= InvokeRegisteredFunction (
1838 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1840 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1843 if (EFI_ERROR (Status
)) {
1847 RemoveEntryList (&Package
->SimpleFontEntry
);
1848 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1849 FreePool (Package
->SimpleFontPkgHdr
);
1858 This function insert a Device path package to a package list node.
1859 This is a internal function.
1861 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1863 @param NotifyType The type of change concerning the database.
1864 @param PackageList Pointer to a package list which will be inserted
1867 @retval EFI_SUCCESS Device path Package is inserted successfully.
1868 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1869 Device path package.
1870 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1874 InsertDevicePathPackage (
1875 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1876 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1877 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1880 UINT32 PackageLength
;
1881 EFI_HII_PACKAGE_HEADER Header
;
1883 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1884 return EFI_INVALID_PARAMETER
;
1887 // Less than one device path package is allowed in one package list.
1889 if (PackageList
->DevicePathPkg
!= NULL
) {
1890 return EFI_INVALID_PARAMETER
;
1893 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1894 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1895 if (PackageList
->DevicePathPkg
== NULL
) {
1896 return EFI_OUT_OF_RESOURCES
;
1899 Header
.Length
= PackageLength
;
1900 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1901 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1903 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1905 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1909 // Since Device Path package is created by NewPackageList, either NEW_PACK
1910 // or ADD_PACK should increase the length of package list.
1912 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1918 This function exports device path package to a buffer.
1919 This is a internal function.
1921 @param Private Hii database private structure.
1922 @param Handle Identification of a package list.
1923 @param PackageList Pointer to a package list which will be exported.
1924 @param UsedSize The length of buffer be used.
1925 @param BufferSize Length of the Buffer.
1926 @param Buffer Allocated space for storing exported data.
1927 @param ResultSize The size of the already exported content of this
1930 @retval EFI_SUCCESS Device path Package is exported successfully.
1931 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1935 ExportDevicePathPackage (
1936 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1937 IN EFI_HII_HANDLE Handle
,
1938 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1940 IN UINTN BufferSize
,
1941 IN OUT VOID
*Buffer
,
1942 IN OUT UINTN
*ResultSize
1947 EFI_HII_PACKAGE_HEADER Header
;
1949 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1950 return EFI_INVALID_PARAMETER
;
1952 if (BufferSize
> 0 && Buffer
== NULL
) {
1953 return EFI_INVALID_PARAMETER
;
1956 Package
= PackageList
->DevicePathPkg
;
1958 if (Package
== NULL
) {
1962 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
1964 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1966 // Invoke registered notification function with EXPORT_PACK notify type
1968 Status
= InvokeRegisteredFunction (
1970 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1972 EFI_HII_PACKAGE_DEVICE_PATH
,
1975 ASSERT_EFI_ERROR (Status
);
1978 // Copy Device path package
1980 CopyMem (Buffer
, Package
, Header
.Length
);
1983 *ResultSize
+= Header
.Length
;
1989 This function deletes Device Path package from a package list node.
1990 This is a internal function.
1992 @param Private Hii database private data.
1993 @param Handle Handle of the package list.
1994 @param PackageList Package List which contains the to be removed
1995 Device Path package.
1997 @retval EFI_SUCCESS Device Path Package is deleted successfully.
1998 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2002 RemoveDevicePathPackage (
2003 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2004 IN EFI_HII_HANDLE Handle
,
2005 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2010 EFI_HII_PACKAGE_HEADER Header
;
2012 Package
= PackageList
->DevicePathPkg
;
2015 // No device path, return directly.
2017 if (Package
== NULL
) {
2021 Status
= InvokeRegisteredFunction (
2023 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2025 EFI_HII_PACKAGE_DEVICE_PATH
,
2028 if (EFI_ERROR (Status
)) {
2032 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2033 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2037 PackageList
->DevicePathPkg
= NULL
;
2044 This function will insert a device path package to package list firstly then
2045 invoke notification functions if any.
2046 This is a internal function.
2048 @param Private Hii database private structure.
2049 @param NotifyType The type of change concerning the database.
2050 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2052 @param DatabaseRecord Pointer to a database record contains a package
2053 list which will be inserted to.
2055 @retval EFI_SUCCESS Device path Package is inserted successfully.
2056 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2057 Device path package.
2058 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2062 AddDevicePathPackage (
2063 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2064 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2065 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2066 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2071 if (DevicePath
== NULL
) {
2075 ASSERT (Private
!= NULL
);
2076 ASSERT (DatabaseRecord
!= NULL
);
2079 // Create a device path package and insert to packagelist
2081 Status
= InsertDevicePathPackage (
2084 DatabaseRecord
->PackageList
2086 if (EFI_ERROR (Status
)) {
2090 return InvokeRegisteredFunction (
2093 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2094 EFI_HII_PACKAGE_DEVICE_PATH
,
2095 DatabaseRecord
->Handle
2101 This function insert a Keyboard Layout package to a package list node.
2102 This is a internal function.
2104 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2105 package information.
2106 @param NotifyType The type of change concerning the database.
2107 @param PackageList Pointer to a package list which will be inserted
2109 @param Package Created Keyboard Layout package
2111 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2112 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2113 Keyboard Layout package.
2114 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2118 InsertKeyboardLayoutPackage (
2119 IN VOID
*PackageHdr
,
2120 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2121 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2122 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2125 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2126 EFI_HII_PACKAGE_HEADER PackageHeader
;
2129 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2130 return EFI_INVALID_PARAMETER
;
2133 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2136 // Create a Keyboard Layout package node
2138 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2139 if (KeyboardLayoutPackage
== NULL
) {
2140 Status
= EFI_OUT_OF_RESOURCES
;
2143 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2145 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2146 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2147 Status
= EFI_OUT_OF_RESOURCES
;
2151 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2152 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2154 *Package
= KeyboardLayoutPackage
;
2156 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2157 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2165 if (KeyboardLayoutPackage
!= NULL
) {
2166 if (KeyboardLayoutPackage
->KeyboardPkg
!= NULL
) {
2167 FreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2169 FreePool (KeyboardLayoutPackage
);
2177 This function exports Keyboard Layout packages to a buffer.
2178 This is a internal function.
2180 @param Private Hii database private structure.
2181 @param Handle Identification of a package list.
2182 @param PackageList Pointer to a package list which will be exported.
2183 @param UsedSize The length of buffer be used.
2184 @param BufferSize Length of the Buffer.
2185 @param Buffer Allocated space for storing exported data.
2186 @param ResultSize The size of the already exported content of this
2189 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2191 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2195 ExportKeyboardLayoutPackages (
2196 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2197 IN EFI_HII_HANDLE Handle
,
2198 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2200 IN UINTN BufferSize
,
2201 IN OUT VOID
*Buffer
,
2202 IN OUT UINTN
*ResultSize
2206 UINTN PackageLength
;
2208 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2209 EFI_HII_PACKAGE_HEADER PackageHeader
;
2211 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2212 return EFI_INVALID_PARAMETER
;
2215 if (BufferSize
> 0 && Buffer
== NULL
) {
2216 return EFI_INVALID_PARAMETER
;
2220 Status
= EFI_SUCCESS
;
2222 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2223 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2224 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2225 PackageLength
+= PackageHeader
.Length
;
2226 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2228 // Invoke registered notification function with EXPORT_PACK notify type
2230 Status
= InvokeRegisteredFunction (
2232 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2233 (EFI_HII_PACKAGE_HEADER
*) Package
,
2234 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2237 ASSERT_EFI_ERROR (Status
);
2240 // Copy Keyboard Layout package
2242 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2243 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2247 *ResultSize
+= PackageLength
;
2253 This function deletes all Keyboard Layout packages from a package list node.
2254 This is a internal function.
2256 @param Private Hii database private data.
2257 @param Handle Handle of the package list which contains the to
2258 be removed Keyboard Layout packages.
2259 @param PackageList Pointer to a package list that contains removing
2262 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2264 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2268 RemoveKeyboardLayoutPackages (
2269 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2270 IN EFI_HII_HANDLE Handle
,
2271 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2274 LIST_ENTRY
*ListHead
;
2275 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2276 EFI_HII_PACKAGE_HEADER PackageHeader
;
2279 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2281 while (!IsListEmpty (ListHead
)) {
2283 ListHead
->ForwardLink
,
2284 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2286 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2288 Status
= InvokeRegisteredFunction (
2290 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2292 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2295 if (EFI_ERROR (Status
)) {
2299 RemoveEntryList (&Package
->KeyboardEntry
);
2300 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2301 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2302 FreePool (Package
->KeyboardPkg
);
2311 This function will insert a package list to hii database firstly then
2312 invoke notification functions if any. It is the worker function of
2313 HiiNewPackageList and HiiUpdatePackageList.
2315 This is a internal function.
2317 @param Private Hii database private structure.
2318 @param NotifyType The type of change concerning the database.
2319 @param PackageList Pointer to a package list.
2320 @param DatabaseRecord Pointer to a database record contains a package
2321 list instance which will be inserted to.
2323 @retval EFI_SUCCESS All incoming packages are inserted to current
2325 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2326 Device path package.
2327 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2332 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2333 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2334 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2335 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2339 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2340 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2341 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2342 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2343 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2344 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2345 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2346 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2347 EFI_HII_PACKAGE_HEADER PackageHeader
;
2348 UINT32 OldPackageListLen
;
2351 // Initialize Variables
2356 // Process the package list header
2358 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2360 &DatabaseRecord
->PackageList
->PackageListHdr
,
2361 (VOID
*) PackageList
,
2362 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2364 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2365 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2368 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2369 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2371 Status
= EFI_SUCCESS
;
2373 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2374 switch (PackageHeader
.Type
) {
2375 case EFI_HII_PACKAGE_TYPE_GUID
:
2376 Status
= InsertGuidPackage (
2379 DatabaseRecord
->PackageList
,
2382 if (EFI_ERROR (Status
)) {
2385 Status
= InvokeRegisteredFunction (
2388 (VOID
*) GuidPackage
,
2389 (UINT8
) (PackageHeader
.Type
),
2390 DatabaseRecord
->Handle
2393 case EFI_HII_PACKAGE_FORMS
:
2394 Status
= InsertFormPackage (
2397 DatabaseRecord
->PackageList
,
2400 if (EFI_ERROR (Status
)) {
2403 Status
= InvokeRegisteredFunction (
2406 (VOID
*) FormPackage
,
2407 (UINT8
) (PackageHeader
.Type
),
2408 DatabaseRecord
->Handle
2411 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2412 Status
= InsertKeyboardLayoutPackage (
2415 DatabaseRecord
->PackageList
,
2416 &KeyboardLayoutPackage
2418 if (EFI_ERROR (Status
)) {
2421 Status
= InvokeRegisteredFunction (
2424 (VOID
*) KeyboardLayoutPackage
,
2425 (UINT8
) (PackageHeader
.Type
),
2426 DatabaseRecord
->Handle
2429 case EFI_HII_PACKAGE_STRINGS
:
2430 Status
= InsertStringPackage (
2434 DatabaseRecord
->PackageList
,
2437 if (EFI_ERROR (Status
)) {
2440 Status
= InvokeRegisteredFunction (
2443 (VOID
*) StringPackage
,
2444 (UINT8
) (PackageHeader
.Type
),
2445 DatabaseRecord
->Handle
2448 case EFI_HII_PACKAGE_FONTS
:
2449 Status
= InsertFontPackage (
2453 DatabaseRecord
->PackageList
,
2456 if (EFI_ERROR (Status
)) {
2459 Status
= InvokeRegisteredFunction (
2462 (VOID
*) FontPackage
,
2463 (UINT8
) (PackageHeader
.Type
),
2464 DatabaseRecord
->Handle
2467 case EFI_HII_PACKAGE_IMAGES
:
2468 Status
= InsertImagePackage (
2471 DatabaseRecord
->PackageList
,
2474 if (EFI_ERROR (Status
)) {
2477 Status
= InvokeRegisteredFunction (
2480 (VOID
*) ImagePackage
,
2481 (UINT8
) (PackageHeader
.Type
),
2482 DatabaseRecord
->Handle
2485 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2486 Status
= InsertSimpleFontPackage (
2489 DatabaseRecord
->PackageList
,
2492 if (EFI_ERROR (Status
)) {
2495 Status
= InvokeRegisteredFunction (
2498 (VOID
*) SimpleFontPackage
,
2499 (UINT8
) (PackageHeader
.Type
),
2500 DatabaseRecord
->Handle
2503 case EFI_HII_PACKAGE_DEVICE_PATH
:
2504 Status
= AddDevicePathPackage (
2507 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2515 if (EFI_ERROR (Status
)) {
2519 // goto header of next package
2521 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2522 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2530 This function exports a package list to a buffer. It is the worker function
2531 of HiiExportPackageList.
2533 This is a internal function.
2535 @param Private Hii database private structure.
2536 @param Handle Identification of a package list.
2537 @param PackageList Pointer to a package list which will be exported.
2538 @param UsedSize The length of buffer has been used by exporting
2539 package lists when Handle is NULL.
2540 @param BufferSize Length of the Buffer.
2541 @param Buffer Allocated space for storing exported data.
2543 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2545 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2550 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2551 IN EFI_HII_HANDLE Handle
,
2552 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2553 IN OUT UINTN
*UsedSize
,
2554 IN UINTN BufferSize
,
2555 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2560 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2562 ASSERT (Private
!= NULL
&& PackageList
!= NULL
&& UsedSize
!= NULL
);
2563 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2564 ASSERT (IsHiiHandleValid (Handle
));
2566 if (BufferSize
> 0 && Buffer
== NULL
) {
2567 return EFI_INVALID_PARAMETER
;
2571 // Copy the package list header
2572 // ResultSize indicates the length of the exported bytes of this package list
2574 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2575 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2576 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2579 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2581 Status
= ExportGuidPackages (
2587 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2590 if (EFI_ERROR (Status
)) {
2593 Status
= ExportFormPackages (
2599 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2602 if (EFI_ERROR (Status
)) {
2605 Status
= ExportKeyboardLayoutPackages (
2611 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2614 if (EFI_ERROR (Status
)) {
2617 Status
= ExportStringPackages (
2623 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2626 if (EFI_ERROR (Status
)) {
2629 Status
= ExportFontPackages (
2635 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2638 if (EFI_ERROR (Status
)) {
2641 Status
= ExportImagePackages (
2647 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2650 if (EFI_ERROR (Status
)) {
2653 Status
= ExportSimpleFontPackages (
2659 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2662 if (EFI_ERROR (Status
)) {
2665 Status
= ExportDevicePathPackage (
2671 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2674 if (EFI_ERROR (Status
)) {
2678 // Append the package list end.
2680 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2681 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2682 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2684 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2685 (VOID
*) &EndofPackageList
,
2686 sizeof (EFI_HII_PACKAGE_HEADER
)
2690 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2697 This function adds the packages in the package list to the database and returns a handle. If there is a
2698 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2699 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2701 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2703 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2705 @param DriverHandle Associate the package list with this EFI handle.
2706 @param Handle A pointer to the EFI_HII_HANDLE instance.
2708 @retval EFI_SUCCESS The package list associated with the Handle was
2709 added to the HII database.
2710 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2712 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2713 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2719 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2720 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2721 IN CONST EFI_HANDLE DriverHandle
,
2722 OUT EFI_HII_HANDLE
*Handle
2726 HII_DATABASE_PRIVATE_DATA
*Private
;
2727 HII_DATABASE_RECORD
*DatabaseRecord
;
2728 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2730 EFI_GUID PackageListGuid
;
2732 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2733 return EFI_INVALID_PARAMETER
;
2736 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2737 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2740 // Check the Package list GUID to guarantee this GUID is unique in database.
2742 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2743 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2745 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2749 return EFI_INVALID_PARAMETER
;
2754 // Build a PackageList node
2756 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2757 if (EFI_ERROR (Status
)) {
2762 // Fill in information of the created Package List node
2763 // according to incoming package list.
2765 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2766 if (EFI_ERROR (Status
)) {
2770 DatabaseRecord
->DriverHandle
= DriverHandle
;
2773 // Create a Device path package and add into the package list if exists.
2775 Status
= gBS
->HandleProtocol (
2777 &gEfiDevicePathProtocolGuid
,
2778 (VOID
**) &DevicePath
2780 if (!EFI_ERROR (Status
)) {
2781 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2782 ASSERT_EFI_ERROR (Status
);
2785 *Handle
= DatabaseRecord
->Handle
;
2791 This function removes the package list that is associated with a handle Handle
2792 from the HII database. Before removing the package, any registered functions
2793 with the notification type REMOVE_PACK and the same package type will be called.
2795 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2797 @param Handle The handle that was registered to the data that is
2798 requested for removal.
2800 @retval EFI_SUCCESS The data associated with the Handle was removed
2801 from the HII database.
2802 @retval EFI_NOT_FOUND The specified andle is not in database.
2803 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2808 HiiRemovePackageList (
2809 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2810 IN EFI_HII_HANDLE Handle
2814 HII_DATABASE_PRIVATE_DATA
*Private
;
2816 HII_DATABASE_RECORD
*Node
;
2817 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2818 HII_HANDLE
*HiiHandle
;
2821 return EFI_INVALID_PARAMETER
;
2824 if (!IsHiiHandleValid (Handle
)) {
2825 return EFI_NOT_FOUND
;
2828 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2831 // Get the packagelist to be removed.
2833 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2834 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2835 if (Node
->Handle
== Handle
) {
2836 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2837 ASSERT (PackageList
!= NULL
);
2840 // Call registered functions with REMOVE_PACK before removing packages
2841 // then remove them.
2843 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2844 if (EFI_ERROR (Status
)) {
2847 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2848 if (EFI_ERROR (Status
)) {
2851 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2852 if (EFI_ERROR (Status
)) {
2855 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2856 if (EFI_ERROR (Status
)) {
2859 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2860 if (EFI_ERROR (Status
)) {
2863 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2864 if (EFI_ERROR (Status
)) {
2867 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2868 if (EFI_ERROR (Status
)) {
2871 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2872 if (EFI_ERROR (Status
)) {
2877 // Free resources of the package list
2879 RemoveEntryList (&Node
->DatabaseEntry
);
2881 HiiHandle
= (HII_HANDLE
*) Handle
;
2882 RemoveEntryList (&HiiHandle
->Handle
);
2883 Private
->HiiHandleCount
--;
2884 ASSERT (Private
->HiiHandleCount
>= 0);
2886 HiiHandle
->Signature
= 0;
2887 FreePool (HiiHandle
);
2888 FreePool (Node
->PackageList
);
2895 return EFI_NOT_FOUND
;
2900 This function updates the existing package list (which has the specified Handle)
2901 in the HII databases, using the new package list specified by PackageList.
2903 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2905 @param Handle The handle that was registered to the data that is
2906 requested to be updated.
2907 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2910 @retval EFI_SUCCESS The HII database was successfully updated.
2911 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2913 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2914 @retval EFI_NOT_FOUND The specified Handle is not in database.
2919 HiiUpdatePackageList (
2920 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2921 IN EFI_HII_HANDLE Handle
,
2922 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
2926 HII_DATABASE_PRIVATE_DATA
*Private
;
2928 HII_DATABASE_RECORD
*Node
;
2929 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2930 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
2931 EFI_HII_PACKAGE_HEADER PackageHeader
;
2933 if (This
== NULL
|| PackageList
== NULL
) {
2934 return EFI_INVALID_PARAMETER
;
2937 if (!IsHiiHandleValid (Handle
)) {
2938 return EFI_NOT_FOUND
;
2941 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2943 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2945 Status
= EFI_SUCCESS
;
2948 // Get original packagelist to be updated
2950 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2951 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2952 if (Node
->Handle
== Handle
) {
2953 OldPackageList
= Node
->PackageList
;
2955 // Remove the package if its type matches one of the package types which is
2956 // contained in the new package list.
2958 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2959 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2960 switch (PackageHeader
.Type
) {
2961 case EFI_HII_PACKAGE_TYPE_GUID
:
2962 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
2964 case EFI_HII_PACKAGE_FORMS
:
2965 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
2967 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2968 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
2970 case EFI_HII_PACKAGE_STRINGS
:
2971 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
2973 case EFI_HII_PACKAGE_FONTS
:
2974 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
2976 case EFI_HII_PACKAGE_IMAGES
:
2977 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
2979 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2980 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
2982 case EFI_HII_PACKAGE_DEVICE_PATH
:
2983 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
2987 if (EFI_ERROR (Status
)) {
2991 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2992 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2996 // Add all of the packages within the new package list
2998 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
3002 return EFI_NOT_FOUND
;
3007 This function returns a list of the package handles of the specified type
3008 that are currently active in the database. The pseudo-type
3009 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
3011 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3013 @param PackageType Specifies the package type of the packages to list
3014 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3016 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3017 this is the pointer to the GUID which must match
3018 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
3019 Otherwise, it must be NULL.
3020 @param HandleBufferLength On input, a pointer to the length of the handle
3021 buffer. On output, the length of the handle
3022 buffer that is required for the handles found.
3023 @param Handle An array of EFI_HII_HANDLE instances returned.
3025 @retval EFI_SUCCESS The matching handles are outputed successfully.
3026 HandleBufferLength is updated with the actual length.
3027 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3028 Handle is too small to support the number of
3029 handles. HandleBufferLength is updated with a
3030 value that will enable the data to fit.
3031 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3032 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3034 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3035 PackageGuid is not NULL, PackageType is a EFI_HII_
3036 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3041 HiiListPackageLists (
3042 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3043 IN UINT8 PackageType
,
3044 IN CONST EFI_GUID
*PackageGuid
,
3045 IN OUT UINTN
*HandleBufferLength
,
3046 OUT EFI_HII_HANDLE
*Handle
3049 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3050 HII_DATABASE_PRIVATE_DATA
*Private
;
3051 HII_DATABASE_RECORD
*Node
;
3054 HII_HANDLE
**Result
;
3056 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3060 // Check input parameters
3062 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3063 return EFI_INVALID_PARAMETER
;
3065 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3066 return EFI_INVALID_PARAMETER
;
3068 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3069 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3070 return EFI_INVALID_PARAMETER
;
3073 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3075 Result
= (HII_HANDLE
**) Handle
;
3078 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3079 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3080 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3081 switch (PackageType
) {
3082 case EFI_HII_PACKAGE_TYPE_GUID
:
3083 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3084 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3086 (EFI_GUID
*) PackageGuid
,
3087 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3094 case EFI_HII_PACKAGE_FORMS
:
3095 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3099 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3100 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3104 case EFI_HII_PACKAGE_STRINGS
:
3105 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3109 case EFI_HII_PACKAGE_FONTS
:
3110 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3114 case EFI_HII_PACKAGE_IMAGES
:
3115 if (PackageList
->ImagePkg
!= NULL
) {
3119 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3120 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3124 case EFI_HII_PACKAGE_DEVICE_PATH
:
3125 if (PackageList
->DevicePathPkg
!= NULL
) {
3130 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3133 case EFI_HII_PACKAGE_TYPE_ALL
:
3141 // This active package list has the specified package type, list it.
3144 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3145 if (ResultSize
<= *HandleBufferLength
) {
3146 *Result
++ = Node
->Handle
;
3152 if (ResultSize
== 0) {
3153 return EFI_NOT_FOUND
;
3156 if (*HandleBufferLength
< ResultSize
) {
3157 *HandleBufferLength
= ResultSize
;
3158 return EFI_BUFFER_TOO_SMALL
;
3161 *HandleBufferLength
= ResultSize
;
3167 This function will export one or all package lists in the database to a buffer.
3168 For each package list exported, this function will call functions registered
3169 with EXPORT_PACK and then copy the package list to the buffer.
3171 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3173 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3174 package list in the HII database to export or NULL
3175 to indicate all package lists should be exported.
3176 @param BufferSize On input, a pointer to the length of the buffer.
3177 On output, the length of the buffer that is
3178 required for the exported data.
3179 @param Buffer A pointer to a buffer that will contain the
3180 results of the export function.
3182 @retval EFI_SUCCESS Package exported.
3183 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3184 Handle is too small to support the number of
3185 handles. HandleBufferLength is updated with a
3186 value that will enable the data to fit.
3187 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3189 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3194 HiiExportPackageLists (
3195 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3196 IN EFI_HII_HANDLE Handle
,
3197 IN OUT UINTN
*BufferSize
,
3198 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3203 HII_DATABASE_PRIVATE_DATA
*Private
;
3204 HII_DATABASE_RECORD
*Node
;
3207 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3208 return EFI_INVALID_PARAMETER
;
3210 if (*BufferSize
> 0 && Buffer
== NULL
) {
3211 return EFI_INVALID_PARAMETER
;
3213 if (!IsHiiHandleValid (Handle
)) {
3214 return EFI_NOT_FOUND
;
3217 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3220 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3221 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3222 if (Handle
== NULL
) {
3224 // Export all package lists in current hii database.
3226 Status
= ExportPackageList (
3229 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3232 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3234 ASSERT_EFI_ERROR (Status
);
3235 } else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3236 Status
= ExportPackageList (
3239 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3244 ASSERT_EFI_ERROR (Status
);
3245 if (*BufferSize
< UsedSize
) {
3246 *BufferSize
= UsedSize
;
3247 return EFI_BUFFER_TOO_SMALL
;
3253 if (Handle
== NULL
&& UsedSize
!= 0) {
3254 if (*BufferSize
< UsedSize
) {
3255 *BufferSize
= UsedSize
;
3256 return EFI_BUFFER_TOO_SMALL
;
3261 return EFI_NOT_FOUND
;
3266 This function registers a function which will be called when specified actions related to packages of
3267 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3268 notified when specific package types are added, removed or updated in the HII database.
3269 Each driver or application which registers a notification should use
3270 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3272 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3274 @param PackageType Specifies the package type of the packages to list
3275 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3277 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3278 this is the pointer to the GUID which must match
3280 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3282 @param PackageNotifyFn Points to the function to be called when the event
3284 NotificationType occurs.
3285 @param NotifyType Describes the types of notification which this
3286 function will be receiving.
3287 @param NotifyHandle Points to the unique handle assigned to the
3288 registered notification. Can be used in
3289 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3290 to stop notifications.
3292 @retval EFI_SUCCESS Notification registered successfully.
3293 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3294 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3295 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3296 EFI_HII_PACKAGE_TYPE_GUID.
3297 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3298 EFI_HII_PACKAGE_TYPE_GUID.
3303 HiiRegisterPackageNotify (
3304 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3305 IN UINT8 PackageType
,
3306 IN CONST EFI_GUID
*PackageGuid
,
3307 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3308 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3309 OUT EFI_HANDLE
*NotifyHandle
3312 HII_DATABASE_PRIVATE_DATA
*Private
;
3313 HII_DATABASE_NOTIFY
*Notify
;
3316 if (This
== NULL
|| NotifyHandle
== NULL
) {
3317 return EFI_INVALID_PARAMETER
;
3319 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3320 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3321 return EFI_INVALID_PARAMETER
;
3324 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3327 // Allocate a notification node
3329 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3330 if (Notify
== NULL
) {
3331 return EFI_OUT_OF_RESOURCES
;
3335 // Generate a notify handle
3337 Status
= gBS
->InstallMultipleProtocolInterfaces (
3338 &Notify
->NotifyHandle
,
3339 &mHiiDatabaseNotifyGuid
,
3343 ASSERT_EFI_ERROR (Status
);
3346 // Fill in the information to the notification node
3348 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3349 Notify
->PackageType
= PackageType
;
3350 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3351 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3352 Notify
->NotifyType
= NotifyType
;
3354 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3355 *NotifyHandle
= Notify
->NotifyHandle
;
3362 Removes the specified HII database package-related notification.
3364 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3366 @param NotificationHandle The handle of the notification function being
3369 @retval EFI_SUCCESS Notification is unregistered successfully.
3370 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3371 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3372 in current hii database.
3377 HiiUnregisterPackageNotify (
3378 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3379 IN EFI_HANDLE NotificationHandle
3382 HII_DATABASE_PRIVATE_DATA
*Private
;
3383 HII_DATABASE_NOTIFY
*Notify
;
3388 return EFI_INVALID_PARAMETER
;
3391 if (NotificationHandle
== NULL
) {
3392 return EFI_NOT_FOUND
;
3395 Status
= gBS
->OpenProtocol (
3397 &mHiiDatabaseNotifyGuid
,
3401 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3403 if (EFI_ERROR (Status
)) {
3404 return EFI_NOT_FOUND
;
3407 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3409 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3410 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3411 if (Notify
->NotifyHandle
== NotificationHandle
) {
3413 // Remove the matching notification node
3415 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3416 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3417 Notify
->NotifyHandle
,
3418 &mHiiDatabaseNotifyGuid
,
3422 ASSERT_EFI_ERROR (Status
);
3429 return EFI_NOT_FOUND
;
3434 This routine retrieves an array of GUID values for each keyboard layout that
3435 was previously registered in the system.
3437 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3439 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3440 GUID buffer. On output, the length of the handle
3441 buffer that is required for the handles found.
3442 @param KeyGuidBuffer An array of keyboard layout GUID instances
3445 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3446 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3447 that KeyGuidBuffer is too small to support the
3448 number of GUIDs. KeyGuidBufferLength is
3449 updated with a value that will enable the data to
3451 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3452 @retval EFI_NOT_FOUND There was no keyboard layout.
3457 HiiFindKeyboardLayouts (
3458 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3459 IN OUT UINT16
*KeyGuidBufferLength
,
3460 OUT EFI_GUID
*KeyGuidBuffer
3463 HII_DATABASE_PRIVATE_DATA
*Private
;
3464 HII_DATABASE_RECORD
*Node
;
3465 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3471 UINT16 LayoutLength
;
3473 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3475 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3476 return EFI_INVALID_PARAMETER
;
3479 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3480 return EFI_INVALID_PARAMETER
;
3483 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3487 // Search all package lists in whole database to retrieve keyboard layout.
3489 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3490 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3491 PackageList
= Node
->PackageList
;
3492 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3493 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3494 Link1
= Link1
->ForwardLink
3497 // Find out all Keyboard Layout packages in this package list.
3501 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3503 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3505 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3508 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3511 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3512 ResultSize
+= sizeof (EFI_GUID
);
3513 if (ResultSize
<= *KeyGuidBufferLength
) {
3514 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3515 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3516 Layout
= Layout
+ LayoutLength
;
3522 if (ResultSize
== 0) {
3523 return EFI_NOT_FOUND
;
3526 if (*KeyGuidBufferLength
< ResultSize
) {
3527 *KeyGuidBufferLength
= ResultSize
;
3528 return EFI_BUFFER_TOO_SMALL
;
3531 *KeyGuidBufferLength
= ResultSize
;
3537 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3538 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3540 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3542 @param KeyGuid A pointer to the unique ID associated with a given
3543 keyboard layout. If KeyGuid is NULL then the
3544 current layout will be retrieved.
3545 @param KeyboardLayoutLength On input, a pointer to the length of the
3546 KeyboardLayout buffer. On output, the length of
3547 the data placed into KeyboardLayout.
3548 @param KeyboardLayout A pointer to a buffer containing the retrieved
3551 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3552 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3553 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3555 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3556 that KeyboardLayout is too small to support the
3557 requested keyboard layout. KeyboardLayoutLength is
3558 updated with a value that will enable the
3564 HiiGetKeyboardLayout (
3565 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3566 IN CONST EFI_GUID
*KeyGuid
,
3567 IN OUT UINT16
*KeyboardLayoutLength
,
3568 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3571 HII_DATABASE_PRIVATE_DATA
*Private
;
3572 HII_DATABASE_RECORD
*Node
;
3573 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3579 UINT16 LayoutLength
;
3580 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3582 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3583 return EFI_INVALID_PARAMETER
;
3585 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3586 return EFI_INVALID_PARAMETER
;
3589 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3591 // Retrieve the current keyboard layout.
3593 if (KeyGuid
== NULL
) {
3594 if (Private
->CurrentLayout
== NULL
) {
3595 return EFI_NOT_FOUND
;
3597 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3598 if (*KeyboardLayoutLength
< LayoutLength
) {
3599 *KeyboardLayoutLength
= LayoutLength
;
3600 return EFI_BUFFER_TOO_SMALL
;
3602 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3606 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3607 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3608 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3609 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3610 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3611 Link1
= Link1
->ForwardLink
3615 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3617 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3620 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3621 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3622 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3623 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3624 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3625 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3626 if (LayoutLength
<= *KeyboardLayoutLength
) {
3627 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3630 *KeyboardLayoutLength
= LayoutLength
;
3631 return EFI_BUFFER_TOO_SMALL
;
3634 Layout
= Layout
+ LayoutLength
;
3639 return EFI_NOT_FOUND
;
3644 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3645 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3646 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3647 can be notified of this change.
3649 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3651 @param KeyGuid A pointer to the unique ID associated with a given
3654 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3655 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3657 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3662 HiiSetKeyboardLayout (
3663 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3664 IN CONST EFI_GUID
*KeyGuid
3667 HII_DATABASE_PRIVATE_DATA
*Private
;
3668 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3669 UINT16 KeyboardLayoutLength
;
3672 if (This
== NULL
|| KeyGuid
== NULL
) {
3673 return EFI_INVALID_PARAMETER
;
3676 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3679 // The specified GUID equals the current keyboard layout GUID,
3682 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3687 // Try to find the incoming keyboard layout data in current database.
3689 KeyboardLayoutLength
= 0;
3690 KeyboardLayout
= NULL
;
3691 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3692 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3696 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3697 ASSERT (KeyboardLayout
!= NULL
);
3698 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3699 ASSERT_EFI_ERROR (Status
);
3702 // Backup current keyboard layout.
3704 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3705 if (Private
->CurrentLayout
!= NULL
) {
3706 FreePool(Private
->CurrentLayout
);
3708 Private
->CurrentLayout
= KeyboardLayout
;
3711 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3712 // current keyboard layout is changed.
3714 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3715 ASSERT_EFI_ERROR (Status
);
3722 Return the EFI handle associated with a package list.
3724 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3726 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3727 package list in the HIIdatabase.
3728 @param DriverHandle On return, contains the EFI_HANDLE which was
3729 registered with the package list in
3732 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3733 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3734 DriverHandle was NULL.
3735 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3741 HiiGetPackageListHandle (
3742 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3743 IN EFI_HII_HANDLE PackageListHandle
,
3744 OUT EFI_HANDLE
*DriverHandle
3747 HII_DATABASE_PRIVATE_DATA
*Private
;
3748 HII_DATABASE_RECORD
*Node
;
3751 if (This
== NULL
|| DriverHandle
== NULL
) {
3752 return EFI_INVALID_PARAMETER
;
3755 if (!IsHiiHandleValid (PackageListHandle
)) {
3756 return EFI_INVALID_PARAMETER
;
3759 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3761 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3762 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3763 if (Node
->Handle
== PackageListHandle
) {
3764 *DriverHandle
= Node
->DriverHandle
;
3769 return EFI_NOT_FOUND
;