无法使用 StartImage() 启动 windows 启动管理器
Unable to start the windows boot manager with StartImage()
我正在编写自己的引导加载程序,我希望能够引导 Windows(和 Linux)。
bootmgfw.efi
是 windows 引导加载程序,我正在尝试使用 UEFI 函数 LoadImage()
和 StartImage()
加载并启动它,但是在调用 StartImage()
,我收到 EFI_INVALID_PARAMETER
错误,即使我检查图像句柄有效并且 LoadImage()
没有 return 错误状态。
我可以使用相同的代码启动其他 EFI 应用程序,但 bootmgfw.efi
是唯一一个无法启动的应用程序,尽管我可以在 UEFI Shell 中启动它,很好.
这里有一些上下文可以展示我所做的事情。我正在使用 POSIX-UEFI 编写我的代码。
// Opening the root volume
efi_handle_t device = LIP->DeviceHandle;
efi_simple_file_system_protocol_t* fsProtocol = NULL;
efi_guid_t fsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
BS->OpenProtocol(device, &fsGuid, (void**)&fsProtocol, IM, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
efi_file_handle_t* rootDir = NULL;
fsProtocol->OpenVolume(fsProtocol, &rootDir);
// Opening the bootloader file
efi_file_handle_t* winBootMgrHandle = NULL;
uint16_t path[] = u"EFI\Microsoft\Boot\bootmgfw.efi";
rootDir->Open(rootDir, &winBootMgrHandle, path, EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY);
// Getting file info for the file size
efi_guid_t infoGuid = EFI_FILE_INFO_GUID;
efi_file_info_t fileInfo;
uintn_t infoSize = sizeof(fileInfo);
winBootMgrHandle->GetInfo(winBootMgrHandle, &infoGuid, &infoSize, &fileInfo);
// Reading the file into a buffer
uintn_t winBootMgrSize = fileInfo.FileSize;
char* winBootMgrData = (char*)malloc(winBootMgrSize + 1);
winBootMgrData[winBootMgrSize] = 0;
winBootMgrHandle->Read(winBootMgrHandle, &winBootMgrSize, winBootMgrData);
// Loading and starting the image
efi_handle_t imgHandle;
BS->LoadImage(0, IM, LIP->FilePath, winBootMgrData, winBootMgrSize, &imgHandle);
BS->StartImage(imgHandle, NULL, NULL); // returns -2: invalid parameter
我不明白为什么会出现此错误以及如何修复它。我想知道如何修复此错误并启动此 windows 引导加载程序。
我在这里得到了解决方案。事实证明我确实将错误的设备路径传递给 LoadImage()
。
https://forum.osdev.org/viewtopic.php?f=1&t=50623
我正在编写自己的引导加载程序,我希望能够引导 Windows(和 Linux)。
bootmgfw.efi
是 windows 引导加载程序,我正在尝试使用 UEFI 函数 LoadImage()
和 StartImage()
加载并启动它,但是在调用 StartImage()
,我收到 EFI_INVALID_PARAMETER
错误,即使我检查图像句柄有效并且 LoadImage()
没有 return 错误状态。
我可以使用相同的代码启动其他 EFI 应用程序,但 bootmgfw.efi
是唯一一个无法启动的应用程序,尽管我可以在 UEFI Shell 中启动它,很好.
这里有一些上下文可以展示我所做的事情。我正在使用 POSIX-UEFI 编写我的代码。
// Opening the root volume
efi_handle_t device = LIP->DeviceHandle;
efi_simple_file_system_protocol_t* fsProtocol = NULL;
efi_guid_t fsGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
BS->OpenProtocol(device, &fsGuid, (void**)&fsProtocol, IM, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
efi_file_handle_t* rootDir = NULL;
fsProtocol->OpenVolume(fsProtocol, &rootDir);
// Opening the bootloader file
efi_file_handle_t* winBootMgrHandle = NULL;
uint16_t path[] = u"EFI\Microsoft\Boot\bootmgfw.efi";
rootDir->Open(rootDir, &winBootMgrHandle, path, EFI_FILE_MODE_READ, EFI_FILE_READ_ONLY);
// Getting file info for the file size
efi_guid_t infoGuid = EFI_FILE_INFO_GUID;
efi_file_info_t fileInfo;
uintn_t infoSize = sizeof(fileInfo);
winBootMgrHandle->GetInfo(winBootMgrHandle, &infoGuid, &infoSize, &fileInfo);
// Reading the file into a buffer
uintn_t winBootMgrSize = fileInfo.FileSize;
char* winBootMgrData = (char*)malloc(winBootMgrSize + 1);
winBootMgrData[winBootMgrSize] = 0;
winBootMgrHandle->Read(winBootMgrHandle, &winBootMgrSize, winBootMgrData);
// Loading and starting the image
efi_handle_t imgHandle;
BS->LoadImage(0, IM, LIP->FilePath, winBootMgrData, winBootMgrSize, &imgHandle);
BS->StartImage(imgHandle, NULL, NULL); // returns -2: invalid parameter
我不明白为什么会出现此错误以及如何修复它。我想知道如何修复此错误并启动此 windows 引导加载程序。
我在这里得到了解决方案。事实证明我确实将错误的设备路径传递给 LoadImage()
。
https://forum.osdev.org/viewtopic.php?f=1&t=50623