+BcfgAddOptInstall1(\r
+ IN CONST CHAR16 *OptData,\r
+ IN CONST UINT16 *CurrentOrder,\r
+ IN CONST UINTN OrderCount,\r
+ IN CONST BCFG_OPERATION_TARGET Target\r
+ )\r
+{\r
+ EFI_KEY_OPTION NewKeyOption;\r
+ EFI_KEY_OPTION *KeyOptionBuffer;\r
+ SHELL_STATUS ShellStatus;\r
+ EFI_STATUS Status;\r
+ UINT16 OptionIndex;\r
+ UINT16 LoopCounter;\r
+ UINT64 Intermediate;\r
+ CONST CHAR16 *Temp;\r
+ CONST CHAR16 *Walker;\r
+ CHAR16 *FileName;\r
+ CHAR16 *Temp2;\r
+ CHAR16 *Data;\r
+ UINT16 KeyIndex;\r
+ CHAR16 VariableName[12];\r
+\r
+ SHELL_FILE_HANDLE FileHandle;\r
+\r
+ Status = EFI_SUCCESS;\r
+ ShellStatus = SHELL_SUCCESS;\r
+ Walker = OptData;\r
+ FileName = NULL;\r
+ Data = NULL;\r
+ KeyOptionBuffer = NULL;\r
+\r
+ ZeroMem(&NewKeyOption, sizeof(EFI_KEY_OPTION));\r
+\r
+ while(Walker[0] == L' ') {\r
+ Walker++;\r
+ }\r
+\r
+ //\r
+ // Get the index of the variable we are changing.\r
+ //\r
+ Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
+ if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL || ((UINT16)Intermediate) > ((UINT16)OrderCount)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ return (ShellStatus);\r
+ }\r
+ OptionIndex = (UINT16)Intermediate;\r
+\r
+ Temp = StrStr(Walker, L" ");\r
+ if (Temp != NULL) {\r
+ Walker = Temp;\r
+ }\r
+ while(Walker[0] == L' ') {\r
+ Walker++;\r
+ }\r
+\r
+ //\r
+ // determine whether we have file with data, quote delimited information, or a hot-key \r
+ //\r
+ if (Walker[0] == L'\"') {\r
+ //\r
+ // quoted filename or quoted information.\r
+ //\r
+ Temp = StrStr(Walker+1, L"\"");\r
+ if (Temp == NULL || StrLen(Temp) != 1) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } else {\r
+ FileName = StrnCatGrow(&FileName, NULL, Walker+1, 0);\r
+ if (FileName == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellInstall1HiiHandle);\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ return (ShellStatus);\r
+ }\r
+ Temp2 = StrStr(FileName, L"\"");\r
+ ASSERT(Temp2 != NULL);\r
+ Temp2[0] = CHAR_NULL;\r
+ Temp2++;\r
+ if (StrLen(Temp2)>0) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+ if (EFI_ERROR(ShellFileExists(Walker))) {\r
+ //\r
+ // Not a file. must be misc information.\r
+ //\r
+ Data = FileName;\r
+ FileName = NULL;\r
+ } else {\r
+ FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
+ }\r
+ }\r
+ } else {\r
+ //\r
+ // filename or hot key information.\r
+ //\r
+ if (StrStr(Walker, L" ") == NULL) {\r
+ //\r
+ // filename\r
+ //\r
+ if (EFI_ERROR(ShellFileExists(Walker))) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } else {\r
+ FileName = StrnCatGrow(&FileName, NULL, Walker, 0);\r
+ }\r
+ } else {\r
+ if (Target != BcfgTargetBootOrder) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellInstall1HiiHandle);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (ShellStatus == SHELL_SUCCESS) {\r
+ //\r
+ // Get hot key information\r
+ //\r
+ Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
+ if (EFI_ERROR(Status) || (((UINT32)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+ NewKeyOption.KeyData = (UINT32)Intermediate;\r
+ Temp = StrStr(Walker, L" ");\r
+ if (Temp != NULL) {\r
+ Walker = Temp;\r
+ }\r
+ while(Walker[0] == L' ') {\r
+ Walker++;\r
+ }\r
+ }\r
+\r
+ if (ShellStatus == SHELL_SUCCESS) {\r
+ //\r
+ // Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct. \r
+ // Re-allocate with the added information.\r
+ //\r
+ KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)), &NewKeyOption);\r
+ if (KeyOptionBuffer == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ }\r
+ }\r
+ for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption); LoopCounter++) {\r
+ //\r
+ // ScanCode\r
+ //\r
+ Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
+ if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+ ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].ScanCode = (UINT16)Intermediate;\r
+ Temp = StrStr(Walker, L" ");\r
+ if (Temp != NULL) {\r
+ Walker = Temp;\r
+ }\r
+ while(Walker[0] == L' ') {\r
+ Walker++;\r
+ }\r
+\r
+ //\r
+ // UnicodeChar\r
+ //\r
+ Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE);\r
+ if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+ ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].UnicodeChar = (UINT16)Intermediate;\r
+ Temp = StrStr(Walker, L" ");\r
+ if (Temp != NULL) {\r
+ Walker = Temp;\r
+ }\r
+ while(Walker[0] == L' ') {\r
+ Walker++;\r
+ }\r
+ }\r
+\r
+ if (ShellStatus == SHELL_SUCCESS) {\r
+ //\r
+ // Now do the BootOption / BootOptionCrc\r
+ //\r
+ ASSERT (OptionIndex <= OrderCount);\r
+ KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex];\r
+ Status = GetBootOptionCrc(&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption);\r
+ if (EFI_ERROR(Status)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index");\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } \r
+ }\r
+\r
+ if (ShellStatus == SHELL_SUCCESS) {\r
+ for (Temp2 = NULL, KeyIndex = 0 ; KeyIndex < 0xFFFF ; KeyIndex++) {\r
+ UnicodeSPrint(VariableName, sizeof(VariableName), L"Key%04x", KeyIndex);\r
+ Status = gRT->GetVariable(\r
+ VariableName,\r
+ (EFI_GUID*)&gEfiGlobalVariableGuid,\r
+ NULL,\r
+ (UINTN*)&Intermediate,\r
+ NULL);\r
+ if (Status == EFI_NOT_FOUND) {\r
+ break;\r
+ }\r
+ }\r
+ Status = gRT->SetVariable(\r
+ VariableName,\r
+ (EFI_GUID*)&gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
+ sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * KEY_OPTION_INPUT_KEY_COUNT (&NewKeyOption)),\r
+ KeyOptionBuffer);\r
+ if (EFI_ERROR(Status)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } \r
+ ASSERT(FileName == NULL && Data == NULL);\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Shouldn't be possible to have have both. Neither is ok though.\r
+ //\r
+ ASSERT(FileName == NULL || Data == NULL);\r
+\r
+ if (ShellStatus == SHELL_SUCCESS && (FileName != NULL || Data != NULL)) {\r
+ if (FileName != NULL) {\r
+ //\r
+ // Open the file and populate the data buffer.\r
+ //\r
+ Status = ShellOpenFileByName(\r
+ FileName,\r
+ &FileHandle,\r
+ EFI_FILE_MODE_READ,\r
+ 0);\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = ShellGetFileSize(FileHandle, &Intermediate);\r
+ }\r
+ Data = AllocateZeroPool((UINTN)Intermediate);\r
+ if (Data == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle);\r
+ ShellStatus = SHELL_OUT_OF_RESOURCES;\r
+ }\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = ShellReadFile(FileHandle, (UINTN *)&Intermediate, Data);\r
+ }\r
+ } else {\r
+ Intermediate = StrSize(Data);\r
+ }\r
+\r
+ if (!EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS && Data != NULL) {\r
+ Status = UpdateOptionalData(CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8*)Data, Target);\r
+ if (EFI_ERROR(Status)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } \r
+ }\r
+ if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } \r
+ }\r
+\r
+ SHELL_FREE_NON_NULL(Data);\r
+ SHELL_FREE_NON_NULL(KeyOptionBuffer);\r
+ SHELL_FREE_NON_NULL(FileName);\r
+ return ShellStatus;\r
+}\r
+\r
+/**\r
+ Function to dump the Bcfg information.\r
+\r
+ @param[in] Op The operation.\r
+ @param[in] OrderCount How many to dump.\r
+ @param[in] CurrentOrder The pointer to the current order of items.\r
+ @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.\r
+\r
+ @retval SHELL_SUCCESS The dump was successful.\r
+ @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
+**/\r
+SHELL_STATUS\r
+EFIAPI\r
+BcfgDisplayDumpInstall1(\r