3 Copyright (c) 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Common Library Routines to assist handle HII elements.
23 #include "UefiIfrLibraryInternal.h"
26 // Hii relative protocols
28 BOOLEAN mHiiProtocolsInitialized
= FALSE
;
30 EFI_HII_DATABASE_PROTOCOL
*gIfrLibHiiDatabase
;
31 EFI_HII_STRING_PROTOCOL
*gIfrLibHiiString
;
35 This function locate Hii relative protocols for later usage.
49 if (mHiiProtocolsInitialized
) {
53 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
54 ASSERT_EFI_ERROR (Status
);
56 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
57 ASSERT_EFI_ERROR (Status
);
59 mHiiProtocolsInitialized
= TRUE
;
64 Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.
66 @param NumberOfPackages Number of packages.
67 @param GuidId Package GUID.
69 @return Pointer of EFI_HII_PACKAGE_LIST_HEADER.
72 EFI_HII_PACKAGE_LIST_HEADER
*
74 IN UINTN NumberOfPackages
,
80 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
81 UINT8
*PackageListData
;
82 UINT32 PackageListLength
;
84 EFI_HII_PACKAGE_HEADER PackageHeader
;
88 PackageListLength
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
90 VA_START (Marker
, GuidId
);
91 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
92 CopyMem (&PackageLength
, VA_ARG (Marker
, VOID
*), sizeof (UINT32
));
93 PackageListLength
+= (PackageLength
- sizeof (UINT32
));
98 // Include the lenght of EFI_HII_PACKAGE_END
100 PackageListLength
+= sizeof (EFI_HII_PACKAGE_HEADER
);
101 PackageListHeader
= AllocateZeroPool (PackageListLength
);
102 ASSERT (PackageListHeader
!= NULL
);
103 CopyMem (&PackageListHeader
->PackageListGuid
, GuidId
, sizeof (EFI_GUID
));
104 PackageListHeader
->PackageLength
= PackageListLength
;
106 PackageListData
= ((UINT8
*) PackageListHeader
) + sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
108 VA_START (Marker
, GuidId
);
109 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
110 PackageArray
= (UINT8
*) VA_ARG (Marker
, VOID
*);
111 CopyMem (&PackageLength
, PackageArray
, sizeof (UINT32
));
112 PackageLength
-= sizeof (UINT32
);
113 PackageArray
+= sizeof (UINT32
);
114 CopyMem (PackageListData
, PackageArray
, PackageLength
);
115 PackageListData
+= PackageLength
;
120 // Append EFI_HII_PACKAGE_END
122 PackageHeader
.Type
= EFI_HII_PACKAGE_END
;
123 PackageHeader
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
124 CopyMem (PackageListData
, &PackageHeader
, PackageHeader
.Length
);
126 return PackageListHeader
;
131 Find HII Handle associated with given Device Path.
133 @param HiiDatabase Point to EFI_HII_DATABASE_PROTOCOL instance.
134 @param DevicePath Device Path associated with the HII package list
137 @retval Handle HII package list Handle associated with the Device
139 @retval NULL Hii Package list handle is not found.
143 DevicePathToHiiHandle (
144 IN EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
,
145 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
149 EFI_DEVICE_PATH_PROTOCOL
*TmpDevicePath
;
156 EFI_HANDLE DriverHandle
;
157 EFI_HII_HANDLE
*HiiHandles
;
158 EFI_HII_HANDLE HiiHandle
;
161 // Locate Device Path Protocol handle buffer
163 Status
= gBS
->LocateHandleBuffer (
165 &gEfiDevicePathProtocolGuid
,
170 if (EFI_ERROR (Status
)) {
175 // Search Driver Handle by Device Path
178 BufferSize
= GetDevicePathSize (DevicePath
);
179 for(Index
= 0; Index
< HandleCount
; Index
++) {
180 Handle
= Handles
[Index
];
181 gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**) &TmpDevicePath
);
184 // Check whether DevicePath match
186 Size
= GetDevicePathSize (TmpDevicePath
);
187 if ((Size
== BufferSize
) && CompareMem (DevicePath
, TmpDevicePath
, Size
) == 0) {
188 DriverHandle
= Handle
;
192 gBS
->FreePool (Handles
);
194 if (DriverHandle
== NULL
) {
199 // Retrieve all Hii Handles from HII database
202 HiiHandles
= AllocatePool (BufferSize
);
203 ASSERT (HiiHandles
!= NULL
);
204 Status
= HiiDatabase
->ListPackageLists (
206 EFI_HII_PACKAGE_TYPE_ALL
,
211 if (Status
== EFI_BUFFER_TOO_SMALL
) {
212 gBS
->FreePool (HiiHandles
);
213 HiiHandles
= AllocatePool (BufferSize
);
214 ASSERT (HiiHandles
!= NULL
);
216 Status
= HiiDatabase
->ListPackageLists (
218 EFI_HII_PACKAGE_TYPE_ALL
,
225 if (EFI_ERROR (Status
)) {
226 gBS
->FreePool (HiiHandles
);
231 // Search Hii Handle by Driver Handle
234 HandleCount
= BufferSize
/ sizeof (EFI_HII_HANDLE
);
235 for (Index
= 0; Index
< HandleCount
; Index
++) {
236 Status
= HiiDatabase
->GetPackageListHandle (
241 if (!EFI_ERROR (Status
) && (Handle
== DriverHandle
)) {
242 HiiHandle
= HiiHandles
[Index
];
247 gBS
->FreePool (HiiHandles
);
253 Determines the handles that are currently active in the database.
254 It's the caller's responsibility to free handle buffer.
256 @param HiiDatabase A pointer to the EFI_HII_DATABASE_PROTOCOL
258 @param HandleBufferLength On input, a pointer to the length of the handle
259 buffer. On output, the length of the handle buffer
260 that is required for the handles found.
261 @param HiiHandleBuffer Pointer to an array of Hii Handles returned.
263 @retval EFI_SUCCESS Get an array of Hii Handles successfully.
264 @retval EFI_INVALID_PARAMETER Hii is NULL.
265 @retval EFI_NOT_FOUND Database not found.
270 IN OUT UINTN
*HandleBufferLength
,
271 OUT EFI_HII_HANDLE
**HiiHandleBuffer
279 LocateHiiProtocols ();
282 // Try to find the actual buffer size for HiiHandle Buffer.
284 Status
= gIfrLibHiiDatabase
->ListPackageLists (
286 EFI_HII_PACKAGE_TYPE_ALL
,
292 if (Status
== EFI_BUFFER_TOO_SMALL
) {
293 *HiiHandleBuffer
= AllocateZeroPool (BufferLength
);
294 Status
= gIfrLibHiiDatabase
->ListPackageLists (
296 EFI_HII_PACKAGE_TYPE_ALL
,
302 // we should not fail here.
304 ASSERT_EFI_ERROR (Status
);
307 *HandleBufferLength
= BufferLength
;
314 Extract Hii package list GUID for given HII handle.
316 @param HiiHandle Hii handle
317 @param Guid Package list GUID
319 @retval EFI_SUCCESS Successfully extract GUID from Hii database.
323 ExtractGuidFromHiiHandle (
324 IN EFI_HII_HANDLE Handle
,
330 EFI_HII_DATABASE_PROTOCOL
*HiiDatabase
;
331 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
334 // Locate HII Database protocol
336 Status
= gBS
->LocateProtocol (
337 &gEfiHiiDatabaseProtocolGuid
,
339 (VOID
**) &HiiDatabase
341 if (EFI_ERROR (Status
)) {
346 // Get HII PackageList
349 HiiPackageList
= NULL
;
350 Status
= HiiDatabase
->ExportPackageLists (HiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
351 if (Status
== EFI_BUFFER_TOO_SMALL
) {
352 HiiPackageList
= AllocatePool (BufferSize
);
353 ASSERT (HiiPackageList
!= NULL
);
355 Status
= HiiDatabase
->ExportPackageLists (HiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
357 if (EFI_ERROR (Status
)) {
364 CopyMem (Guid
, &HiiPackageList
->PackageListGuid
, sizeof (EFI_GUID
));
366 gBS
->FreePool (HiiPackageList
);