DirectInput的CreateEffect()会导致特定硬件/软件组合出现异常0xC00000FD

时间:2019-04-05 10:03:15

标签: c++ debugging exception directinput

我为游戏制作了一个插件,以增加对该游戏的替代输入设备(例如方向盘)的支持。

我的一些用户在尝试为我的插件设置轮子时遇到了异常。仅当存在另一个插件时,这些特定的轮子 才会发生。引发的异常为0xC00000FD,并在调用CreateEffect时发生。

由于无法访问麻烦的硬件,我很难重现此错误。具体来说,这似乎只发生在 Logitech G920方向盘上,并且仅当正常启动游戏并且ScriptHookVDotNet插件也处于活动状态时才发生。自从报告发布以来,我仅设法添加了更多日志记录,这使我进入了异常代码和引起异常的函数。

可以通过不使用插件,不使用特定方向盘或通过第三方启动器(RagePluginHook)启动游戏来解决此问题。

作为概念验证,我在一个单独的Windows控制台应用程序(用于配置输入)中重复使用了有问题的代码,而不会发生此问题。

我的code is hosted on GitHub,这是引起问题的特定行:

    // These are class members
    LPDIRECTINPUTEFFECT m_cfEffect = nullptr;
    DICONSTANTFORCE m_constantForceParams;

    // LPDIRECTINPUTDEVICE8 diDevice has been retrieved elsewhere

    DIEFFECT cfEffect;
    createConstantForceEffect(DIJOFS_X, 1, cfEffect);
    HRESULT hr = diDevice->CreateEffect(GUID_ConstantForce, &cfEffect, &m_cfEffect, nullptr); // This causes the exception

createConstantForceEffect已在Microsoft示例后生成:

void WheelDirectInput::createConstantForceEffect(DWORD axis, int numAxes, DIEFFECT &diEffect) {
    DWORD rgdwAxes[1] = { axis };
    LONG rglDirection[1] = { 0 };
    m_constantForceParams.lMagnitude = 0;

    ZeroMemory(&diEffect, sizeof(diEffect));
    diEffect.dwSize = sizeof(DIEFFECT);
    diEffect.rgdwAxes = rgdwAxes;
    diEffect.rglDirection = rglDirection;
    diEffect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
    diEffect.dwDuration = INFINITE;
    diEffect.dwSamplePeriod = 0;
    diEffect.dwGain = DI_FFNOMINALMAX;
    diEffect.dwTriggerButton = DIEB_NOTRIGGER;
    diEffect.dwTriggerRepeatInterval = 0;

    diEffect.cAxes = numAxes;
    diEffect.lpEnvelope = nullptr;
    diEffect.cbTypeSpecificParams = diEffect.cAxes * sizeof(DICONSTANTFORCE);
    diEffect.lpvTypeSpecificParams = &m_constantForceParams;
    diEffect.dwStartDelay = 0;
}

我只想知道为什么在此特定情况下会导致此错误,以及我能做些什么来提取更多错误,而不仅仅是捕获异常。

异常0xC00000FD似乎指向堆栈溢出错误,但我不知道是什么原因导致该错误。我没有递归,实际上我的代码对于所有其他硬件/软件组合都可以正常运行。

0 个答案:

没有答案