微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UEFI-EDK2-将SetVariable结果挂钩在UNEXCEPTED_KERNEL_MODE_TRAP中

如何解决UEFI-EDK2-将SetVariable结果挂钩在UNEXCEPTED_KERNEL_MODE_TRAP中

我正在为Windows编写UEFI运行时驱动程序,该驱动程序钩住gRT->Setvariable(...)

挂钩似乎可以正常工作,但是每当我启动一个用户模式应用程序并调用SetFirmwareEnvironmentvariable(...)时,它就会在蓝屏中显示UNEXCEPTED_KERNEL_MODE_TRAP

我找不到任何解决方案。我知道以下几件事:

  • 我正在提高TPL
  • 我重新计算并设置了CRC32
  • SetVirtualAddressMap(...)上,我转换了所有指针

Google根本没有帮助。因此,我真的很想知道是什么原因导致了该蓝屏,以及如何解决该问题。

我想念什么?我做错什么了吗?

这是我的代码

ExchangePointerInServiceTable((VOID**)&gST->RuntimeServices->Setvariable,(VOID*)HookedSetvariable,(VOID**)&gOriginalSetvariable);
static
EFI_STATUS
ExchangePointerInServiceTable(
    IN OUT VOID** AddresstoUpdate,IN VOID* NewPointer,OUT VOID** OriginalPointer OPTIONAL
)
{
    EFI_STATUS status;
    EFI_TPL tpl;

    ASSERT(*AddresstoUpdate != NewPointer);

    tpl = gBS->RaiseTPL(TPL_HIGH_LEVEL);

    if (OriginalPointer != NULL)
    {
        *OriginalPointer = *AddresstoUpdate;
    }
    *AddresstoUpdate = NewPointer;

    gST->Hdr.CRC32 = 0;
    status = gBS->CalculateCrc32(&gST->Hdr,gST->Hdr.HeaderSize,&gST->Hdr.CRC32);
    ASSERT_EFI_ERROR(status);

    gBS->RestoreTPL(tpl);
    return status;
}
EFI_STATUS
EFIAPI
HookedSetvariable(
    IN CHAR16* VariableName,IN EFI_GUID* vendorGuid,IN UINT32 Attributes,IN UINTN DataSize,IN VOID* Data
) {
    if (StrCmp(VariableName,gStrComVarName) == 0) {
        COMMUNICATION_PROTOCOL * comVarPtr = (COMMUNICATION_PROTOCOL*)Data;
        switch (comVarPtr->i8OperationId) {
        case COMMUNICATION_PROTOCOL_OPERATION_PING:
            comVarPtr->i8OperationId = COMMUNICATION_PROTOCOL_PONG;
        }
        copyMem(Data,comVarPtr,DataSize);
    }
    
    return gOriginalSetvariable(VariableName,vendorGuid,Attributes,DataSize,Data);
}

编辑:在UEFI中,其他UEFI应用程序可以正确调用挂钩的Setvariable(...),而不会产生任何其他问题。 这可能导致只有在从操作系统创建VirtualAddressspace之后才存在的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。