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 CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabaseProt
;
18 CONST 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 HiiLibRemovePackages (
173 IN EFI_HII_HANDLE HiiHandle
178 ASSERT (HiiHandle
!= NULL
);
179 Status
= mHiiDatabaseProt
->RemovePackageList (mHiiDatabaseProt
, HiiHandle
);
180 ASSERT_EFI_ERROR (Status
);
186 HiiLibGetHiiHandles (
187 IN OUT UINTN
*HandleBufferLength
,
188 OUT EFI_HII_HANDLE
**HiiHandleBuffer
194 ASSERT (HandleBufferLength
!= NULL
);
195 ASSERT (HiiHandleBuffer
!= NULL
);
200 // Try to find the actual buffer size for HiiHandle Buffer.
202 Status
= mHiiDatabaseProt
->ListPackageLists (
204 EFI_HII_PACKAGE_TYPE_ALL
,
210 if (Status
== EFI_BUFFER_TOO_SMALL
) {
211 *HiiHandleBuffer
= AllocateZeroPool (BufferLength
);
212 Status
= mHiiDatabaseProt
->ListPackageLists (
214 EFI_HII_PACKAGE_TYPE_ALL
,
220 // we should not fail here.
222 ASSERT_EFI_ERROR (Status
);
225 *HandleBufferLength
= BufferLength
;
232 HiiLibExtractGuidFromHiiHandle (
233 IN EFI_HII_HANDLE Handle
,
239 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
241 ASSERT (Guid
!= NULL
);
244 // Get HII PackageList
247 HiiPackageList
= NULL
;
248 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
249 ASSERT (Status
!= EFI_NOT_FOUND
);
251 if (Status
== EFI_BUFFER_TOO_SMALL
) {
252 HiiPackageList
= AllocatePool (BufferSize
);
253 ASSERT (HiiPackageList
!= NULL
);
255 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
257 if (EFI_ERROR (Status
)) {
264 CopyMem (Guid
, &HiiPackageList
->PackageListGuid
, sizeof (EFI_GUID
));
266 gBS
->FreePool (HiiPackageList
);
273 HiiLibDevicePathToHiiHandle (
274 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
278 EFI_DEVICE_PATH_PROTOCOL
*TmpDevicePath
;
285 EFI_HANDLE DriverHandle
;
286 EFI_HII_HANDLE
*HiiHandles
;
287 EFI_HII_HANDLE HiiHandle
;
289 ASSERT (DevicePath
!= NULL
);
292 // Locate Device Path Protocol handle buffer
294 Status
= gBS
->LocateHandleBuffer (
296 &gEfiDevicePathProtocolGuid
,
301 if (EFI_ERROR (Status
)) {
306 // Search Driver Handle by Device Path
309 BufferSize
= GetDevicePathSize (DevicePath
);
310 for(Index
= 0; Index
< HandleCount
; Index
++) {
311 Handle
= Handles
[Index
];
312 gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**) &TmpDevicePath
);
315 // Check whether DevicePath match
317 Size
= GetDevicePathSize (TmpDevicePath
);
318 if ((Size
== BufferSize
) && CompareMem (DevicePath
, TmpDevicePath
, Size
) == 0) {
319 DriverHandle
= Handle
;
323 gBS
->FreePool (Handles
);
325 if (DriverHandle
== NULL
) {
330 // Retrieve all Hii Handles from HII database
333 HiiHandles
= AllocatePool (BufferSize
);
334 ASSERT (HiiHandles
!= NULL
);
335 Status
= mHiiDatabaseProt
->ListPackageLists (
337 EFI_HII_PACKAGE_TYPE_ALL
,
342 if (Status
== EFI_BUFFER_TOO_SMALL
) {
343 gBS
->FreePool (HiiHandles
);
344 HiiHandles
= AllocatePool (BufferSize
);
345 ASSERT (HiiHandles
!= NULL
);
347 Status
= mHiiDatabaseProt
->ListPackageLists (
349 EFI_HII_PACKAGE_TYPE_ALL
,
356 if (EFI_ERROR (Status
)) {
357 gBS
->FreePool (HiiHandles
);
362 // Search Hii Handle by Driver Handle
365 HandleCount
= BufferSize
/ sizeof (EFI_HII_HANDLE
);
366 for (Index
= 0; Index
< HandleCount
; Index
++) {
367 Status
= mHiiDatabaseProt
->GetPackageListHandle (
372 if (!EFI_ERROR (Status
) && (Handle
== DriverHandle
)) {
373 HiiHandle
= HiiHandles
[Index
];
378 gBS
->FreePool (HiiHandles
);
383 IsHiiHandleRegistered (
384 EFI_HII_HANDLE HiiHandle
389 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
391 ASSERT (HiiHandle
!= NULL
);
393 HiiPackageList
= NULL
;
395 Status
= mHiiDatabaseProt
->ExportPackageLists (
402 return (BOOLEAN
) (Status
== EFI_BUFFER_TOO_SMALL
);