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开发, 内联执行, 固件开发, 安全启动, 安全测试工具, 客户端加密, 开发环境, 引导程序, 系统底层, 网络安全监控, 虚拟化, 身份验证强制, 驱动开发