【问题标题】:IDXGISwapChain ResizeBuffers return 0 on new devices for no reasonIDXGISwapChain ResizeBuffers 在新设备上无缘无故返回 0
【发布时间】:2022-01-10 00:09:48
【问题描述】:

您好,我正在开发一款名为 Rising Kingdoms 的旧游戏的模组,它可以让我调整大小,提高游戏的分辨率。

问题是 fnResize 函数在“某些”新设备 (W11 W10 20xx) 上不起作用

它总是无缘无故地返回 0。

主要功能:

    HMODULE dxgi = GetModuleHandleA("dxgi.dll");
    static BYTE ResizeSig[] = { 0x48, 0x81, 0xec, 0xc0, 0x00, 0x00, 0x00, 0x48, 0xc7, 0x45, 0x1f };
    sizeof(ResizeHead));
    fnResize = reinterpret_cast<decltype(fnResize)>(Tools::FindFn(dxgi, ResizeSig, sizeof(ResizeSig)));
    Logger::Log("IDXGISwapChain::ResizeBuffers: %p\n", fnResize);
    if (!fnResize)
    {
        Logger::Log("Resize Broke\n");
        return false;
    };
inline BYTE* Mod::Tools::FindFn(HMODULE mod, BYTE* sig, SIZE_T sigSize)
{
    if (!mod || !sig || !sigSize) return 0;
    MODULEINFO modInfo;
    if (!K32GetModuleInformation(GetCurrentProcess(), mod, &modInfo, sizeof(MODULEINFO))) return 0;
    auto base = static_cast<BYTE*>(modInfo.lpBaseOfDll);
    auto fn = Tools::FindSignature(base, base + modInfo.SizeOfImage - 1, sig, sigSize);
    if (!fn) return 0;
    for (; *fn != 0xCC && *fn != 0xC3; fn--);
    fn++;
    return fn;
}
inline BYTE* Mod::Tools::FindSignature(BYTE* start, BYTE* end, BYTE* sig, SIZE_T size)
{
    for (BYTE* it = start; it < end - size; it++) {
        if (CompareByteArray(it, sig, size)) {
            return it;
        };
    }
    return 0;
}

Windows 10 19042:

Windows 11:

【问题讨论】:

  • 这里只是路过评论,但不是S_OK == 0,这意味着它在Win11上成功,在Win10上失败?
  • 你已经问过这个问题并在没有回答 cmets 的情况下将其删除:stackoverflow.com/questions/70613818/…

标签: c++ directx directx-11 dxgi


【解决方案1】:

您尝试在 DXGI.DLL 中查找 ResizeBuffers 函数的方式并不可靠,因此当 Windows 11 版本的 DXGI.DLL 发生变化时,它会中断。

使用GetProcAddress有什么问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2012-04-16
    相关资源
    最近更新 更多