CONST CHAR16 *OptData;\r
} BGFG_OPERATION;\r
\r
+/**\r
+ This function will populate the device path protocol parameter based on TheHandle.\r
+ \r
+ @param[in,out] DevPath On a sucessful return the device path to the handle.\r
+\r
+ @retval EFI_SUCCESS The device path was sucessfully returned.\r
+ @retval other A error from gBS->HandleProtocol.\r
+\r
+ @sa HandleProtocol\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDevicePathForDriverHandleDebug1 (\r
+ IN EFI_HANDLE TheHandle,\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
+ EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
+\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID**)&LoadedImage,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->OpenProtocol (\r
+ LoadedImage->DeviceHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID**)&ImageDevicePath,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+// *DevPath = DuplicateDevicePath (ImageDevicePath);\r
+// *FilePath = DuplicateDevicePath (LoadedImage->FilePath);\r
+ *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath);\r
+ gBS->CloseProtocol(\r
+ LoadedImage->DeviceHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ gImageHandle,\r
+ NULL);\r
+ }\r
+ gBS->CloseProtocol(\r
+ TheHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ gImageHandle,\r
+ NULL);\r
+ }\r
+ return (Status);\r
+}\r
+\r
/**\r
Function to add a option.\r
\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
EFI_DEVICE_PATH_PROTOCOL *FilePath;\r
EFI_DEVICE_PATH_PROTOCOL *FileNode;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
+// EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
CHAR16 *Str;\r
- CONST CHAR16 *StringWalker;\r
+// CONST CHAR16 *StringWalker;\r
UINT8 *TempByteBuffer;\r
UINT8 *TempByteStart;\r
EFI_SHELL_FILE_INFO *Arg;\r
UINTN ChildControllerHandleCount;\r
SHELL_STATUS ShellStatus;\r
UINT16 *NewOrder;\r
- UINT64 Intermediate;\r
\r
if (!UseHandle) {\r
if (File == NULL || Desc == NULL) {\r
TargetLocation = 0xFFFF;\r
\r
if (UseHandle) {\r
- Status = ShellConvertStringToUint64(File, &Intermediate, TRUE, FALSE);\r
- CurHandle = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
- if (CurHandle == NULL || EFI_ERROR(Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, File);\r
+ CurHandle = ConvertHandleIndexToHandle(HandleNumber);\r
+ if (CurHandle == NULL) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
- //\r
- //Make sure that the handle should point to a real controller\r
- //\r
- Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
- CurHandle,\r
- &DriverBindingHandleCount,\r
- NULL);\r
-\r
- Status = PARSE_HANDLE_DATABASE_PARENTS (\r
- CurHandle,\r
- &ParentControllerHandleCount,\r
- NULL);\r
-\r
- Status = ParseHandleDatabaseForChildControllers (\r
- CurHandle,\r
- &ChildControllerHandleCount,\r
- NULL);\r
-\r
- if (DriverBindingHandleCount > 0\r
- || ParentControllerHandleCount > 0\r
- || ChildControllerHandleCount > 0) {\r
- FilePath = NULL;\r
+ if (Target == BcfgTargetBootOrder) {\r
+ //\r
+ //Make sure that the handle should point to a real controller\r
+ //\r
+ Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
+ CurHandle,\r
+ &DriverBindingHandleCount,\r
+ NULL);\r
+\r
+ Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+ CurHandle,\r
+ &ParentControllerHandleCount,\r
+ NULL);\r
+\r
+ Status = ParseHandleDatabaseForChildControllers (\r
+ CurHandle,\r
+ &ChildControllerHandleCount,\r
+ NULL);\r
+\r
+ if (DriverBindingHandleCount > 0\r
+ || ParentControllerHandleCount > 0\r
+ || ChildControllerHandleCount > 0) {\r
+ FilePath = NULL;\r
+ Status = gBS->HandleProtocol (\r
+ CurHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID**)&FilePath);\r
+ }\r
+ if (EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, HandleNumber);\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ }\r
+ } else {\r
+ //\r
+ //Make sure that the handle should point to driver, not a controller.\r
+ //\r
+ Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
+ CurHandle,\r
+ &DriverBindingHandleCount,\r
+ NULL);\r
+\r
+ Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+ CurHandle,\r
+ &ParentControllerHandleCount,\r
+ NULL);\r
+\r
+ Status = ParseHandleDatabaseForChildControllers (\r
+ CurHandle,\r
+ &ChildControllerHandleCount,\r
+ NULL);\r
+\r
Status = gBS->HandleProtocol (\r
CurHandle,\r
&gEfiDevicePathProtocolGuid,\r
(VOID**)&FilePath);\r
- }\r
- if (EFI_ERROR (Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, Intermediate);\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
+\r
+ if (DriverBindingHandleCount > 0\r
+ || ParentControllerHandleCount > 0\r
+ || ChildControllerHandleCount > 0\r
+ || !EFI_ERROR(Status) ) {\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");\r
+ ShellStatus = SHELL_INVALID_PARAMETER;\r
+ } else {\r
+ //\r
+ // Get the DevicePath from the loaded image information.\r
+ //\r
+ Status = GetDevicePathForDriverHandleDebug1(CurHandle, &FilePath);\r
+ }\r
}\r
}\r
} else {\r
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName);\r
ShellStatus = SHELL_UNSUPPORTED;\r
} else {\r
+/*\r
if (UsePath) {\r
DevPath = DevicePath;\r
while (!IsDevicePathEnd(DevPath)) {\r
FilePath = AppendDevicePath(DevicePath, FileNode);\r
FreePool(FileNode);\r
} else {\r
+*/\r
FilePath = DuplicateDevicePath(DevicePath);\r
+/*\r
}\r
-\r
+*/\r
FreePool(DevicePath);\r
}\r
}\r
FilePathSize = GetDevicePathSize (FilePath);\r
\r
TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize);\r
- TempByteStart = TempByteBuffer;\r
- *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
- TempByteBuffer += sizeof (UINT32);\r
+ if (TempByteBuffer != NULL) {\r
+ TempByteStart = TempByteBuffer;\r
+ *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
+ TempByteBuffer += sizeof (UINT32);\r
\r
- *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
- TempByteBuffer += sizeof (UINT16);\r
+ *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
+ TempByteBuffer += sizeof (UINT16);\r
\r
- CopyMem (TempByteBuffer, Desc, DescSize);\r
- TempByteBuffer += DescSize;\r
- CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
+ CopyMem (TempByteBuffer, Desc, DescSize);\r
+ TempByteBuffer += DescSize;\r
+ CopyMem (TempByteBuffer, FilePath, FilePathSize);\r
\r
- UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
- Status = gRT->SetVariable (\r
- OptionStr,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
- TempByteStart\r
- );\r
-\r
- FreePool(TempByteStart);\r
+ UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);\r
+ Status = gRT->SetVariable (\r
+ OptionStr,\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
+ sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
+ TempByteStart\r
+ );\r
+\r
+ FreePool(TempByteStart);\r
+ } else {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
if (EFI_ERROR(Status)) {\r
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, OptionStr, Status);\r
}\r
}\r
}\r
- if (FileNode != NULL) {\r
- FreePool (FileNode);\r
- }\r
\r
//\r
//If always Free FilePath, will free devicepath in system when use "addh"\r
//\r
-\r
if (FilePath!=NULL && !UseHandle) {\r
FreePool (FilePath);\r
}\r
IN CONST BCFG_OPERATION_TARGET Target,\r
IN CONST UINT16 *CurrentOrder,\r
IN CONST UINTN OrderCount,\r
- IN CONST UINT16 Location\r
+ IN CONST UINT16 Location\r
)\r
{\r
CHAR16 VariableName[12];\r
UINT16 *NewOrder;\r
EFI_STATUS Status;\r
- UINTN LoopVar;\r
UINTN NewCount;\r
\r
- UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Location);\r
+ UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);\r
Status = gRT->SetVariable(\r
VariableName,\r
(EFI_GUID*)&gEfiGlobalVariableGuid,\r
return (SHELL_INVALID_PARAMETER);\r
}\r
NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));\r
- NewCount = OrderCount;\r
- CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
- for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++){\r
- if (NewOrder[LoopVar] == Location) {\r
- CopyMem(NewOrder+LoopVar, NewOrder+LoopVar+1, (OrderCount - LoopVar - 1)*sizeof(CurrentOrder[0]));\r
- NewCount--;\r
- }\r
+ if (NewOrder != NULL) {\r
+ NewCount = OrderCount;\r
+ CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));\r
+ CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));\r
+ NewCount--;\r
+\r
+ Status = gRT->SetVariable(\r
+ Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
+ (EFI_GUID*)&gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
+ NewCount*sizeof(NewOrder[0]),\r
+ NewOrder);\r
+ FreePool(NewOrder);\r
+ } else {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
}\r
- Status = gRT->SetVariable(\r
- Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",\r
- (EFI_GUID*)&gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,\r
- NewCount*sizeof(NewOrder[0]),\r
- NewOrder);\r
- FreePool(NewOrder);\r
-\r
if (EFI_ERROR(Status)) {\r
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);\r
return (SHELL_INVALID_PARAMETER);\r
return (SHELL_SUCCESS);\r
}\r
\r
+/**\r
+ Function to add optional data to an option.\r
+\r
+ @param[in] OptData The optional data to add.\r
+ @param[in] Target The target of the operation.\r
+\r
+ @retval SHELL_SUCCESS The operation was succesful.\r
+**/\r
SHELL_STATUS\r
EFIAPI\r
BcfgAddOptDebug1(\r
return (SHELL_INVALID_PARAMETER);\r
}\r
\r
- DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
- CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
- DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
+ if ((*(UINT16*)(Buffer+4)) != 0) {\r
+ DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));\r
+ CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));\r
+ DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
+ } else {\r
+ DevPath = NULL;\r
+ DevPathString = NULL;\r
+ }\r
ShellPrintHiiEx(\r
-1,\r
-1,\r