}\r
\r
Length = TmpPtr - String;\r
+ if (Length == 0) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
Result = AllocateCopyPool (Length * sizeof (CHAR16), String);\r
if (Result == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
{\r
EFI_STATUS Status;\r
UINTN IfrOffset;\r
+ UINTN PackageOffset;\r
EFI_IFR_OP_HEADER *IfrOpHdr;\r
CHAR16 *VarStoreName;\r
EFI_STRING GuidStr;\r
UINT8 *HiiFormPackage;\r
UINTN PackageSize;\r
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
\r
HiiFormPackage = NULL;\r
LengthString = 0;\r
GuidStr = NULL;\r
NameStr = NULL;\r
TempStr = NULL;\r
+ *IsEfiVarstore = FALSE;\r
\r
Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageOffset = IfrOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;\r
+\r
while (IfrOffset < PackageSize) {\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset); \r
+ //\r
+ // More than one form packages exist.\r
+ //\r
+ if (PackageOffset >= PackageHeader->Length) {\r
+ //\r
+ // Process the new form package.\r
+ //\r
+ PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ IfrOffset += PackageOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset);\r
+ }\r
+\r
+ IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);\r
IfrOffset += IfrOpHdr->Length;\r
+ PackageOffset += IfrOpHdr->Length;\r
\r
if (IfrOpHdr->OpCode == EFI_IFR_VARSTORE_EFI_OP ) {\r
IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
FreePool (GuidStr);\r
FreePool (NameStr);\r
FreePool (TempStr);\r
+\r
+ //\r
+ // Already found the varstore, break;\r
+ //\r
+ if (*IsEfiVarstore) {\r
+ break;\r
+ }\r
}\r
}\r
Done:\r
GuidStr = NULL;\r
TempStr = NULL;\r
\r
+ //\r
+ // If ConfigHdr has name field and varstore not has name, return FALSE.\r
+ //\r
+ if (Name == NULL && StrStr (ConfigHdr, L"NAME=&") == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *)VarstoreGuid, 1, &GuidStr);\r
if (Name != NULL) {\r
GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);\r
return RetVal;\r
}\r
\r
+/**\r
+ This function parses Form Package to get the efi varstore info according to the request ConfigHdr.\r
+\r
+ @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.\r
+ @param ConfigHdr Request string ConfigHdr. If it is NULL,\r
+ the first found varstore will be as ConfigHdr.\r
+ @retval TRUE This hii package is the reqeust one.\r
+ @retval FALSE This hii package is not the reqeust one.\r
+**/ \r
+BOOLEAN\r
+IsThisPackageList (\r
+ IN HII_DATABASE_RECORD *DataBaseRecord,\r
+ IN EFI_STRING ConfigHdr\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN IfrOffset;\r
+ UINTN PackageOffset;\r
+ EFI_IFR_OP_HEADER *IfrOpHdr;\r
+ CHAR16 *VarStoreName;\r
+ UINT8 *HiiFormPackage;\r
+ UINTN PackageSize;\r
+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+ EFI_IFR_VARSTORE *IfrVarStore;\r
+ EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;\r
+ BOOLEAN FindVarstore;\r
+\r
+ HiiFormPackage = NULL;\r
+ VarStoreName = NULL;\r
+ Status = EFI_SUCCESS;\r
+ FindVarstore = FALSE;\r
+\r
+ Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+\r
+ IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageOffset = IfrOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;\r
+\r
+ while (IfrOffset < PackageSize) {\r
+ //\r
+ // More than one form packages exist.\r
+ //\r
+ if (PackageOffset >= PackageHeader->Length) {\r
+ //\r
+ // Process the new form package.\r
+ //\r
+ PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ IfrOffset += PackageOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset);\r
+ }\r
+\r
+ IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);\r
+ IfrOffset += IfrOpHdr->Length;\r
+ PackageOffset += IfrOpHdr->Length;\r
+\r
+ switch (IfrOpHdr->OpCode) {\r
+ \r
+ case EFI_IFR_VARSTORE_OP:\r
+ IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;\r
+\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *)IfrVarStore->Name, VarStoreName);\r
+\r
+ if (IsThisVarstore((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+\r
+ case EFI_IFR_VARSTORE_EFI_OP:\r
+ IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName);\r
+\r
+ if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+\r
+ case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
+ IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *) IfrOpHdr;\r
+\r
+ if (IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+ \r
+ case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
+ //\r
+ // No matched varstore is found and directly return.\r
+ //\r
+ goto Done;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+Done:\r
+ if (HiiFormPackage != NULL) {\r
+ FreePool (HiiFormPackage);\r
+ }\r
+\r
+ if (VarStoreName != NULL) {\r
+ FreePool (VarStoreName);\r
+ }\r
+\r
+ return FindVarstore;\r
+}\r
+\r
/**\r
Check whether the this op code is required.\r
\r
{\r
EFI_STATUS Status;\r
UINTN IfrOffset;\r
+ UINTN PackageOffset;\r
EFI_IFR_VARSTORE *IfrVarStore;\r
EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
EFI_IFR_OP_HEADER *IfrOpHdr;\r
IFR_DEFAULT_DATA DefaultData;\r
IFR_DEFAULT_DATA *DefaultDataPtr;\r
IFR_BLOCK_DATA *BlockData;\r
- CHAR16 *VarStoreName;
- UINT16 VarWidth;
- UINT16 VarDefaultId;
- BOOLEAN FirstOneOfOption;
- LIST_ENTRY *LinkData;
- LIST_ENTRY *LinkDefault;
- EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;
-
- Status = EFI_SUCCESS;
- BlockData = NULL;
- DefaultDataPtr = NULL;
- FirstOneOfOption = FALSE;
+ CHAR16 *VarStoreName;\r
+ UINT16 VarWidth;\r
+ UINT16 VarDefaultId;\r
+ BOOLEAN FirstOneOfOption;\r
+ LIST_ENTRY *LinkData;\r
+ LIST_ENTRY *LinkDefault;\r
+ EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+\r
+ Status = EFI_SUCCESS;\r
+ BlockData = NULL;\r
+ DefaultDataPtr = NULL;\r
+ FirstOneOfOption = FALSE;\r
+ VarStoreId = 0;\r
ZeroMem (&DefaultData, sizeof (IFR_DEFAULT_DATA));\r
\r
//\r
// Go through the form package to parse OpCode one by one.\r
//\r
- IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) Package;\r
+ IfrOffset = PackageOffset;\r
while (IfrOffset < PackageLength) {\r
+\r
+ //\r
+ // More than one form package found.\r
+ //\r
+ if (PackageOffset >= PackageHeader->Length) {\r
+ //\r
+ // Already found varstore for this request, break;\r
+ //\r
+ if (VarStoreId != 0) {\r
+ VarStoreId = 0;\r
+ }\r
+\r
+ //\r
+ // Get next package header info.\r
+ //\r
+ IfrOffset += sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) (Package + IfrOffset);\r
+ }\r
+\r
IfrOpHdr = (EFI_IFR_OP_HEADER *) (Package + IfrOffset);\r
switch (IfrOpHdr->OpCode) {\r
case EFI_IFR_VARSTORE_OP:\r
//\r
// VarStore is found. Don't need to search any more.\r
//\r
- if (VarStorageData->VarStoreId != 0) {\r
+ if (VarStoreId != 0) {\r
break;\r
}\r
\r
// Find the matched VarStore\r
//\r
CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrVarStore->Guid);\r
- VarStorageData->VarStoreId = IfrVarStore->VarStoreId;\r
VarStorageData->Size = IfrVarStore->Size;\r
VarStorageData->Name = VarStoreName;\r
VarStorageData->Type = EFI_HII_VARSTORE_BUFFER;\r
+ VarStoreId = IfrVarStore->VarStoreId;\r
}\r
break;\r
\r
//\r
// VarStore is found. Don't need to search any more.\r
//\r
- if (VarStorageData->VarStoreId != 0) {\r
+ if (VarStoreId != 0) {\r
break;\r
}\r
\r
// Find the matched VarStore\r
//\r
CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrEfiVarStore->Guid);\r
- VarStorageData->VarStoreId = IfrEfiVarStore->VarStoreId;\r
VarStorageData->Size = IfrEfiVarStore->Size;\r
VarStorageData->Name = VarStoreName;\r
VarStorageData->Type = EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER;\r
+ VarStoreId = IfrEfiVarStore->VarStoreId;\r
}\r
break;\r
\r
//\r
// VarStore is found. Don't need to search any more.\r
//\r
- if (VarStorageData->VarStoreId != 0) {\r
+ if (VarStoreId != 0) {\r
break;\r
}\r
\r
// Find the matched VarStore\r
//\r
CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrNameValueVarStore->Guid);\r
- VarStorageData->VarStoreId = IfrNameValueVarStore->VarStoreId;\r
VarStorageData->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
+ VarStoreId = IfrNameValueVarStore->VarStoreId;\r
}\r
break;\r
\r
//\r
// No matched varstore is found and directly return.\r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if ( VarStoreId == 0) {\r
Status = EFI_SUCCESS;\r
goto Done;\r
}\r
//\r
// Ref question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if ( VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;\r
- if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrRef->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
VarWidth = (UINT16) (sizeof (EFI_HII_REF));\r
//\r
// Numeric and OneOf question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrOneOf = (EFI_IFR_ONE_OF *) IfrOpHdr;\r
- if (IfrOneOf->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrOneOf->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
VarWidth = (UINT16) (1 << (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE));\r
//\r
// OrderedList question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrOrderedList = (EFI_IFR_ORDERED_LIST *) IfrOpHdr;\r
- if (IfrOrderedList->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrOrderedList->Question.VarStoreId != VarStoreId) {\r
BlockData = NULL;\r
break;\r
}\r
//\r
// CheckBox question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrCheckBox = (EFI_IFR_CHECKBOX *) IfrOpHdr;\r
- if (IfrCheckBox->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrCheckBox->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
VarWidth = (UINT16) sizeof (BOOLEAN);\r
//\r
// Date question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrDate = (EFI_IFR_DATE *) IfrOpHdr;\r
- if (IfrDate->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrDate->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
\r
//\r
// Time question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrTime = (EFI_IFR_TIME *) IfrOpHdr;\r
- if (IfrTime->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrTime->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
\r
//\r
// String question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrString = (EFI_IFR_STRING *) IfrOpHdr;\r
- if (IfrString->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrString->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
\r
//\r
// Password question is not in IFR Form. This IFR form is not valid. \r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStoreId == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
// Check whether this question is for the requested varstore.\r
//\r
IfrPassword = (EFI_IFR_PASSWORD *) IfrOpHdr;\r
- if (IfrPassword->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ if (IfrPassword->Question.VarStoreId != VarStoreId) {\r
break;\r
}\r
\r
//\r
// End Opcode is for Var question.\r
//\r
- if (BlockData != NULL && BlockData->Scope > 0) {\r
- BlockData->Scope--;\r
+ if (BlockData != NULL) {\r
+ if (BlockData->Scope > 0) {\r
+ BlockData->Scope--;\r
+ }\r
+ if (BlockData->Scope == 0) {\r
+ BlockData = NULL;\r
+ }\r
}\r
+\r
break;\r
\r
default:\r
- if (BlockData != NULL && BlockData->Scope > 0) {\r
- BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);\r
+ if (BlockData != NULL) {\r
+ if (BlockData->Scope > 0) {\r
+ BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);\r
+ }\r
+\r
+ if (BlockData->Scope == 0) {\r
+ BlockData = NULL;\r
+ }\r
}\r
break;\r
}\r
\r
- IfrOffset += IfrOpHdr->Length;\r
+ IfrOffset += IfrOpHdr->Length;\r
+ PackageOffset += IfrOpHdr->Length;\r
}\r
\r
Done:\r
IFR_DEFAULT_DATA *DefaultIdArray;\r
IFR_VARSTORAGE_DATA *VarStorageData;\r
EFI_STRING DefaultAltCfgResp;\r
- EFI_STRING ConfigHdr;
- EFI_STRING StringPtr;
- EFI_STRING Progress;
-
- if (DataBaseRecord == NULL || DevicePath == NULL || Request == NULL || AltCfgResp == NULL) {
- return EFI_INVALID_PARAMETER;
+ EFI_STRING ConfigHdr;\r
+ EFI_STRING StringPtr;\r
+ EFI_STRING Progress;\r
+\r
+ if (DataBaseRecord == NULL || DevicePath == NULL || Request == NULL || AltCfgResp == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
DefaultIdArray = NULL;\r
VarStorageData = NULL;\r
DefaultAltCfgResp = NULL;\r
- ConfigHdr = NULL;
- HiiFormPackage = NULL;
- PackageSize = 0;
- Progress = *Request;
-
- Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);
+ ConfigHdr = NULL;\r
+ HiiFormPackage = NULL;\r
+ PackageSize = 0;\r
+ Progress = *Request;\r
+\r
+ Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// No requested varstore in IFR data and directly return\r
//\r
- if (VarStorageData->VarStoreId == 0) {\r
+ if (VarStorageData->Type == 0 && VarStorageData->Name == NULL) {\r
Status = EFI_SUCCESS;\r
goto Done;\r
}\r
UINT8 *VarStore;\r
UINTN BufferSize;\r
\r
- Status = EFI_SUCCESS;\r
- BufferSize = 0;\r
- VarStore = NULL;\r
- VarStoreName = NULL;\r
+ Status = EFI_SUCCESS;\r
+ BufferSize = 0;\r
+ VarStore = NULL;\r
+ VarStoreName = NULL;\r
+ *AccessProgress = Request;\r
\r
VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));\r
if (VarStoreName == NULL) {\r
Progress parameter is set to NULL.\r
@retval EFI_INVALID_PARAMETER Illegal syntax. Progress set to most recent &\r
before the error or the beginning of the string.\r
- @retval EFI_INVALID_PARAMETER Unknown name. Progress points to the & before the\r
- name in question.\r
+ @retval EFI_INVALID_PARAMETER The ExtractConfig function of the underlying HII\r
+ Configuration Access Protocol returned \r
+ EFI_INVALID_PARAMETER. Progress set to most recent\r
+ & before the error or the beginning of the string.\r
\r
**/\r
EFI_STATUS\r
BOOLEAN IsEfiVarStore;\r
EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;\r
EFI_STRING ErrorPtr;\r
+ UINTN DevicePathSize;\r
\r
if (This == NULL || Progress == NULL || Results == NULL) {\r
return EFI_INVALID_PARAMETER;\r
Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
- if (CompareMem (\r
- DevicePath,\r
- CurrentDevicePath,\r
- GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)\r
- ) == 0) {\r
+ DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);\r
+ if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Request)) {\r
DriverHandle = Database->DriverHandle;\r
HiiHandle = Database->Handle;\r
break;\r
instance.\r
@param Results Null-terminated Unicode string in\r
<MultiConfigAltResp> format which has all values\r
- filled in for the names in the Request string.\r
- String to be allocated by the called function.\r
- De-allocation is up to the caller.\r
+ filled in for the entirety of the current HII \r
+ database. String to be allocated by the called \r
+ function. De-allocation is up to the caller.\r
\r
@retval EFI_SUCCESS The Results string is filled with the values\r
corresponding to all requested names.\r
EFI_STRING AccessProgress;\r
EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;\r
BOOLEAN IsEfiVarstore;\r
+ UINTN DevicePathSize;\r
\r
if (This == NULL || Progress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
\r
if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
- if (CompareMem (\r
- DevicePath,\r
- CurrentDevicePath,\r
- GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)\r
- ) == 0) {\r
+ DevicePathSize = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);\r
+ if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Configuration)) {\r
DriverHandle = Database->DriverHandle;\r
break;\r
}\r
//\r
Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
if (EFI_ERROR (Status)) {\r
- *Progress = ConfigRequest;\r
+ *Progress = TmpPtr - 1;\r
goto Exit;\r
}\r
Offset = 0;\r
\r
StringPtr += Length;\r
if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {\r
- *Progress = StringPtr - Length - StrLen (L"OFFSET=") - 1;\r
+ *Progress = TmpPtr - 1;\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
//\r
Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
if (EFI_ERROR (Status)) {\r
- *Progress = ConfigRequest;\r
+ *Progress = TmpPtr - 1;\r
goto Exit;\r
}\r
Width = 0;\r
\r
StringPtr += Length;\r
if (*StringPtr != 0 && *StringPtr != L'&') {\r
- *Progress = StringPtr - Length - StrLen (L"&WIDTH=");\r
+ *Progress = TmpPtr - 1;\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
(see below) is returned.\r
@param BlockSize The length of the Block in units of UINT8. On\r
input, this is the size of the Block. On output,\r
- if successful, contains the index of the last\r
- modified byte in the Block.\r
+ if successful, contains the largest index of the\r
+ modified byte in the Block, or the required buffer\r
+ size if the Block is not large enough.\r
@param Progress On return, points to an element of the ConfigResp\r
string filled in with the offset of the most\r
recent '&' before the first failing name / value\r
value pair. Block is left updated and\r
Progress points at the '&' preceding the first\r
non-<BlockName>.\r
- @retval EFI_DEVICE_ERROR Block not large enough. Progress undefined.\r
+ @retval EFI_BUFFER_TOO_SMALL Block not large enough. Progress undefined. \r
+ BlockSize is updated with the required buffer size.\r
@retval EFI_NOT_FOUND Target for the specified routing data was not found.\r
Progress points to the "G" in "GUID" of the errant\r
routing data.\r
{\r
HII_DATABASE_PRIVATE_DATA *Private;\r
EFI_STRING StringPtr;\r
+ EFI_STRING TmpPtr;\r
UINTN Length;\r
EFI_STATUS Status;\r
UINT8 *TmpBuffer;\r
// <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE='<Number>\r
//\r
while (*StringPtr != 0 && StrnCmp (StringPtr, L"&OFFSET=", StrLen (L"&OFFSET=")) == 0) {\r
+ TmpPtr = StringPtr;\r
StringPtr += StrLen (L"&OFFSET=");\r
//\r
// Get Offset\r
//\r
Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
if (EFI_ERROR (Status)) {\r
- *Progress = ConfigResp;\r
+ *Progress = TmpPtr;\r
goto Exit;\r
}\r
Offset = 0;\r
\r
StringPtr += Length;\r
if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {\r
- *Progress = StringPtr - Length - StrLen (L"&OFFSET=");\r
+ *Progress = TmpPtr;\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
//\r
Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
if (EFI_ERROR (Status)) {\r
- *Progress = ConfigResp;\r
+ *Progress = TmpPtr;\r
goto Exit;\r
}\r
Width = 0;\r
\r
StringPtr += Length;\r
if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) != 0) {\r
- *Progress = StringPtr - Length - StrLen (L"&WIDTH=");\r
+ *Progress = TmpPtr;\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
//\r
Status = GetValueOfNumber (StringPtr, &Value, &Length);\r
if (EFI_ERROR (Status)) {\r
- *Progress = ConfigResp;\r
+ *Progress = TmpPtr;\r
goto Exit;\r
}\r
\r
StringPtr += Length;\r
if (*StringPtr != 0 && *StringPtr != L'&') {\r
- *Progress = StringPtr - Length - StrLen (L"&VALUE=");\r
+ *Progress = TmpPtr;\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
if (MaxBlockSize > BufferSize) {\r
*BlockSize = MaxBlockSize;\r
if (Block != NULL) {\r
- return EFI_DEVICE_ERROR;\r
+ return EFI_BUFFER_TOO_SMALL;\r
}\r
}\r
\r