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
;
19 BOOLEAN mHiiProtocolsInitialized
= FALSE
;
24 This function locate Hii relative protocols for later usage.
38 if (mHiiProtocolsInitialized
) {
42 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &mHiiDatabaseProt
);
43 ASSERT_EFI_ERROR (Status
);
45 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &mHiiStringProt
);
46 ASSERT_EFI_ERROR (Status
);
48 mHiiProtocolsInitialized
= TRUE
;
53 EFI_HII_PACKAGE_LIST_HEADER
*
54 InternalHiiLibPreparePackages (
55 IN UINTN NumberOfPackages
,
56 IN CONST EFI_GUID
*GuidId
, OPTIONAL
60 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
61 UINT8
*PackageListData
;
62 UINT32 PackageListLength
;
64 EFI_HII_PACKAGE_HEADER PackageHeader
;
69 PackageListLength
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
71 MarkerBackup
= Marker
;
73 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
74 CopyMem (&PackageLength
, VA_ARG (Marker
, VOID
*), sizeof (UINT32
));
75 PackageListLength
+= (PackageLength
- sizeof (UINT32
));
79 // Include the lenght of EFI_HII_PACKAGE_END
81 PackageListLength
+= sizeof (EFI_HII_PACKAGE_HEADER
);
82 PackageListHeader
= AllocateZeroPool (PackageListLength
);
83 ASSERT (PackageListHeader
!= NULL
);
84 CopyMem (&PackageListHeader
->PackageListGuid
, GuidId
, sizeof (EFI_GUID
));
85 PackageListHeader
->PackageLength
= PackageListLength
;
87 PackageListData
= ((UINT8
*) PackageListHeader
) + sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
89 Marker
= MarkerBackup
;
90 for (Index
= 0; Index
< NumberOfPackages
; Index
++) {
91 PackageArray
= (UINT8
*) VA_ARG (Marker
, VOID
*);
92 CopyMem (&PackageLength
, PackageArray
, sizeof (UINT32
));
93 PackageLength
-= sizeof (UINT32
);
94 PackageArray
+= sizeof (UINT32
);
95 CopyMem (PackageListData
, PackageArray
, PackageLength
);
96 PackageListData
+= PackageLength
;
100 // Append EFI_HII_PACKAGE_END
102 PackageHeader
.Type
= EFI_HII_PACKAGE_END
;
103 PackageHeader
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
104 CopyMem (PackageListData
, &PackageHeader
, PackageHeader
.Length
);
106 return PackageListHeader
;
109 EFI_HII_PACKAGE_LIST_HEADER
*
111 HiiLibPreparePackageList (
112 IN UINTN NumberOfPackages
,
113 IN CONST EFI_GUID
*GuidId
,
117 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
120 ASSERT (GuidId
!= NULL
);
122 VA_START (Marker
, GuidId
);
123 PackageListHeader
= InternalHiiLibPreparePackages (NumberOfPackages
, GuidId
, Marker
);
126 return PackageListHeader
;
133 IN UINTN NumberOfPackages
,
134 IN CONST EFI_GUID
*GuidId
,
135 IN EFI_HANDLE DriverHandle
, OPTIONAL
136 OUT EFI_HII_HANDLE
*HiiHandle
, OPTIONAL
141 EFI_HII_PACKAGE_LIST_HEADER
*PackageListHeader
;
144 ASSERT (HiiHandle
!= NULL
);
146 LocateHiiProtocols ();
148 VA_START (Args
, HiiHandle
);
149 PackageListHeader
= InternalHiiLibPreparePackages (NumberOfPackages
, GuidId
, Args
);
151 Status
= mHiiDatabaseProt
->NewPackageList (mHiiDatabaseProt
, PackageListHeader
, DriverHandle
, HiiHandle
);
152 if (HiiHandle
!= NULL
) {
153 if (EFI_ERROR (Status
)) {
158 FreePool (PackageListHeader
);
166 HiiLibRemovePackages (
167 IN EFI_HII_HANDLE HiiHandle
171 ASSERT (HiiHandle
!= NULL
);
173 LocateHiiProtocols ();
175 Status
= mHiiDatabaseProt
->RemovePackageList (mHiiDatabaseProt
, HiiHandle
);
176 ASSERT_EFI_ERROR (Status
);
182 HiiLibGetHiiHandles (
183 IN OUT UINTN
*HandleBufferLength
,
184 OUT EFI_HII_HANDLE
**HiiHandleBuffer
190 ASSERT (HandleBufferLength
!= NULL
);
191 ASSERT (HiiHandleBuffer
!= NULL
);
195 LocateHiiProtocols ();
198 // Try to find the actual buffer size for HiiHandle Buffer.
200 Status
= mHiiDatabaseProt
->ListPackageLists (
202 EFI_HII_PACKAGE_TYPE_ALL
,
208 if (Status
== EFI_BUFFER_TOO_SMALL
) {
209 *HiiHandleBuffer
= AllocateZeroPool (BufferLength
);
210 Status
= mHiiDatabaseProt
->ListPackageLists (
212 EFI_HII_PACKAGE_TYPE_ALL
,
218 // we should not fail here.
220 ASSERT_EFI_ERROR (Status
);
223 *HandleBufferLength
= BufferLength
;
230 HiiLibExtractGuidFromHiiHandle (
231 IN EFI_HII_HANDLE Handle
,
237 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
239 ASSERT (Guid
!= NULL
);
242 // Get HII PackageList
245 HiiPackageList
= NULL
;
247 LocateHiiProtocols ();
249 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
250 ASSERT (Status
!= EFI_NOT_FOUND
);
252 if (Status
== EFI_BUFFER_TOO_SMALL
) {
253 HiiPackageList
= AllocatePool (BufferSize
);
254 ASSERT (HiiPackageList
!= NULL
);
256 Status
= mHiiDatabaseProt
->ExportPackageLists (mHiiDatabaseProt
, Handle
, &BufferSize
, HiiPackageList
);
258 if (EFI_ERROR (Status
)) {
265 CopyMem (Guid
, &HiiPackageList
->PackageListGuid
, sizeof (EFI_GUID
));
267 gBS
->FreePool (HiiPackageList
);
274 HiiLibDevicePathToHiiHandle (
275 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
279 EFI_DEVICE_PATH_PROTOCOL
*TmpDevicePath
;
286 EFI_HANDLE DriverHandle
;
287 EFI_HII_HANDLE
*HiiHandles
;
288 EFI_HII_HANDLE HiiHandle
;
290 ASSERT (DevicePath
!= NULL
);
293 // Locate Device Path Protocol handle buffer
295 Status
= gBS
->LocateHandleBuffer (
297 &gEfiDevicePathProtocolGuid
,
302 if (EFI_ERROR (Status
)) {
307 // Search Driver Handle by Device Path
310 BufferSize
= GetDevicePathSize (DevicePath
);
311 for(Index
= 0; Index
< HandleCount
; Index
++) {
312 Handle
= Handles
[Index
];
313 gBS
->HandleProtocol (Handle
, &gEfiDevicePathProtocolGuid
, (VOID
**) &TmpDevicePath
);
316 // Check whether DevicePath match
318 Size
= GetDevicePathSize (TmpDevicePath
);
319 if ((Size
== BufferSize
) && CompareMem (DevicePath
, TmpDevicePath
, Size
) == 0) {
320 DriverHandle
= Handle
;
324 gBS
->FreePool (Handles
);
326 if (DriverHandle
== NULL
) {
330 LocateHiiProtocols ();
333 // Retrieve all Hii Handles from HII database
336 HiiHandles
= AllocatePool (BufferSize
);
337 ASSERT (HiiHandles
!= NULL
);
338 Status
= mHiiDatabaseProt
->ListPackageLists (
340 EFI_HII_PACKAGE_TYPE_ALL
,
345 if (Status
== EFI_BUFFER_TOO_SMALL
) {
346 gBS
->FreePool (HiiHandles
);
347 HiiHandles
= AllocatePool (BufferSize
);
348 ASSERT (HiiHandles
!= NULL
);
350 Status
= mHiiDatabaseProt
->ListPackageLists (
352 EFI_HII_PACKAGE_TYPE_ALL
,
359 if (EFI_ERROR (Status
)) {
360 gBS
->FreePool (HiiHandles
);
365 // Search Hii Handle by Driver Handle
368 HandleCount
= BufferSize
/ sizeof (EFI_HII_HANDLE
);
369 for (Index
= 0; Index
< HandleCount
; Index
++) {
370 Status
= mHiiDatabaseProt
->GetPackageListHandle (
375 if (!EFI_ERROR (Status
) && (Handle
== DriverHandle
)) {
376 HiiHandle
= HiiHandles
[Index
];
381 gBS
->FreePool (HiiHandles
);
386 IsHiiHandleRegistered (
387 EFI_HII_HANDLE HiiHandle
392 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
394 ASSERT (HiiHandle
!= NULL
);
396 HiiPackageList
= NULL
;
399 LocateHiiProtocols ();
401 Status
= mHiiDatabaseProt
->ExportPackageLists (
408 return (BOOLEAN
) (Status
== EFI_BUFFER_TOO_SMALL
);