ionescu007/VisualUefi
GitHub: ionescu007/VisualUefi
在Visual Studio中原生开发调试UEFI固件的一站式解决方案,无需EDK-II复杂构建工具链。
Stars: 594 | Forks: 135
## 概要
VisualUEFI 是
* 一个解决方案和一组 Visual Studio 项目文件,允许构建官方 EDK-II(包括 OpenSSL 1.1.0e),而无需使用 inf 文件、Python 和其他 50 种构建工具、自定义依赖项跟踪器和构建系统,以及其他二十种自定义代码片段。
EDK-II 和 OpenSSL 作为子模块存在,直接来自官方 TianoCore 树,且未对它们进行任何更改。
* 一个解决方案和几个 Visual Studio 项目文件,用于展示四个 UEFI 示例组件:一个 UEFI 应用程序及其关联的 UEFI 启动驱动程序、EDK-II 示例 FtdiUsbSerialDxe 驱动程序,以及使用 OpenSSL 1.1.0e 的 EDK-II 示例 Cryptest 应用程序。该代码 100% 兼容 EDK-II,但改用 VisualUEFI 构建。
* 一个可在 Windows 上运行且快速的 QEMU64 2.10 副本,带有最新的 UEFI 2.6 OVMF 安全启动 ROM,其中包括 SMM 支持和实际受保护的闪存,用于注册 PK/KEK/DB/DBX 密钥。这些将根据需要持续更新。这与 Visual Studio 示例解决方案集成在一起,因此按 F5 即可启动实例进行测试。
如果您想了解更多关于我的研究或工作的信息,邀请您查看我的博客 http://www.alex-ionescu.com 以及我的培训与咨询公司 Winsider Seminars & Solutions Inc.,网址是 http://www.windows-internals.com。
## 代码示例
这是一个非常简单的 UEFI 应用程序与 UEFI 驱动程序协议通信的示例。此示例是 VisualUefi 的一部分。
```
//
// Basic UEFI Libraries
//
#include
#include
#include
#include
//
// Boot and Runtime Services
//
#include
#include
//
// Custom Driver Protocol
//
#include "../UefiDriver/drvproto.h"
EFI_GUID gEfiSampleDriverProtocolGuid = EFI_SAMPLE_DRIVER_PROTOCOL_GUID;
//
// We run on any UEFI Specification
//
extern CONST UINT32 _gUefiDriverRevision = 0;
//
// Our name
//
CHAR8 *gEfiCallerBaseName = "UefiApplication";
EFI_STATUS
EFIAPI
UefiUnload (
IN EFI_HANDLE ImageHandle
)
{
//
// This code should be compiled out and never called
//
ASSERT(FALSE);
}
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE* SystemTable
)
{
EFI_STATUS efiStatus;
SHELL_FILE_HANDLE fileHandle;
UINT8 buffer[4];
UINTN readSize;
EFI_SAMPLE_DRIVER_PROTOCOL* sampleProtocol;
//
// Print stuff out
//
fileHandle = NULL;
Print(L"Hello World! My handle is %lx and System Table is at %p\n",
ImageHandle, SystemTable);
//
// Initialize the shell library
//
efiStatus = ShellInitialize();
if (EFI_ERROR(efiStatus))
{
Print(L"Failed to initialize shell: %lx\n", efiStatus);
goto Exit;
}
//
// Open ourselves
//
efiStatus = ShellOpenFileByName(L"fs1:\\UefiApplication.efi",
&fileHandle,
EFI_FILE_MODE_READ,
0);
if (EFI_ERROR(efiStatus))
{
Print(L"Failed to open ourselves: %lx\n", efiStatus);
fileHandle = NULL;
goto Exit;
}
//
// Read 4 bytes at the top (MZ header)
//
readSize = sizeof(buffer);
efiStatus = ShellReadFile(fileHandle, &readSize, &buffer);
if (EFI_ERROR(efiStatus))
{
Print(L"Failed to read ourselves: %lx\n", efiStatus);
goto Exit;
}
//
// Print it
//
Print(L"Data: %lx\n", *(UINT32*)buffer);
//
// Check if the sample driver is loaded
//
efiStatus = gBS->LocateProtocol(&gEfiSampleDriverProtocolGuid, NULL, &sampleProtocol);
if (EFI_ERROR(efiStatus))
{
Print(L"Failed to locate our driver: %lx\n", efiStatus);
goto Exit;
}
//
// Print the value and exit
//
Print(L"Sample driver is loaded: %lx\n", sampleProtocol->SampleValue);
Exit:
//
// Close our file handle
//
if (fileHandle != NULL)
{
ShellCloseFile(&fileHandle);
}
//
// Sample complete!
//
return efiStatus;
}
```
## 动机
虽然 EDK-II 的构建子系统支持 Visual Studio,但它不支持“IDE 内部”构建。相反,它使用特殊的 .inf 文件和其他模板来定义项目,并且必须运行由多个第三方工具(包括对 Python、Ruby 和 Perl 的依赖)组成的自定义构建。对于已经熟悉 Visual Studio 项目文件/MSBUILD 及其提供的 IDE 的开发人员来说,这可能既繁琐又受限,从而降低了快速投入 UEFI 开发的能力。此外,EDK-II 的默认“测试”环境是在应用程序周围构建一个 Windows “NT32” 层,并将其作为命令行可执行文件运行。虽然这对于非常简单的应用程序可能有效,但它无法可靠地提供用于测试 DXE 驱动程序、运行时服务等的环境。
VisualUefi 旨在通过使用适当的 Visual Studio 构建环境编译 100% 未修改的 EDK-II 库来弥补这些差距,添加一些 VisualUefi 特定的粘合代码以支持在 Visual Studio 内部构建而无需第三方工具,并包含最新的 QEMU 和带 SecureBoot 的 OVMF 包用于 UEFI 的裸机测试,而无需依赖 Windows 仿真。
## 安装说明
首先安装 NASM ( ) 并检查环境变量 NASM_PREFIX 是否正确设置为 NASM 安装路径。不需要其他第三方工具。
然后,您应该能够在 Visual Studio 2015 或 2017 中打开 EDK-II.SLN 文件并无任何问题地进行构建。不需要 WDK。
构建 EDK-II 库后,您应该能够打开 SAMPLES.SLN 文件并构建示例,这将创建 UefiApplication.efi、UefiDriver.efi、Cryptest.efi 和 FtdiUsbSerialDxe.efi
## 文档
关于 EDK-II 的所有文档/帮助,请参阅 EDK-II/TianoCore。
## 测试
您可以在示例解决方案中按 F5(运行/调试),这将启动具有 512MB RAM 的 QEMU 实例,并将您的发布目录作为可通过 fs1 访问的虚拟文件系统:
然后,您可以尝试按如下方式加载驱动程序:
```
* load fs1:\UefiDriver.efi
```
您可以使用以下任一命令验证其是否存在:
```
* drivers (Should display "Sample Driver")
* devtree (Should show a few "Sample Device" entries)
```
您还可以启动示例应用程序,它应该能找到该驱动程序:
```
* fs1:\UefiApplication.efi
```
## 贡献者
请使用 GitHub 问题跟踪器提交任何错误/请求/等。
对于其他反馈,您可以在 Twitter 上通过 @aionescu 联系我
## 许可证
* 对于 "samples" 和 "edk-ii" 目录,适用以下许可证:
版权所有 (c) 2015-2017,Alex Ionescu。保留所有权利。
本程序及其附带材料根据随本分发版一起提供的 BSD 许可证的条款和条件获得许可并以此提供。
许可证全文可在以下地址找到:
http://opensource.org/licenses/bsd-license.php
* 对于 "debugger" 目录,适用以下许可证:
以下要点阐明了 QEMU 许可证:
1) QEMU 作为一个整体是根据 GNU 通用公共许可证版本 2 发布的。
2) QEMU 的某些部分具有与 GNU 通用公共许可证版本 2 兼容的特定许可证。因此,每个源文件都包含其自己的许可信息。没有许可信息的源文件是根据 GNU 通用公共许可证版本 2 或(根据您的选择)任何后续版本发布的。
截至 2013 年 7 月,仅接受以下文件或目录的 GNU 通用公共许可证版本 2(及非后续版本)的贡献:bsd-user/、linux-user/、hw/misc/vfio.c、hw/xen/xen_pt*。
3) 微型代码生成器 (TCG) 是根据 BSD 许可证发布的
(见文件中的许可头)。
4) QEMU 是 Fabrice Bellard 的商标。
Fabrice Bellard 和 QEMU 团队
* "edk2" 子模块有其自己的许可信息,请阅读它。
标签:Bootloader, EDK-II, OpenSSL, OVMF, QEMU, Secure Boot, SMM, TianoCore, UEFI, Visual Studio, Windows开发, 内联执行, 固件开发, 安全启动, 安全测试工具, 客户端加密, 开发环境, 引导程序, 系统底层, 网络安全监控, 虚拟化, 身份验证强制, 驱动开发