894 IN OUT EFI_STRING *AltCfgResp,
895 IN EFI_STRING DefaultAltCfgResp,
896 IN EFI_STRING AltConfigHdr
900 EFI_STRING AltCfgRespBackup;
901 EFI_STRING AltConfigHdrPtr;
902 EFI_STRING AltConfigHdrPtrNext;
903 EFI_STRING ConfigAltResp;
904 EFI_STRING StringPtr;
905 EFI_STRING StringPtrNext;
907 UINTN ReallocateSize;
910 BOOLEAN ConfigAltRespChanged;
912 Status = EFI_OUT_OF_RESOURCES;
914 AltConfigHdrPtrNext = NULL;
915 StringPtrNext = NULL;
916 ConfigAltResp = NULL;
917 AltCfgRespBackup = NULL;
920 ConfigAltRespChanged = FALSE;
925 AltConfigHdrPtr = StrStr (DefaultAltCfgResp, AltConfigHdr);
926 ASSERT (AltConfigHdrPtr != NULL);
927 AltConfigHdrPtrNext = StrStr (AltConfigHdrPtr + 1, L
"&GUID");
928 if (AltConfigHdrPtrNext != NULL) {
929 TempChar = *AltConfigHdrPtrNext;
930 *AltConfigHdrPtrNext = L
'\0';
936 StringPtr = StrStr (*AltCfgResp, AltConfigHdr);
937 ASSERT (StringPtr != NULL);
938 StringPtrNext = StrStr (StringPtr + 1, L
"&GUID");
939 if (StringPtrNext != NULL) {
940 TempCharA = *StringPtrNext;
941 *StringPtrNext = L
'\0';
947 ConfigAltResp = AllocateCopyPool (StrSize (*AltCfgResp), *AltCfgResp);
948 if (ConfigAltResp == NULL) {
955 BlockPtr = StrStr (AltConfigHdrPtr, L
"&OFFSET=");
956 if (BlockPtr != NULL) {
963 if (EFI_ERROR (Status)) {
973 if (EFI_ERROR (Status)) {
981 if (StringPtrNext != NULL) {
982 *StringPtrNext = TempCharA;
988 if (!ConfigAltRespChanged) {
989 Status = EFI_SUCCESS;
996 if (StringPtrNext != NULL) {
997 ReallocateSize = StrSize (ConfigAltResp) + StrSize (StringPtrNext) +
sizeof (CHAR16);
999 ReallocateSize = StrSize (ConfigAltResp) +
sizeof (CHAR16);
1002 AltCfgRespBackup = (EFI_STRING)AllocateZeroPool (ReallocateSize);
1003 if (AltCfgRespBackup == NULL) {
1007 StrCatS (AltCfgRespBackup, ReallocateSize /
sizeof (CHAR16), ConfigAltResp);
1008 if (StringPtrNext != NULL) {
1009 StrCatS (AltCfgRespBackup, ReallocateSize /
sizeof (CHAR16), StringPtrNext);
1012 FreePool (*AltCfgResp);
1013 *AltCfgResp = AltCfgRespBackup;
1015 Status = EFI_SUCCESS;
1018 if (ConfigAltResp != NULL) {
1019 FreePool (ConfigAltResp);
1025 if ( AltConfigHdrPtrNext != NULL) {
1026 *AltConfigHdrPtrNext = TempChar;
1027 AltConfigHdrPtrNext = NULL;
1657 IN EFI_STRING ConfigHdr,
1658 OUT BOOLEAN *IsEfiVarstore,
1659 OUT EFI_IFR_VARSTORE_EFI **EfiVarStore
1664 UINTN PackageOffset;
1665 EFI_IFR_OP_HEADER *IfrOpHdr;
1666 CHAR16 *VarStoreName;
1672 UINT8 *HiiFormPackage;
1674 EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
1675 EFI_HII_PACKAGE_HEADER *PackageHeader;
1677 HiiFormPackage = NULL;
1679 Status = EFI_SUCCESS;
1683 *IsEfiVarstore = FALSE;
1686 if (EFI_ERROR (Status)) {
1690 IfrOffset =
sizeof (EFI_HII_PACKAGE_HEADER);
1691 PackageOffset = IfrOffset;
1692 PackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiFormPackage;
1694 while (IfrOffset < PackageSize) {
1698 if (PackageOffset >= PackageHeader->Length) {
1702 PackageOffset =
sizeof (EFI_HII_PACKAGE_HEADER);
1703 IfrOffset += PackageOffset;
1704 PackageHeader = (EFI_HII_PACKAGE_HEADER *)(HiiFormPackage + IfrOffset);
1707 IfrOpHdr = (EFI_IFR_OP_HEADER *)(HiiFormPackage + IfrOffset);
1708 IfrOffset += IfrOpHdr->Length;
1709 PackageOffset += IfrOpHdr->Length;
1711 if (IfrOpHdr->OpCode == EFI_IFR_VARSTORE_EFI_OP ) {
1712 IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *)IfrOpHdr;
1718 if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {
1722 NameSize = AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name);
1723 VarStoreName = AllocateZeroPool (NameSize *
sizeof (CHAR16));
1724 if (VarStoreName == NULL) {
1725 Status = EFI_OUT_OF_RESOURCES;
1729 AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);
1731 GenerateSubStr (L
"GUID=",
sizeof (EFI_GUID), (VOID *)&IfrEfiVarStore->Guid, 1, &GuidStr);
1732 GenerateSubStr (L
"NAME=", StrLen (VarStoreName) *
sizeof (CHAR16), (VOID *)VarStoreName, 2, &NameStr);
1733 LengthString = StrLen (GuidStr);
1734 LengthString = LengthString + StrLen (NameStr) + 1;
1735 TempStr = AllocateZeroPool (LengthString *
sizeof (CHAR16));
1736 if (TempStr == NULL) {
1739 FreePool (VarStoreName);
1740 Status = EFI_OUT_OF_RESOURCES;
1744 StrCpyS (TempStr, LengthString, GuidStr);
1745 StrCatS (TempStr, LengthString, NameStr);
1746 if ((ConfigHdr == NULL) || (StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0)) {
1747 *EfiVarStore = (EFI_IFR_VARSTORE_EFI *)AllocateZeroPool (IfrOpHdr->Length);
1748 if (*EfiVarStore == NULL) {
1749 FreePool (VarStoreName);
1753 Status = EFI_OUT_OF_RESOURCES;
1757 *IsEfiVarstore = TRUE;
1758 CopyMem (*EfiVarStore, IfrEfiVarStore, IfrOpHdr->Length);
1764 FreePool (VarStoreName);
1772 if (*IsEfiVarstore) {
1779 if (HiiFormPackage != NULL) {
1780 FreePool (HiiFormPackage);
2161 IN EFI_HII_HANDLE HiiHandle,
2163 IN UINT32 PackageLength,
2164 IN EFI_STRING ConfigHdr,
2172 UINTN PackageOffset;
2173 EFI_IFR_VARSTORE *IfrVarStore;
2174 EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
2175 EFI_IFR_OP_HEADER *IfrOpHdr;
2176 EFI_IFR_ONE_OF *IfrOneOf;
2177 EFI_IFR_REF4 *IfrRef;
2178 EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;
2179 EFI_IFR_DEFAULT *IfrDefault;
2180 EFI_IFR_ORDERED_LIST *IfrOrderedList;
2181 EFI_IFR_CHECKBOX *IfrCheckBox;
2182 EFI_IFR_PASSWORD *IfrPassword;
2183 EFI_IFR_STRING *IfrString;
2184 EFI_IFR_DATE *IfrDate;
2185 EFI_IFR_TIME *IfrTime;
2189 CHAR16 *VarStoreName;
2192 UINT16 VarDefaultId;
2193 BOOLEAN FirstOneOfOption;
2194 BOOLEAN FirstOrderedList;
2195 LIST_ENTRY *LinkData;
2196 LIST_ENTRY *LinkDefault;
2197 EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;
2198 EFI_HII_PACKAGE_HEADER *PackageHeader;
2199 EFI_VARSTORE_ID VarStoreId;
2200 UINT16 SmallestDefaultId;
2201 BOOLEAN SmallestIdFromFlag;
2202 BOOLEAN FromOtherDefaultOpcode;
2203 BOOLEAN QuestionReferBitField;
2205 Status = EFI_SUCCESS;
2207 DefaultDataPtr = NULL;
2208 FirstOneOfOption = FALSE;
2210 FirstOrderedList = FALSE;
2211 VarStoreName = NULL;
2213 SmallestDefaultId = 0xFFFF;
2214 FromOtherDefaultOpcode = FALSE;
2215 QuestionReferBitField = FALSE;
2220 PackageOffset =
sizeof (EFI_HII_PACKAGE_HEADER);
2221 PackageHeader = (EFI_HII_PACKAGE_HEADER *)Package;
2222 IfrOffset = PackageOffset;
2223 while (IfrOffset < PackageLength) {
2227 if (PackageOffset >= PackageHeader->Length) {
2231 if (VarStoreId != 0) {
2238 IfrOffset +=
sizeof (EFI_HII_PACKAGE_HEADER);
2239 PackageOffset =
sizeof (EFI_HII_PACKAGE_HEADER);
2240 PackageHeader = (EFI_HII_PACKAGE_HEADER *)(Package + IfrOffset);
2243 IfrOpHdr = (EFI_IFR_OP_HEADER *)(Package + IfrOffset);
2244 switch (IfrOpHdr->OpCode) {
2245 case EFI_IFR_VARSTORE_OP:
2249 if (VarStoreId != 0) {
2253 IfrVarStore = (EFI_IFR_VARSTORE *)IfrOpHdr;
2255 NameSize = AsciiStrSize ((CHAR8 *)IfrVarStore->Name);
2256 VarStoreName = AllocateZeroPool (NameSize *
sizeof (CHAR16));
2257 if (VarStoreName == NULL) {
2258 Status = EFI_OUT_OF_RESOURCES;
2262 AsciiStrToUnicodeStrS ((CHAR8 *)IfrVarStore->Name, VarStoreName, NameSize);
2264 if (
IsThisVarstore ((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) {
2268 CopyGuid (&VarStorageData->Guid, (EFI_GUID *)(VOID *)&IfrVarStore->Guid);
2269 VarStorageData->Size = IfrVarStore->Size;
2270 VarStorageData->Name = VarStoreName;
2272 VarStoreId = IfrVarStore->VarStoreId;
2274 FreePool (VarStoreName);
2275 VarStoreName = NULL;
2280 case EFI_IFR_VARSTORE_EFI_OP:
2284 if (VarStoreId != 0) {
2288 IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *)IfrOpHdr;
2295 if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {
2299 NameSize = AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name);
2300 VarStoreName = AllocateZeroPool (NameSize *
sizeof (CHAR16));
2301 if (VarStoreName == NULL) {
2302 Status = EFI_OUT_OF_RESOURCES;
2306 AsciiStrToUnicodeStrS ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName, NameSize);
2308 if (
IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {
2312 CopyGuid (&VarStorageData->Guid, (EFI_GUID *)(VOID *)&IfrEfiVarStore->Guid);
2313 VarStorageData->Size = IfrEfiVarStore->Size;
2314 VarStorageData->Name = VarStoreName;
2316 VarStoreId = IfrEfiVarStore->VarStoreId;
2318 FreePool (VarStoreName);
2319 VarStoreName = NULL;
2324 case EFI_IFR_VARSTORE_NAME_VALUE_OP:
2328 if (VarStoreId != 0) {
2332 IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *)IfrOpHdr;
2334 if (
IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) {
2338 CopyGuid (&VarStorageData->Guid, (EFI_GUID *)(VOID *)&IfrNameValueVarStore->Guid);
2340 VarStoreId = IfrNameValueVarStore->VarStoreId;
2345 case EFI_IFR_DEFAULTSTORE_OP:
2350 if (DefaultDataPtr == NULL) {
2351 Status = EFI_OUT_OF_RESOURCES;
2355 DefaultDataPtr->
DefaultId = ((EFI_IFR_DEFAULTSTORE *)IfrOpHdr)->DefaultId;
2356 InsertTailList (&DefaultIdArray->Entry, &DefaultDataPtr->
Entry);
2357 DefaultDataPtr = NULL;
2360 case EFI_IFR_FORM_OP:
2361 case EFI_IFR_FORM_MAP_OP:
2365 if ( VarStoreId == 0) {
2366 Status = EFI_SUCCESS;
2372 case EFI_IFR_REF_OP:
2376 if ( VarStoreId == 0) {
2377 Status = EFI_INVALID_PARAMETER;
2384 IfrRef = (EFI_IFR_REF4 *)IfrOpHdr;
2385 if (IfrRef->Question.VarStoreId != VarStoreId) {
2389 VarWidth = (UINT16)(
sizeof (EFI_HII_REF));
2394 if (BlockData != NULL) {
2398 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2399 if (EFI_ERROR (Status)) {
2400 if (Status == EFI_NOT_FOUND) {
2412 case EFI_IFR_ONE_OF_OP:
2413 case EFI_IFR_NUMERIC_OP:
2421 if (VarStoreId == 0) {
2422 Status = EFI_INVALID_PARAMETER;
2429 IfrOneOf = (EFI_IFR_ONE_OF *)IfrOpHdr;
2430 if (IfrOneOf->Question.VarStoreId != VarStoreId) {
2434 if (QuestionReferBitField) {
2435 VarWidth = IfrOneOf->Flags & EDKII_IFR_NUMERIC_SIZE_BIT;
2437 VarWidth = (UINT16)(1 << (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE));
2443 if (BlockData != NULL) {
2447 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, QuestionReferBitField);
2448 if (EFI_ERROR (Status)) {
2449 if (Status == EFI_NOT_FOUND) {
2462 ASSERT (BlockData != NULL);
2464 if (IfrOpHdr->OpCode == EFI_IFR_ONE_OF_OP) {
2468 FirstOneOfOption = TRUE;
2469 }
else if (IfrOpHdr->OpCode == EFI_IFR_NUMERIC_OP) {
2474 if (QuestionReferBitField) {
2478 CopyMem (&DefaultData.
Value.u32, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));
2480 switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {
2481 case EFI_IFR_NUMERIC_SIZE_1:
2482 DefaultData.
Value.u8 = IfrOneOf->data.u8.MinValue;
2485 case EFI_IFR_NUMERIC_SIZE_2:
2486 CopyMem (&DefaultData.
Value.u16, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));
2489 case EFI_IFR_NUMERIC_SIZE_4:
2490 CopyMem (&DefaultData.
Value.u32, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));
2493 case EFI_IFR_NUMERIC_SIZE_8:
2494 CopyMem (&DefaultData.
Value.u64, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));
2498 Status = EFI_INVALID_PARAMETER;
2506 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
2515 case EFI_IFR_ORDERED_LIST_OP:
2521 FirstOrderedList = TRUE;
2525 if (VarStoreId == 0) {
2526 Status = EFI_INVALID_PARAMETER;
2533 IfrOrderedList = (EFI_IFR_ORDERED_LIST *)IfrOpHdr;
2534 if (IfrOrderedList->Question.VarStoreId != VarStoreId) {
2539 VarWidth = IfrOrderedList->MaxContainers;
2544 if (BlockData != NULL) {
2548 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2549 if (EFI_ERROR (Status)) {
2550 if (Status == EFI_NOT_FOUND) {
2562 case EFI_IFR_CHECKBOX_OP:
2575 if (VarStoreId == 0) {
2576 Status = EFI_INVALID_PARAMETER;
2583 IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpHdr;
2584 if (IfrCheckBox->Question.VarStoreId != VarStoreId) {
2588 VarWidth = (UINT16)
sizeof (BOOLEAN);
2593 if (BlockData != NULL) {
2597 if (QuestionReferBitField) {
2601 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, QuestionReferBitField);
2602 if (EFI_ERROR (Status)) {
2603 if (Status == EFI_NOT_FOUND) {
2616 ASSERT (BlockData != NULL);
2618 SmallestIdFromFlag = FALSE;
2623 VarDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
2628 if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT) == EFI_IFR_CHECKBOX_DEFAULT) {
2633 if (QuestionReferBitField) {
2634 DefaultData.
Value.u32 = TRUE;
2636 DefaultData.
Value.b = TRUE;
2641 if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {
2645 SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
2646 SmallestIdFromFlag = TRUE;
2653 VarDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
2658 if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) == EFI_IFR_CHECKBOX_DEFAULT_MFG) {
2663 if (QuestionReferBitField) {
2664 DefaultData.
Value.u32 = TRUE;
2666 DefaultData.
Value.b = TRUE;
2671 if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {
2675 SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
2676 SmallestIdFromFlag = TRUE;
2680 if (SmallestIdFromFlag) {
2685 if (QuestionReferBitField) {
2686 DefaultData.
Value.u32 = TRUE;
2688 DefaultData.
Value.b = TRUE;
2694 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
2704 if (QuestionReferBitField) {
2705 DefaultData.
Value.u32 = FALSE;
2707 DefaultData.
Value.b = FALSE;
2713 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
2722 case EFI_IFR_DATE_OP:
2732 if (VarStoreId == 0) {
2733 Status = EFI_INVALID_PARAMETER;
2740 IfrDate = (EFI_IFR_DATE *)IfrOpHdr;
2741 if (IfrDate->Question.VarStoreId != VarStoreId) {
2748 if (BlockData != NULL) {
2752 VarWidth = (UINT16)
sizeof (EFI_HII_DATE);
2753 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2754 if (EFI_ERROR (Status)) {
2755 if (Status == EFI_NOT_FOUND) {
2767 case EFI_IFR_TIME_OP:
2777 if (VarStoreId == 0) {
2778 Status = EFI_INVALID_PARAMETER;
2785 IfrTime = (EFI_IFR_TIME *)IfrOpHdr;
2786 if (IfrTime->Question.VarStoreId != VarStoreId) {
2793 if (BlockData != NULL) {
2797 VarWidth = (UINT16)
sizeof (EFI_HII_TIME);
2798 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2799 if (EFI_ERROR (Status)) {
2800 if (Status == EFI_NOT_FOUND) {
2812 case EFI_IFR_STRING_OP:
2822 if (VarStoreId == 0) {
2823 Status = EFI_INVALID_PARAMETER;
2830 IfrString = (EFI_IFR_STRING *)IfrOpHdr;
2831 if (IfrString->Question.VarStoreId != VarStoreId) {
2838 if (BlockData != NULL) {
2842 VarWidth = (UINT16)(IfrString->MaxSize * sizeof (UINT16));
2843 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2844 if (EFI_ERROR (Status)) {
2845 if (Status == EFI_NOT_FOUND) {
2857 case EFI_IFR_PASSWORD_OP:
2867 if (VarStoreId == 0) {
2868 Status = EFI_INVALID_PARAMETER;
2875 IfrPassword = (EFI_IFR_PASSWORD *)IfrOpHdr;
2876 if (IfrPassword->Question.VarStoreId != VarStoreId) {
2883 if (BlockData != NULL) {
2887 VarWidth = (UINT16)(IfrPassword->MaxSize * sizeof (UINT16));
2888 Status =
IsThisOpcodeRequired (RequestBlockArray, HiiHandle, VarStorageData, IfrOpHdr, VarWidth, &BlockData, FALSE);
2889 if (EFI_ERROR (Status)) {
2890 if (Status == EFI_NOT_FOUND) {
2906 case EFI_IFR_ONE_OF_OPTION_OP:
2910 if ((BlockData == NULL) || (BlockData->
Scope == 0)) {
2914 IfrOneOfOption = (EFI_IFR_ONE_OF_OPTION *)IfrOpHdr;
2915 if (BlockData->
OpCode == EFI_IFR_ORDERED_LIST_OP) {
2916 if (!FirstOrderedList) {
2923 if ((IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_8) || (IfrOneOfOption->Type == EFI_IFR_TYPE_BOOLEAN)) {
2925 }
else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_16) {
2927 }
else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_32) {
2929 }
else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_64) {
2935 Status = EFI_INVALID_PARAMETER;
2936 if (BlockData->
Name != NULL) {
2937 FreePool (BlockData->
Name);
2940 FreePool (BlockData);
2947 BlockData->
Width = (UINT16)(BlockData->
Width * VarWidth);
2955 if (BlockData->
Name != NULL) {
2956 FreePool (BlockData->
Name);
2959 FreePool (BlockData);
2967 if ((BlockData->
Name == NULL) && ((BlockData->
Offset + BlockData->
Width) > VarStorageData->Size)) {
2968 Status = EFI_INVALID_PARAMETER;
2969 if (BlockData->
Name != NULL) {
2970 FreePool (BlockData->
Name);
2973 FreePool (BlockData);
2982 FirstOrderedList = FALSE;
2991 if (((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) ||
2992 ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG))
2998 FirstOneOfOption = FALSE;
3000 SmallestIdFromFlag = FALSE;
3005 CopyMem (&DefaultData.
Value, &IfrOneOfOption->Value, IfrOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));
3006 if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {
3007 DefaultData.
DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
3009 if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {
3013 SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
3014 SmallestIdFromFlag = TRUE;
3018 if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG) {
3019 DefaultData.
DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
3021 if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {
3025 SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
3026 SmallestIdFromFlag = TRUE;
3030 if (SmallestIdFromFlag) {
3038 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
3050 if (FirstOneOfOption) {
3052 FirstOneOfOption = FALSE;
3058 CopyMem (&DefaultData.
Value, &IfrOneOfOption->Value, IfrOneOfOption->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));
3059 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
3068 case EFI_IFR_DEFAULT_OP:
3072 if ((BlockData == NULL) || (BlockData->
Scope == 0)) {
3082 IfrDefault = (EFI_IFR_DEFAULT *)IfrOpHdr;
3083 VarDefaultId = IfrDefault->DefaultId;
3089 if (QuestionReferBitField) {
3090 CopyMem (&DefaultData.
Value.u32, &IfrDefault->Value.u32, sizeof (UINT32));
3092 CopyMem (&DefaultData.
Value, &IfrDefault->Value, IfrDefault->Header.Length - OFFSET_OF (EFI_IFR_DEFAULT, Value));
3096 if (IfrDefault->Type == EFI_IFR_TYPE_OTHER) {
3111 if ((SmallestDefaultId > VarDefaultId) || ((SmallestDefaultId == VarDefaultId) && !FromOtherDefaultOpcode)) {
3112 FromOtherDefaultOpcode = TRUE;
3113 SmallestDefaultId = VarDefaultId;
3114 for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
3132 case EFI_IFR_END_OP:
3136 QuestionReferBitField = FALSE;
3137 if (BlockData != NULL) {
3138 if (BlockData->
Scope > 0) {
3142 if (BlockData->
Scope == 0) {
3147 SmallestDefaultId = 0xFFFF;
3148 FromOtherDefaultOpcode = FALSE;
3154 case EFI_IFR_GUID_OP:
3155 if (
CompareGuid ((EFI_GUID *)((UINT8 *)IfrOpHdr +
sizeof (EFI_IFR_OP_HEADER)), &gEdkiiIfrBitVarstoreGuid)) {
3156 QuestionReferBitField = TRUE;
3162 if (BlockData != NULL) {
3163 if (BlockData->
Scope > 0) {
3164 BlockData->
Scope = (UINT8)(BlockData->
Scope + IfrOpHdr->Scope);
3167 if (BlockData->
Scope == 0) {
3175 IfrOffset += IfrOpHdr->Length;
3176 PackageOffset += IfrOpHdr->Length;
3183 if (Status == EFI_NOT_FOUND) {
3184 Status = EFI_SUCCESS;
3188 for (LinkData = VarStorageData->BlockEntry.ForwardLink; LinkData != &VarStorageData->BlockEntry; LinkData = LinkData->ForwardLink) {
3192 LinkDefault = LinkDefault->ForwardLink;
3193 if (DefaultDataPtr->
Cleaned == TRUE) {
3194 RemoveEntryList (&DefaultDataPtr->
Entry);
3195 FreePool (DefaultDataPtr);
4169 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4170 IN OUT EFI_STRING *Request,
4171 IN OUT EFI_STRING *AltCfgResp,
4172 OUT EFI_STRING *PointerProgress OPTIONAL
4176 UINT8 *HiiFormPackage;
4184 EFI_STRING DefaultAltCfgResp;
4185 EFI_STRING ConfigHdr;
4186 EFI_STRING StringPtr;
4187 EFI_STRING Progress;
4189 if ((DataBaseRecord == NULL) || (DevicePath == NULL) || (Request == NULL) || (AltCfgResp == NULL)) {
4190 return EFI_INVALID_PARAMETER;
4196 RequestBlockArray = NULL;
4197 DefaultIdArray = NULL;
4198 VarStorageData = NULL;
4199 DefaultAltCfgResp = NULL;
4201 HiiFormPackage = NULL;
4203 Progress = *Request;
4206 if (EFI_ERROR (Status)) {
4214 if (*Request != NULL) {
4215 StringPtr = *Request;
4219 if (StrnCmp (StringPtr, L
"GUID=",
L_STR_LEN (L
"GUID=")) != 0) {
4220 Status = EFI_INVALID_PARAMETER;
4225 while (*StringPtr != L
'\0' && StrnCmp (StringPtr, L
"&NAME=",
L_STR_LEN (L
"&NAME=")) != 0) {
4229 if (*StringPtr == L
'\0') {
4230 Status = EFI_INVALID_PARAMETER;
4235 while (*StringPtr != L
'\0' && StrnCmp (StringPtr, L
"&PATH=",
L_STR_LEN (L
"&PATH=")) != 0) {
4239 if (*StringPtr == L
'\0') {
4240 Status = EFI_INVALID_PARAMETER;
4245 while (*StringPtr != L
'\0' && *StringPtr != L
'&') {
4249 if (*StringPtr == L
'\0') {
4260 if (StringPtr != NULL) {
4261 if (StrStr (StringPtr, L
"&OFFSET=") != NULL) {
4267 if (RequestBlockArray == NULL) {
4268 Status = EFI_INVALID_PARAMETER;
4277 if (DefaultIdArray == NULL) {
4278 Status = EFI_OUT_OF_RESOURCES;
4282 InitializeListHead (&DefaultIdArray->
Entry);
4288 if (VarStorageData == NULL) {
4289 Status = EFI_OUT_OF_RESOURCES;
4293 InitializeListHead (&VarStorageData->
Entry);
4294 InitializeListHead (&VarStorageData->
BlockEntry);
4304 DataBaseRecord->Handle,
4306 (UINT32)PackageSize,
4312 if (EFI_ERROR (Status)) {
4319 if ((VarStorageData->
Type == 0) && (VarStorageData->
Name == NULL)) {
4320 Status = EFI_SUCCESS;
4327 Status =
GenerateHdr (VarStorageData, DevicePath, &ConfigHdr);
4328 if (EFI_ERROR (Status)) {
4332 if (RequestBlockArray == NULL) {
4343 Status =
GenerateAltConfigResp (DataBaseRecord->Handle, ConfigHdr, VarStorageData, DefaultIdArray, &DefaultAltCfgResp);
4344 if (EFI_ERROR (Status)) {
4351 if ((*AltCfgResp != NULL) && (DefaultAltCfgResp != NULL)) {
4353 FreePool (DefaultAltCfgResp);
4354 }
else if (*AltCfgResp == NULL) {
4355 *AltCfgResp = DefaultAltCfgResp;
4359 if (RequestBlockArray != NULL) {
4363 while (!IsListEmpty (&RequestBlockArray->
Entry)) {
4365 RemoveEntryList (&BlockData->
Entry);
4366 if (BlockData->
Name != NULL) {
4367 FreePool (BlockData->
Name);
4370 FreePool (BlockData);
4373 FreePool (RequestBlockArray);
4376 if (VarStorageData != NULL) {
4380 while (!IsListEmpty (&VarStorageData->
BlockEntry)) {
4382 RemoveEntryList (&BlockData->
Entry);
4383 if (BlockData->
Name != NULL) {
4384 FreePool (BlockData->
Name);
4392 RemoveEntryList (&DefaultValueData->
Entry);
4393 FreePool (DefaultValueData);
4396 FreePool (BlockData);
4399 if (VarStorageData->
Name != NULL) {
4400 FreePool (VarStorageData->
Name);
4401 VarStorageData->
Name = NULL;
4404 FreePool (VarStorageData);
4407 if (DefaultIdArray != NULL) {
4411 while (!IsListEmpty (&DefaultIdArray->
Entry)) {
4413 RemoveEntryList (&DefaultId->
Entry);
4414 FreePool (DefaultId);
4417 FreePool (DefaultIdArray);
4423 if (ConfigHdr != NULL) {
4424 FreePool (ConfigHdr);
4430 if (HiiFormPackage != NULL) {
4431 FreePool (HiiFormPackage);
4434 if (PointerProgress != NULL) {
4435 if (*Request == NULL) {
4436 *PointerProgress = NULL;
4437 }
else if (EFI_ERROR (Status)) {
4438 *PointerProgress = *Request;
4440 *PointerProgress = *Request + StrLen (*Request);
4812 IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4813 IN CONST EFI_STRING Request,
4814 OUT EFI_STRING *Progress,
4815 OUT EFI_STRING *Results
4819 EFI_STRING StringPtr;
4820 EFI_STRING ConfigRequest;
4822 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4823 EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4827 UINT8 *DevicePathPkg;
4828 UINT8 *CurrentDevicePath;
4829 EFI_HANDLE DriverHandle;
4830 EFI_HII_HANDLE HiiHandle;
4831 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
4832 EFI_STRING AccessProgress;
4833 EFI_STRING AccessResults;
4834 EFI_STRING AccessProgressBackup;
4835 EFI_STRING AccessResultsBackup;
4836 EFI_STRING DefaultResults;
4837 BOOLEAN FirstElement;
4838 BOOLEAN IfrDataParsedFlag;
4839 BOOLEAN IsEfiVarStore;
4840 EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;
4841 EFI_STRING ErrorPtr;
4842 UINTN DevicePathSize;
4843 UINTN ConigStringSize;
4844 UINTN ConigStringSizeNewsize;
4845 EFI_STRING ConfigStringPtr;
4847 if ((This == NULL) || (Progress == NULL) || (Results == NULL)) {
4848 return EFI_INVALID_PARAMETER;
4851 if (Request == NULL) {
4853 return EFI_INVALID_PARAMETER;
4857 StringPtr = Request;
4858 *Progress = StringPtr;
4859 DefaultResults = NULL;
4860 ConfigRequest = NULL;
4861 Status = EFI_SUCCESS;
4862 AccessResults = NULL;
4863 AccessProgress = NULL;
4864 AccessResultsBackup = NULL;
4865 AccessProgressBackup = NULL;
4867 IfrDataParsedFlag = FALSE;
4868 IsEfiVarStore = FALSE;
4869 EfiVarStoreInfo = NULL;
4875 if (StrnCmp (StringPtr, L
"GUID=",
L_STR_LEN (L
"GUID=")) != 0) {
4876 return EFI_INVALID_PARAMETER;
4879 FirstElement = TRUE;
4886 if (*Results == NULL) {
4887 return EFI_OUT_OF_RESOURCES;
4890 while (*StringPtr != 0 && StrnCmp (StringPtr, L
"GUID=",
L_STR_LEN (L
"GUID=")) == 0) {
4895 if (StringPtr == Request) {
4896 *Progress = StringPtr;
4898 *Progress = StringPtr - 1;
4905 ConfigRequest = AllocateCopyPool ((
Length + 1) *
sizeof (CHAR16), StringPtr);
4906 if (ConfigRequest == NULL) {
4907 Status = EFI_OUT_OF_RESOURCES;
4911 *(ConfigRequest +
Length) = 0;
4916 Status =
GetDevicePath (ConfigRequest, (UINT8 **)&DevicePath);
4917 if (EFI_ERROR (Status)) {
4924 DriverHandle = NULL;
4929 Link = Link->ForwardLink
4934 CurrentDevicePath = DevicePathPkg +
sizeof (EFI_HII_PACKAGE_HEADER);
4935 DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *)CurrentDevicePath);
4938 HiiHandle = Database->
Handle;
4947 if (DriverHandle == NULL) {
4948 TempDevicePath = DevicePath;
4949 Status =
gBS->LocateDevicePath (
4954 if (EFI_ERROR (Status) || (DriverHandle == NULL)) {
4959 *Progress = StringPtr;
4960 Status = EFI_NOT_FOUND;
4969 if (ErrorPtr != NULL) {
4970 *Progress = StrStr (StringPtr, ErrorPtr);
4971 Status = EFI_INVALID_PARAMETER;
4978 IfrDataParsedFlag = FALSE;
4983 IfrDataParsedFlag = TRUE;
4985 if (EFI_ERROR (Status)) {
4990 ASSERT (AccessProgress != NULL);
4991 *Progress = StrStr (StringPtr, AccessProgress);
4999 AccessResults = AllocateCopyPool (StrSize (ConfigRequest), ConfigRequest);
5000 goto NextConfigString;
5007 Status =
GetVarStoreType (Database, ConfigRequest, &IsEfiVarStore, &EfiVarStoreInfo);
5008 if (EFI_ERROR (Status)) {
5012 if (IsEfiVarStore) {
5017 FreePool (EfiVarStoreInfo);
5018 if (EFI_ERROR (Status)) {
5023 *Progress = StrStr (StringPtr, AccessProgress);
5030 Status =
gBS->HandleProtocol (
5032 &gEfiHiiConfigAccessProtocolGuid,
5033 (VOID **)&ConfigAccess
5035 if (EFI_ERROR (Status)) {
5040 Status = EFI_SUCCESS;
5042 Status = ConfigAccess->ExtractConfig (
5045 &AccessProgressBackup,
5046 &AccessResultsBackup
5048 if (!EFI_ERROR (Status)) {
5052 if ((AccessResultsBackup != NULL) && (StrStr (AccessResultsBackup, L
"&ALTCFG=") != NULL)) {
5053 ConigStringSize = StrSize (AccessResults);
5054 ConfigStringPtr = StrStr (AccessResultsBackup, L
"&GUID=");
5055 ConigStringSizeNewsize = StrSize (ConfigStringPtr) + ConigStringSize +
sizeof (CHAR16);
5056 AccessResults = (EFI_STRING)ReallocatePool (
5058 ConigStringSizeNewsize,
5061 StrCatS (AccessResults, ConigStringSizeNewsize /
sizeof (CHAR16), ConfigStringPtr);
5068 Status = EFI_SUCCESS;
5071 if (AccessResultsBackup != NULL) {
5072 FreePool (AccessResultsBackup);
5073 AccessResultsBackup = NULL;
5080 Status =
gBS->HandleProtocol (
5082 &gEfiHiiConfigAccessProtocolGuid,
5083 (VOID **)&ConfigAccess
5085 if (EFI_ERROR (Status)) {
5089 Status = ConfigAccess->ExtractConfig (
5097 if (EFI_ERROR (Status)) {
5102 *Progress = StrStr (StringPtr, AccessProgress);
5110 ASSERT (*AccessProgress == 0);
5115 if (!IfrDataParsedFlag && (HiiHandle != NULL)) {
5117 ASSERT_EFI_ERROR (Status);
5120 FreePool (DevicePath);
5123 if (DefaultResults != NULL) {
5125 ASSERT_EFI_ERROR (Status);
5126 FreePool (DefaultResults);
5127 DefaultResults = NULL;
5131 if (!FirstElement) {
5133 ASSERT_EFI_ERROR (Status);
5137 ASSERT_EFI_ERROR (Status);
5139 FirstElement = FALSE;
5141 FreePool (AccessResults);
5142 AccessResults = NULL;
5143 FreePool (ConfigRequest);
5144 ConfigRequest = NULL;
5150 if (*StringPtr == 0) {
5151 *Progress = StringPtr;
5159 if (EFI_ERROR (Status)) {
5160 FreePool (*Results);
5164 if (ConfigRequest != NULL) {
5165 FreePool (ConfigRequest);
5168 if (AccessResults != NULL) {
5169 FreePool (AccessResults);
5172 if (DefaultResults != NULL) {
5173 FreePool (DefaultResults);
5176 if (DevicePath != NULL) {
5177 FreePool (DevicePath);