2 HII Library implementation that uses DXE protocols and services.
4 Copyright (c) 2006, Intel Corporation<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "InternalHiiLib.h"
17 EFI_HII_DATABASE_PROTOCOL
*mHiiDatabaseProt
;
18 EFI_HII_STRING_PROTOCOL
*mHiiStringProt
;
21 The constructor function of Hii Library.
23 The constructor function caches the value of default HII protocol instances.
25 @param ImageHandle The firmware allocated handle for the EFI image.
26 @param SystemTable A pointer to the EFI System Table.
28 @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
33 UefiHiiLibConstructor (
34 IN EFI_HANDLE ImageHandle
,
35 IN EFI_SYSTEM_TABLE
*SystemTable
40 Status
= gBS
->LocateProtocol (
41 &gEfiHiiDatabaseProtocolGuid
,
43 (VOID
**) &mHiiDatabaseProt
45 ASSERT_EFI_ERROR (Status
);
46 ASSERT (mHiiDatabaseProt
!= NULL
);
48 Status
= gBS
->LocateProtocol (
49 &gEfiHiiStringProtocolGuid
,
51 (VOID
**) &mHiiStringProt
53 ASSERT_EFI_ERROR (Status
);
54 ASSERT (mHiiStringProt
!= NULL
);
61 EFI_HII_PACKAGE_LIST_HEADER
*
62 InternalHiiLibPreparePackages (
63 IN UINTN NumberOfPackages
,
64 IN CONST EFI_GUID
*GuidId
, OPTIONAL
68 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
69 UINT8
*PackageListData
;
70 UINT32 PackageListLength
;
72 EFI_HII_PACKAGE_HEADER PackageHeader
;
77 PackageListLength
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
79 MarkerBackup
= Marker
;
81 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
82 CopyMem (&PackageLength
, VA_ARG (Marker
, VOID
*), sizeof (UINT32
));
83 PackageListLength
+= (PackageLength
- sizeof (UINT32
));
87 // Include the lenght of EFI_HII_PACKAGE_END
89 PackageListLength
+= sizeof (EFI_HII_PACKAGE_HEADER
);
90 PackageListHeader
= AllocateZeroPool (PackageListLength
);
91 ASSERT (PackageListHeader
!= NULL
);
92 CopyMem (&PackageListHeader
->PackageListGuid
, GuidId
, sizeof (EFI_GUID
));
93 PackageListHeader
->PackageLength
= PackageListLength
;
95 PackageListData
= ((UINT8
*) PackageListHeader
) + sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
97 Marker
= MarkerBackup
;
98 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
99 PackageArray
= (UINT8
*) VA_ARG (Marker
, VOID
*);
100 CopyMem (&PackageLength
, PackageArray
, sizeof (UINT32
));
101 PackageLength
-= sizeof (UINT32
);
102 PackageArray
+= sizeof (UINT32
);
103 CopyMem (PackageListData
, PackageArray
, PackageLength
);
104 PackageListData
+= PackageLength
;
108 // Append EFI_HII_PACKAGE_END
110 PackageHeader
.Type
= EFI_HII_PACKAGE_END
;
111 PackageHeader
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
112 CopyMem (PackageListData
, &PackageHeader
, PackageHeader
.Length
);
114 return PackageListHeader
;
117 EFI_HII_PACKAGE_LIST_HEADER
*
119 HiiLibPreparePackageList (
120 IN UINTN NumberOfPackages
,
121 IN CONST EFI_GUID
*GuidId
,
125 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
128 ASSERT (GuidId
!= NULL
);
130 VA_START (Marker
, GuidId
);
131 PackageListHeader
= InternalHiiLibPreparePackages (NumberOfPackages
, GuidId
, Marker
);
134 return PackageListHeader
;
141 IN UINTN NumberOfPackages
,
142 IN CONST EFI_GUID
*GuidId
,
143 IN EFI_HANDLE DriverHandle
, OPTIONAL
144 OUT EFI_HII_HANDLE
*HiiHandle
, OPTIONAL
149 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
152 ASSERT (HiiHandle
!= NULL
);
154 VA_START (Args
, HiiHandle
);
155 PackageListHeader
= InternalHiiLibPreparePackages (NumberOfPackages
, GuidId
, Args
);
157 Status
= mHiiDatabaseProt
->NewPackageList (mHiiDatabaseProt
, PackageListHeader
, DriverHandle
, HiiHandle
);
158 if (HiiHandle
!= NULL
) {
159 if (EFI_ERROR (Status
)) {
164 FreePool (PackageListHeader
);
172 HiiLibAddFontPackageToHiiDatabase (
174 IN CONST UINT8
*FontBinary
,
175 IN CONST EFI_GUID
*GuidId
,
176 OUT EFI_HII_HANDLE
*HiiHandle OPTIONAL
181 EFI_HII_SIMPLE_FONT_PACKAGE_HDR
*SimplifiedFont
;
183 EFI_HII_PACKAGE_LIST_HEADER
*PackageList
;
187 // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.
188 // Looks ugly. Might be updated when font tool is ready.
190 PackageLength
= sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR
) + FontSize
+ 4;
191 Package
= AllocateZeroPool (PackageLength
);
192 if (Package
== NULL
) {
193 return EFI_OUT_OF_RESOURCES
;
195 CopyMem (Package
, &PackageLength
, 4);
196 SimplifiedFont
= (EFI_HII_SIMPLE_FONT_PACKAGE_HDR
*) (Package
+ 4);
197 SimplifiedFont
->Header
.Length
= (UINT32
) (PackageLength
- 4);
198 SimplifiedFont
->Header
.Type
= EFI_HII_PACKAGE_SIMPLE_FONTS
;
199 SimplifiedFont
->NumberOfNarrowGlyphs
= (UINT16
) (FontSize
/ sizeof (EFI_NARROW_GLYPH
));
201 Location
= (UINT8
*) (&SimplifiedFont
->NumberOfWideGlyphs
+ 1);
202 CopyMem (Location
, FontBinary
, FontSize
);
205 // Add this simplified font package to a package list then install it.
207 PackageList
= HiiLibPreparePackageList (1, GuidId
, Package
);
208 Status
= mHiiDatabaseProt
->NewPackageList (mHiiDatabaseProt
, PackageList
, NULL
, HiiHandle
);
209 ASSERT_EFI_ERROR (Status
);
210 SafeFreePool (PackageList
);
211 SafeFreePool (Package
);
218 HiiLibRemovePackages (
219 IN EFI_HII_HANDLE HiiHandle
224 ASSERT (HiiHandle
!= NULL
);
225 Status
= mHiiDatabaseProt
->RemovePackageList (mHiiDatabaseProt
, HiiHandle
);
226 ASSERT_EFI_ERROR (Status
);
232 HiiLibGetHiiHandles (
233 IN OUT UINTN
*HandleBufferLength
,
234 OUT EFI_HII_HANDLE
**HiiHandleBuffer
240 ASSERT (HandleBufferLength
!= NULL
);
241 ASSERT (HiiHandleBuffer
!= NULL
);
246 // Try to find the actual buffer size for HiiHandle Buffer.
248 Status
= mHiiDatabaseProt
->ListPackageLists (
250 EFI_HII_PACKAGE_TYPE_ALL
,
256 if (Status
== EFI_BUFFER_TOO_SMALL
) {
257 *HiiHandleBuffer
= AllocateZeroPool (BufferLength
);
258 Status
= mHiiDatabaseProt
->ListPackageLists (
260 EFI_HII_PACKAGE_TYPE_ALL
,
266 // we should not fail here.
268 ASSERT_EFI_ERROR (Status
);
271 *HandleBufferLength
= BufferLength
;
278 HiiLibExtractGuidFromHiiHandle (
279 IN EFI_HII_HANDLE Handle
,
285 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
287 ASSERT (Guid
!= NULL
);
290 // Get HII PackageList
293 HiiPackageList
= NULL
;
294 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
295 ASSERT (Status
!= EFI_NOT_FOUND
);
297 if (Status
== EFI_BUFFER_TOO_SMALL
) {
298 HiiPackageList
= AllocatePool (BufferSize
);
299 ASSERT (HiiPackageList
!= NULL
);
301 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
303 if (EFI_ERROR (Status
)) {
310 CopyMem (Guid
, &HiiPackageList
->PackageListGuid
, sizeof (EFI_GUID
));
312 gBS
->FreePool (HiiPackageList
);
319 HiiLibDevicePathToHiiHandle (
320 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
324 EFI_DEVICE_PATH_PROTOCOL
*TmpDevicePath
;
331 EFI_HANDLE DriverHandle
;
332 EFI_HII_HANDLE
*HiiHandles
;
333 EFI_HII_HANDLE HiiHandle
;
335 ASSERT (DevicePath
!= NULL
);
338 // Locate Device Path Protocol handle buffer
340 Status
= gBS
->LocateHandleBuffer (
342 &gEfiDevicePathProtocolGuid
,
347 if (EFI_ERROR (Status
)) {
352 // Search Driver Handle by Device Path
355 BufferSize
= GetDevicePathSize (DevicePath
);
356 for(Index
= 0; Index
< HandleCount
; Index
++) {
357 Handle
= Handles
[Index
];
358 gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**) &TmpDevicePath
);
361 // Check whether DevicePath match
363 Size
= GetDevicePathSize (TmpDevicePath
);
364 if ((Size
== BufferSize
) && CompareMem (DevicePath
, TmpDevicePath
, Size
) == 0) {
365 DriverHandle
= Handle
;
369 gBS
->FreePool (Handles
);
371 if (DriverHandle
== NULL
) {
376 // Retrieve all Hii Handles from HII database
379 HiiHandles
= AllocatePool (BufferSize
);
380 ASSERT (HiiHandles
!= NULL
);
381 Status
= mHiiDatabaseProt
->ListPackageLists (
383 EFI_HII_PACKAGE_TYPE_ALL
,
388 if (Status
== EFI_BUFFER_TOO_SMALL
) {
389 gBS
->FreePool (HiiHandles
);
390 HiiHandles
= AllocatePool (BufferSize
);
391 ASSERT (HiiHandles
!= NULL
);
393 Status
= mHiiDatabaseProt
->ListPackageLists (
395 EFI_HII_PACKAGE_TYPE_ALL
,
402 if (EFI_ERROR (Status
)) {
403 gBS
->FreePool (HiiHandles
);
408 // Search Hii Handle by Driver Handle
411 HandleCount
= BufferSize
/ sizeof (EFI_HII_HANDLE
);
412 for (Index
= 0; Index
< HandleCount
; Index
++) {
413 Status
= mHiiDatabaseProt
->GetPackageListHandle (
418 if (!EFI_ERROR (Status
) && (Handle
== DriverHandle
)) {
419 HiiHandle
= HiiHandles
[Index
];
424 gBS
->FreePool (HiiHandles
);
429 IsHiiHandleRegistered (
430 EFI_HII_HANDLE HiiHandle
435 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
437 ASSERT (HiiHandle
!= NULL
);
439 HiiPackageList
= NULL
;
441 Status
= mHiiDatabaseProt
->ExportPackageLists (
448 return (BOOLEAN
) (Status
== EFI_BUFFER_TOO_SMALL
);