Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UEFI-EDK2-挂接SetVariable会导致未接受的内核模式陷阱_C_Windows_Hook_Uefi_Blue Screen Of Death - Fatal编程技术网

C UEFI-EDK2-挂接SetVariable会导致未接受的内核模式陷阱

C UEFI-EDK2-挂接SetVariable会导致未接受的内核模式陷阱,c,windows,hook,uefi,blue-screen-of-death,C,Windows,Hook,Uefi,Blue Screen Of Death,我正在为Windows编写一个UEFI运行时驱动程序,它钩住了gRT->SetVariable(…) 挂接似乎很好,但每当我启动一个用户模式应用程序并调用SetFirmwareEnvironmentVariable(…)时,它就会出现在一个蓝屏上,显示uncepted\u KERNEL\u mode\u TRAP 我找不到任何解决办法。我知道以下几点: 我在提高第三方物流 我重新计算并设置CRC32 在SetVirtualAddressMap(…)上,我转换所有指针 谷歌对此毫无帮助。所以我

我正在为Windows编写一个UEFI运行时驱动程序,它钩住了
gRT->SetVariable(…)

挂接似乎很好,但每当我启动一个用户模式应用程序并调用
SetFirmwareEnvironmentVariable(…)
时,它就会出现在一个蓝屏上,显示
uncepted\u KERNEL\u mode\u TRAP

我找不到任何解决办法。我知道以下几点:

  • 我在提高第三方物流
  • 我重新计算并设置CRC32
  • SetVirtualAddressMap(…)
    上,我转换所有指针
谷歌对此毫无帮助。所以我真的很想知道是什么原因导致了这个蓝屏,以及我将如何着手解决这个问题

我错过了什么?我做错什么了吗

这是我的密码:

ExchangePointerInServiceTable((VOID**)&gST->RuntimeServices->SetVariable,
        (VOID*)HookedSetVariable,
        (VOID**)&gOriginalSetVariable);
编辑:在UEFI中,其他UEFI应用程序正确调用hooked
SetVariable(…)
,而没有任何进一步的问题。
这可能会导致问题仅在从操作系统创建VirtualAddressSpace后才存在。

错误消息是否指示发生了什么故障,以及发生在什么地址?它是在钩子函数中,还是在调用它之前,还是在它返回之后?您确定您的UEFI运行时驱动程序仍然在同一虚拟地址加载并可访问吗?CopyMem不是在启动服务中,不是在运行时服务中吗?在任何情况下,对CopyMem的调用都是不必要的;源和目标相同。gStrComVarName存储在哪里?在调用钩子函数时,它是否仍然可以访问?如果尚未访问,我建议您在使用Windows程序尝试之前,先使用UEFI程序进行测试,以便一次只关注一组问题。错误消息是否指示发生了什么故障,以及发生在什么地址?它是在钩子函数中,还是在调用它之前,还是在它返回之后?您确定您的UEFI运行时驱动程序仍然在同一虚拟地址加载并可访问吗?CopyMem不是在启动服务中,不是在运行时服务中吗?在任何情况下,对CopyMem的调用都是不必要的;源和目标相同。gStrComVarName存储在哪里?在调用钩子函数时,它仍然可以访问吗?如果您还没有,我建议您先用UEFI程序进行测试,然后再用Windows程序进行尝试,一次只关注一组问题。
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);
}