]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Forms.c
Add the correct check for the return value before use them.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / Forms.c
CommitLineData
26a76fbc 1/** @file\r
4259256b 2 This file contains the form processing code to the HII database.\r
3\r
26a76fbc 4Copyright (c) 2006 - 2010, Intel Corporation. <BR>\r
4259256b 5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15\r
16#include "HiiDatabase.h"\r
59336178 17#include "UefiIfrDefault.h"\r
4259256b 18\r
0368663f 19//\r
20// This structure is only intended to be used in this file.\r
21//\r
88b6bcec 22#pragma pack(1)\r
ea58467b 23typedef struct {\r
24 EFI_HII_PACK_HEADER PackageHeader;\r
25 FRAMEWORK_EFI_IFR_FORM_SET FormSet;\r
aa2ebe0f 26 EFI_IFR_END_FORM_SET EndFormSet;\r
0368663f 27} FW_HII_FORMSET_TEMPLATE;\r
88b6bcec 28#pragma pack()\r
ea58467b 29\r
0368663f 30FW_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
ea58467b 31 {\r
0368663f 32 sizeof (FW_HII_FORMSET_TEMPLATE),\r
ea58467b 33 EFI_HII_IFR\r
34 },\r
35 {\r
36 {\r
37 FRAMEWORK_EFI_IFR_FORM_SET_OP,\r
38 sizeof (FRAMEWORK_EFI_IFR_FORM_SET)\r
39 },\r
a3318eaf 40 {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}, //Guid\r
ea58467b 41 0,\r
42 0,\r
43 0,\r
44 0,\r
45 0,\r
46 0\r
47 },\r
48 {\r
d7152a15 49 {\r
aa2ebe0f
LG
50 EFI_IFR_END_FORM_SET_OP,\r
51 sizeof (EFI_IFR_END_FORM_SET)\r
d7152a15 52 }\r
ea58467b 53 }\r
54};\r
55\r
4259256b 56\r
a9d85320 57EFI_GUID mTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
58\r
0368663f 59/**\r
4259256b 60\r
0368663f 61 This thunk module only handles UEFI HII packages. The caller of this function \r
1910fbaf 62 won't be able to parse the content. Therefore, it is not supported.\r
0368663f 63 \r
64 This function will ASSERT and return EFI_UNSUPPORTED.\r
4259256b 65\r
0368663f 66 @param This N.A.\r
67 @param Handle N.A.\r
68 @param BufferSize N.A.\r
69 @param Buffer N.A.\r
4259256b 70\r
0368663f 71 @retval EFI_UNSUPPORTED\r
4259256b 72\r
0368663f 73**/\r
74EFI_STATUS\r
75EFIAPI\r
76HiiExportDatabase (\r
77 IN EFI_HII_PROTOCOL *This,\r
78 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
79 IN OUT UINTN *BufferSize,\r
80 OUT VOID *Buffer\r
81 )\r
82{\r
83 ASSERT (FALSE);\r
84 return EFI_UNSUPPORTED;\r
85}\r
4259256b 86\r
4259256b 87\r
0368663f 88/**\r
89 This function allows a program to extract a form or form package that has\r
90 previously been registered with the EFI HII database.\r
4259256b 91\r
0368663f 92 In this thunk module, this function will create a IFR Package with only \r
93 one Formset. Effectively, only the GUID of the Formset is updated and return\r
94 in this IFR package to caller. This is enable the Framework modules which call \r
95 a API named GetStringFromToken. GetStringFromToken retieves a String based on\r
96 a String Token from a Package List known only by the Formset GUID.\r
97 \r
4259256b 98\r
4259256b 99\r
0368663f 100 @param This A pointer to the EFI_HII_PROTOCOL instance.\r
101 @param Handle Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in\r
102 EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
103 @param FormId Ignored by this implementation.\r
104 @param BufferLengthTemp On input, the size of input buffer. On output, it\r
105 is the size of FW_HII_FORMSET_TEMPLATE.\r
106 @param Buffer The buffer designed to receive the form(s).\r
4259256b 107\r
0368663f 108 @retval EFI_SUCCESS Buffer filled with the requested forms. BufferLength\r
109 was updated.\r
110 @retval EFI_INVALID_PARAMETER The handle is unknown.\r
111 @retval EFI_NOT_FOUND A form on the requested handle cannot be found with the\r
112 requested FormId.\r
113 @retval EFI_BUFFER_TOO_SMALL The buffer provided was not large enough to allow the form to be stored.\r
4259256b 114\r
0368663f 115**/\r
116EFI_STATUS\r
117EFIAPI\r
118HiiGetForms (\r
a3318eaf 119 IN EFI_HII_PROTOCOL *This,\r
120 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
121 IN EFI_FORM_ID FormId,\r
122 IN OUT UINTN *BufferLengthTemp,\r
123 OUT UINT8 *Buffer\r
0368663f 124 )\r
4259256b 125{\r
0368663f 126 HII_THUNK_PRIVATE_DATA *Private;\r
127 HII_THUNK_CONTEXT *ThunkContext;\r
128 FW_HII_FORMSET_TEMPLATE *OutputFormSet;\r
ea58467b 129\r
0368663f 130 if (*BufferLengthTemp < sizeof(FW_HII_FORMSET_TEMPLATE)) {\r
131 *BufferLengthTemp = sizeof(FW_HII_FORMSET_TEMPLATE);\r
ea58467b 132 return EFI_BUFFER_TOO_SMALL;\r
133 }\r
134 \r
0368663f 135 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ea58467b 136\r
0368663f 137 ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
ea58467b 138\r
0368663f 139 if (ThunkContext == NULL) {\r
ea58467b 140 return EFI_NOT_FOUND;\r
141 }\r
142\r
0368663f 143 OutputFormSet = (FW_HII_FORMSET_TEMPLATE *) Buffer;\r
ea58467b 144 \r
0368663f 145 CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FW_HII_FORMSET_TEMPLATE));\r
146 CopyMem (&OutputFormSet->FormSet.Guid, &ThunkContext->TagGuid, sizeof (EFI_GUID)); \r
147\r
a9d85320 148 if (ThunkContext->FormSet != NULL) {\r
149 OutputFormSet->FormSet.Class = ThunkContext->FormSet->Class;\r
150 OutputFormSet->FormSet.SubClass = ThunkContext->FormSet->SubClass;\r
151 OutputFormSet->FormSet.Help = ThunkContext->FormSet->Help;\r
152 OutputFormSet->FormSet.FormSetTitle = ThunkContext->FormSet->FormSetTitle;\r
153 }\r
0368663f 154\r
ea58467b 155 return EFI_SUCCESS;\r
4259256b 156}\r
157\r
59336178 158\r
0368663f 159/**\r
4259256b 160\r
161 This function allows a program to extract the NV Image\r
162 that represents the default storage image\r
163\r
0368663f 164\r
165 @param This A pointer to the EFI_HII_PROTOCOL instance.\r
166 @param Handle The HII handle from which will have default data retrieved.\r
167 UINTN - Mask used to retrieve the default image.\r
168 @param DefaultMask EDES_TODO: Add parameter description\r
169 @param VariablePackList Callee allocated, tightly-packed, link list data\r
4259256b 170 structure that contain all default varaible packs\r
171 from the Hii Database.\r
172\r
0368663f 173 @retval EFI_NOT_FOUND If Hii database does not contain any default images.\r
174 @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
175 @retval EFI_SUCCESS Operation successful.\r
4259256b 176\r
0368663f 177**/\r
178EFI_STATUS\r
179EFIAPI\r
180HiiGetDefaultImage (\r
181 IN EFI_HII_PROTOCOL *This,\r
182 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
183 IN UINTN DefaultMask,\r
184 OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
185 )\r
4259256b 186{\r
59336178 187 LIST_ENTRY *UefiDefaults;\r
59336178 188 EFI_STATUS Status;\r
0368663f 189 HII_THUNK_PRIVATE_DATA *Private;\r
a9d85320 190 HII_THUNK_CONTEXT *ThunkContext;\r
59336178 191\r
0368663f 192 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
59336178 193\r
a9d85320 194 ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
195 if (ThunkContext == NULL) {\r
59336178 196 ASSERT (FALSE);\r
197 return EFI_INVALID_PARAMETER;\r
198 }\r
199\r
200 UefiDefaults = NULL;\r
a9d85320 201 Status = UefiIfrGetBufferTypeDefaults (ThunkContext, &UefiDefaults);\r
59336178 202 if (EFI_ERROR (Status)) {\r
203 goto Done;\r
204 }\r
205\r
a9d85320 206 Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, ThunkContext->FormSet->DefaultVarStoreId, VariablePackList);\r
59336178 207\r
208Done:\r
209 FreeDefaultList (UefiDefaults);\r
210 \r
211 return Status;\r
4259256b 212}\r
213\r
0368663f 214/**\r
a9d85320 215 This function update the FormCallbackProtocol cached in Config Access\r
216 private context data.\r
0368663f 217\r
a9d85320 218 @param CallbackHandle The EFI Handle on which the Framework FormCallbackProtocol is \r
219 installed.\r
220 @param ThunkContext The Thunk Context.\r
0368663f 221\r
a9d85320 222 @retval EFI_SUCCESS The update is successful.\r
223 @retval EFI_INVALID_PARAMETER If no Framework FormCallbackProtocol is located on CallbackHandle.\r
0368663f 224\r
225**/\r
ebbd2793 226EFI_STATUS\r
0368663f 227UpdateFormCallBack (\r
ebbd2793 228 IN EFI_HANDLE CallbackHandle,\r
0368663f 229 IN CONST HII_THUNK_CONTEXT *ThunkContext\r
ebbd2793 230 )\r
231{\r
232 EFI_STATUS Status;\r
0368663f 233 EFI_FORM_CALLBACK_PROTOCOL *FormCallbackProtocol;\r
ebbd2793 234 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccessProtocol;\r
235 EFI_HANDLE UefiDriverHandle;\r
0368663f 236 CONFIG_ACCESS_PRIVATE *ConfigAccessPrivate;\r
ebbd2793 237 \r
238 Status = gBS->HandleProtocol (\r
239 CallbackHandle,\r
240 &gEfiFormCallbackProtocolGuid,\r
0368663f 241 (VOID **) &FormCallbackProtocol\r
ebbd2793 242 );\r
243 if (EFI_ERROR (Status)) {\r
244 return EFI_INVALID_PARAMETER;\r
245 }\r
246 \r
59336178 247 Status = mHiiDatabase->GetPackageListHandle (\r
248 mHiiDatabase,\r
0368663f 249 ThunkContext->UefiHiiHandle,\r
ebbd2793 250 &UefiDriverHandle\r
251 );\r
252 ASSERT_EFI_ERROR (Status);\r
253 Status = gBS->HandleProtocol (\r
254 UefiDriverHandle,\r
255 &gEfiHiiConfigAccessProtocolGuid,\r
256 (VOID **) &ConfigAccessProtocol\r
257 );\r
258 ASSERT_EFI_ERROR (Status);\r
259 \r
0368663f 260 ConfigAccessPrivate = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccessProtocol);\r
ebbd2793 261 \r
0368663f 262 ConfigAccessPrivate->FormCallbackProtocol = FormCallbackProtocol;\r
ebbd2793 263\r
264 return EFI_SUCCESS;\r
265}\r
4259256b 266\r
59336178 267\r
0368663f 268/**\r
a9d85320 269 Get the package data from the Package List.\r
0368663f 270\r
a9d85320 271 @param HiiPackageList Package List.\r
272 @param PackageIndex The index of the Package in the Package List.\r
273 @param BufferLen The Length of the Pacage data.\r
274 @param Buffer On output, the Package data.\r
0368663f 275\r
a9d85320 276 @return EFI_NOT_FOUND No Package is found for PackageIndex.\r
277 @return EFI_SUCCESS The package data is returned.\r
0368663f 278\r
279**/\r
59336178 280EFI_STATUS\r
0368663f 281GetPackageData (\r
59336178 282 IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,\r
283 IN UINT32 PackageIndex,\r
284 OUT UINT32 *BufferLen,\r
285 OUT EFI_HII_PACKAGE_HEADER **Buffer\r
286 )\r
287{\r
288 UINT32 Index;\r
289 EFI_HII_PACKAGE_HEADER *Package;\r
290 UINT32 Offset;\r
291 UINT32 PackageListLength;\r
26a76fbc 292 EFI_HII_PACKAGE_HEADER PackageHeader;\r
59336178 293\r
294 ASSERT(HiiPackageList != NULL);\r
295\r
296 if ((BufferLen == NULL) || (Buffer == NULL)) {\r
297 return EFI_INVALID_PARAMETER;\r
298 }\r
299\r
26a76fbc 300 ZeroMem (&PackageHeader, sizeof (PackageHeader));\r
59336178 301 Package = NULL;\r
302 Index = 0;\r
303 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
304 CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
305 while (Offset < PackageListLength) {\r
306 Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);\r
307 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
308 if (Index == PackageIndex) {\r
309 break;\r
310 }\r
311 Offset += PackageHeader.Length;\r
312 Index++;\r
313 }\r
314 if (Offset >= PackageListLength) {\r
315 //\r
316 // no package found in this Package List\r
317 //\r
318 return EFI_NOT_FOUND;\r
319 }\r
320\r
321 *BufferLen = PackageHeader.Length;\r
322 *Buffer = Package;\r
323 return EFI_SUCCESS;\r
324}\r
325\r
326/**\r
a9d85320 327 Check if Label exist in the IFR form package and return the FormSet GUID\r
328 and Form ID.\r
59336178 329\r
a9d85320 330 @param Package The Package Header.\r
331 @param Label The Label ID.\r
332 @param FormsetGuid Returns the FormSet GUID.\r
333 @param FormId Returns the Form ID.\r
59336178 334\r
a9d85320 335 @retval EFI_SUCCESS The FORM ID is found.\r
336 @retval EFI_NOT_FOUND The FORM ID is not found.\r
59336178 337**/\r
338EFI_STATUS\r
339LocateLabel (\r
340 IN CONST EFI_HII_PACKAGE_HEADER *Package,\r
341 IN EFI_FORM_LABEL Label,\r
342 OUT EFI_GUID *FormsetGuid,\r
343 OUT EFI_FORM_ID *FormId\r
344 )\r
345{\r
346 UINTN Offset;\r
347 EFI_IFR_OP_HEADER *IfrOpHdr;\r
59336178 348 EFI_GUID InternalFormSetGuid;\r
349 EFI_FORM_ID InternalFormId;\r
350 BOOLEAN GetFormSet;\r
351 BOOLEAN GetForm;\r
a9d85320 352 EFI_IFR_GUID_LABEL *LabelOpcode;\r
59336178 353\r
354 IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER));\r
355 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
356\r
357 InternalFormId= 0;\r
358 ZeroMem (&InternalFormSetGuid, sizeof (EFI_GUID));\r
359 GetFormSet = FALSE;\r
360 GetForm = FALSE;\r
361\r
362 while (Offset < Package->Length) {\r
363 switch (IfrOpHdr->OpCode) {\r
364 case EFI_IFR_FORM_SET_OP :\r
365 CopyMem (&InternalFormSetGuid, &((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, sizeof (EFI_GUID));\r
366 GetFormSet = TRUE;\r
367 break;\r
368\r
369 case EFI_IFR_FORM_OP:\r
370 CopyMem (&InternalFormId, &((EFI_IFR_FORM *) IfrOpHdr)->FormId, sizeof (EFI_FORM_ID));\r
371 GetForm = TRUE;\r
372 break;\r
373\r
374 case EFI_IFR_GUID_OP :\r
a9d85320 375 LabelOpcode = (EFI_IFR_GUID_LABEL *) IfrOpHdr;\r
376 //\r
377 // If it is an Label opcode.\r
378 //\r
379 if ((LabelOpcode->ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) && (CompareMem (&LabelOpcode->Guid, &mTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0)) {\r
380 if (CompareMem (&Label, &LabelOpcode->Number, sizeof (UINT16)) == 0) {\r
381 ASSERT (GetForm && GetFormSet);\r
382 CopyGuid (FormsetGuid, &InternalFormSetGuid);\r
383 *FormId = InternalFormId;\r
384 return EFI_SUCCESS;\r
385 }\r
59336178 386 }\r
59336178 387 break;\r
388 default :\r
389 break;\r
390 }\r
391\r
392 //\r
393 // Go to the next Op-Code\r
394 //\r
395 Offset += IfrOpHdr->Length;\r
396 IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
397 }\r
398\r
399 return EFI_NOT_FOUND;\r
400}\r
401\r
402/**\r
403 Find the first EFI_FORM_LABEL in FormSets for a given EFI_HII_HANLDE defined.\r
404 \r
405 EFI_FORM_LABEL is a specific to Tiano implementation. The current implementation\r
406 does not restrict labels with same label value to be duplicated in either FormSet \r
407 scope or Form scope. This function will only locate the FIRST EFI_FORM_LABEL\r
408 with value as the same as the input Label in the Formset registered with UefiHiiHandle. The FormSet GUID \r
409 and Form ID is returned if such Label is found.\r
410\r
26a76fbc
LG
411 @param Handle Uefi Hii Handle to be searched.\r
412 @param Label The first Label ID to be found.\r
413 @param FormsetGuid The matched FormSet GUID.\r
414 @param FormId The matched Form ID.\r
59336178 415 \r
416 @retval EFI_INVALID_PARAMETER If UefiHiiHandle is not a valid handle.\r
26a76fbc
LG
417 @retval EFI_NOT_FOUND The package list identified by UefiHiiHandle deos not contain FormSet or\r
418 Form ID with value Label found in all Form Sets in the pacakge list.\r
419 @retval EFI_SUCCESS The first found Form ID is returned in FormId.\r
59336178 420**/\r
421EFI_STATUS\r
0368663f 422LocateFormId (\r
59336178 423 IN EFI_HII_HANDLE Handle,\r
424 IN EFI_FORM_LABEL Label,\r
425 OUT EFI_GUID *FormsetGuid,\r
426 OUT EFI_FORM_ID *FormId\r
427 )\r
428{\r
429 EFI_STATUS Status;\r
430 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
431 UINT32 Index;\r
432 UINTN BufferSize;\r
433 EFI_HII_PACKAGE_HEADER PackageHeader;\r
434 EFI_HII_PACKAGE_HEADER *Package;\r
435 UINT32 PackageLength;\r
436\r
437 BufferSize = 0;\r
438 HiiPackageList = NULL;\r
439 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
440 if (Status == EFI_BUFFER_TOO_SMALL) {\r
441 HiiPackageList = AllocatePool (BufferSize);\r
442 ASSERT (HiiPackageList != NULL);\r
443\r
444 Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
445 if (EFI_ERROR (Status)) {\r
446 goto Done;\r
447 }\r
448 }\r
449\r
450 for (Index = 0; ; Index++) {\r
0368663f 451 Status = GetPackageData (HiiPackageList, Index, &PackageLength, &Package);\r
59336178 452 if (!EFI_ERROR (Status)) {\r
453 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
4dd76ade 454 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
59336178 455 Status = LocateLabel (Package, Label, FormsetGuid, FormId);\r
456 if (!EFI_ERROR(Status)) {\r
457 break;\r
458 }\r
459 }\r
460 } else {\r
461 break;\r
462 }\r
463 }\r
464\r
465 \r
466Done:\r
467 FreePool (HiiPackageList);\r
468 \r
469 return Status;\r
470}\r
a9d85320 471\r
0368663f 472/**\r
473 This function allows the caller to update a form that has\r
474 previously been registered with the EFI HII database.\r
475\r
476\r
477 @param This EDES_TODO: Add parameter description\r
478 @param Handle Hii Handle associated with the Formset to modify\r
479 @param Label Update information starting immediately after this label in the IFR\r
480 @param AddData If TRUE, add data. If FALSE, remove data\r
481 @param Data If adding data, this is the pointer to the data to add\r
482\r
483 @retval EFI_SUCCESS Update success.\r
484 @retval Other Update fail.\r
485\r
486**/\r
4259256b 487EFI_STATUS\r
488EFIAPI\r
cdaf7905 489HiiThunkUpdateForm (\r
0368663f 490 IN EFI_HII_PROTOCOL *This,\r
4259256b 491 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
0368663f 492 IN EFI_FORM_LABEL Label,\r
493 IN BOOLEAN AddData,\r
2d630302 494 IN EFI_HII_UPDATE_DATA *Data\r
4259256b 495 )\r
4259256b 496{\r
ebbd2793 497 EFI_STATUS Status;\r
0368663f 498 HII_THUNK_PRIVATE_DATA *Private;\r
a5420536 499 HII_THUNK_CONTEXT *ThunkContext;\r
99a83b4c 500 EFI_HII_HANDLE UefiHiiHandle;\r
59336178 501 EFI_GUID FormsetGuid;\r
502 EFI_FORM_ID FormId;\r
0368663f 503 EFI_TPL OldTpl;\r
a5420536
LG
504 VOID *StartOpCodeHandle;\r
505 VOID *EndOpCodeHandle;\r
506 EFI_IFR_GUID_LABEL *StartLabel;\r
507 EFI_IFR_GUID_LABEL *EndLabel;\r
99a83b4c 508\r
0368663f 509 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
510 \r
511 mInFrameworkUpdatePakcage = TRUE;\r
99a83b4c 512 Status = EFI_SUCCESS;\r
ebbd2793 513\r
0368663f 514 Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
ebbd2793 515\r
0368663f 516 ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
517\r
518 if (ThunkContext == NULL) {\r
519 Status = EFI_NOT_FOUND;\r
520 goto Done;\r
ebbd2793 521 }\r
522 \r
523 if (Data->FormSetUpdate) {\r
0368663f 524 Status = UpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, ThunkContext);\r
ebbd2793 525 if (EFI_ERROR (Status)) {\r
0368663f 526 goto Done;\r
ebbd2793 527 }\r
528 }\r
99a83b4c 529\r
8ea58c07 530 if (ThunkContext->IfrPackageCount == 0) {\r
531 ASSERT (FALSE);\r
532 Status = EFI_INVALID_PARAMETER;\r
533 goto Done;\r
f274810c 534 } else {\r
0368663f 535 UefiHiiHandle = ThunkContext->UefiHiiHandle;\r
f274810c 536 }\r
99a83b4c 537\r
0368663f 538 Status = LocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
539 if (EFI_ERROR (Status)) {\r
540 //\r
541 // Can't find the label.\r
542 //\r
543 goto Done;\r
544 }\r
f274810c 545\r
a5420536
LG
546 //\r
547 // Init OpCode Handle\r
548 //\r
549 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
550 ASSERT (StartOpCodeHandle != NULL);\r
551\r
552 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
553 ASSERT (EndOpCodeHandle != NULL);\r
554\r
555 //\r
556 // Create Hii Extend Label OpCode as the start opcode\r
557 //\r
558 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
559 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
560 StartLabel->Number = Label;\r
561\r
562 //\r
563 // Create Hii Extend Label OpCode as the end opcode\r
564 //\r
565 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
566 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
567 EndLabel->Number = 0xffff;\r
568\r
f274810c 569 if (AddData) {\r
570 if (Data->DataCount != 0) {\r
f274810c 571\r
0368663f 572 ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
983ae8ce 573 ASSERT (ThunkContext != NULL);\r
a5420536 574 Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, StartOpCodeHandle);\r
f274810c 575 ASSERT_EFI_ERROR (Status);\r
576\r
a5420536 577 Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, NULL);\r
f274810c 578 ASSERT_EFI_ERROR (Status);\r
a5420536 579 }\r
f274810c 580 } else {\r
f274810c 581 //\r
582 // Delete Opcode starting from Labe in FormId found\r
583 //\r
a5420536 584 Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, EndOpCodeHandle);\r
f274810c 585 ASSERT_EFI_ERROR (Status);\r
586 }\r
587\r
a5420536
LG
588 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
589 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
590\r
0368663f 591Done:\r
99a83b4c 592\r
0368663f 593 mInFrameworkUpdatePakcage = FALSE; \r
594\r
595 gBS->RestoreTPL (OldTpl);\r
596\r
99a83b4c 597 return Status;\r
4259256b 598}\r