UEFI代码使用UnicodeSPrint 函数拼接字符串并用ShellProtocol->Execute函数执行,报错UEFI Failed to execute Shell command:Invalid Parameter,原因是什么
时间: 2024-06-01 20:10:06 浏览: 376
可能原因:
1. UnicodeSPrint函数使用不正确,导致拼接的字符串格式不正确。
2. ShellProtocol->Execute函数传递的参数不正确,例如路径或参数格式错误。
3. 执行的Shell命令本身存在问题,例如不支持当前版本的UEFI或执行时需要特定的权限。
4. UEFI系统本身存在问题,例如UEFI环境中缺少必要的文件或配置不正确等。
相关问题
EDK2写UEFI代码,使用UnicodeSPrint 函数拼接字符串pci bus dev fun >> txt并用ShellProtocol->Execute函数执行
以下是示例代码:
```
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/Shell.h>
#include <Library/BaseLib.h>
#include <Library/PrintLib.h>
EFI_STATUS
EFIAPI
UefiMain(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL* PciRootBridgeIo;
UINTN Segment, Bus, Device, Function;
// Retrieve the PCI Root Bridge IO Protocol
Status = gBS->LocateProtocol(&gEfiPciRootBridgeIoProtocolGuid, NULL, (VOID**)&PciRootBridgeIo);
if (EFI_ERROR(Status)) {
Print(L"Failed to locate PCI Root Bridge IO Protocol: %r\n", Status);
return Status;
}
// Get the PCI bus, device, and function numbers of a device
Status = PciRootBridgeIo->Pci.Read(PciRootBridgeIo, EfiPciWidthUint16, 0, 0, 0, &Segment);
if (EFI_ERROR(Status)) {
Print(L"Failed to read PCI configuration space: %r\n", Status);
return Status;
}
Status = PciRootBridgeIo->Pci.Read(PciRootBridgeIo, EfiPciWidthUint16, 0, 0, 1, &Bus);
if (EFI_ERROR(Status)) {
Print(L"Failed to read PCI configuration space: %r\n", Status);
return Status;
}
Status = PciRootBridgeIo->Pci.Read(PciRootBridgeIo, EfiPciWidthUint16, 0, 0, 2, &Device);
if (EFI_ERROR(Status)) {
Print(L"Failed to read PCI configuration space: %r\n", Status);
return Status;
}
Status = PciRootBridgeIo->Pci.Read(PciRootBridgeIo, EfiPciWidthUint16, 0, 0, 3, &Function);
if (EFI_ERROR(Status)) {
Print(L"Failed to read PCI configuration space: %r\n", Status);
return Status;
}
// Convert the PCI bus, device, and function numbers to a string
CHAR16 Buffer[32];
UnicodeSPrint(Buffer, sizeof(Buffer), L"%04x:%02x:%02x.%x", Segment, Bus, Device, Function);
// Execute the "echo" command with the string as an argument
CHAR16 Command[64];
UnicodeSPrint(Command, sizeof(Command), L"echo %s", Buffer);
Status = ShellExecute(&gEfiShellProtocolGuid, Command, NULL, NULL);
if (EFI_ERROR(Status)) {
Print(L"Failed to execute command: %r\n", Status);
return Status;
}
return EFI_SUCCESS;
}
```
这个代码使用了UnicodeSPrint函数将PCI总线,设备和功能号拼接成一个字符串,然后使用ShellProtocol->Execute函数执行一个“echo”命令,并将字符串作为参数传递给该命令。在实际使用中,您需要替换PCI设备的总线,设备和功能号,并根据需要更改Shell命令。
EDK2编写UEFI程序将数字拼接成字符串并用shell命令输出
以下是一个示例程序,可将两个数字拼接成一个字符串,并使用Shell命令输出:
```
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/Shell.h>
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
UINTN Number1 = 123;
UINTN Number2 = 456;
CHAR16 String[20];
// 将数字拼接成字符串
UnicodeSPrint(String, sizeof(String), L"%d%d", Number1, Number2);
// 使用Shell命令输出字符串
SHELL_PROTOCOL *ShellProtocol;
Status = gBS->LocateProtocol(&gEfiShellProtocolGuid, NULL, (VOID **)&ShellProtocol);
if (EFI_ERROR(Status)) {
Print(L"Failed to locate Shell protocol: %r\n", Status);
return Status;
}
Status = ShellProtocol->Execute(String, NULL, NULL);
if (EFI_ERROR(Status)) {
Print(L"Failed to execute Shell command: %r\n", Status);
return Status;
}
return EFI_SUCCESS;
}
```
在此示例中,我们首先将数字123和456拼接成一个字符串,然后使用Shell协议执行该字符串作为Shell命令。请注意,此示例仅适用于UEFI Shell环境,因为使用了Shell协议。如果要在其他UEFI应用程序中使用,请使用其他方法输出字符串,如将其写入文件或使用UEFI的标准输出函数。
阅读全文