如何解决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 举报,一经查实,本站将立刻删除。