DirectEput CreateEffect () вызывает исключение 0xC00000FD с определенными комбинациями аппаратного и программного обеспечения - PullRequest
0 голосов
/ 05 апреля 2019

Я сделал плагин для игры, чтобы добавить поддержку альтернативных устройств ввода для этой игры, таких как рулевые колеса.

Некоторые из моих пользователей получают исключение, когда они пытаются настроитьих колеса для моего плагина.Это происходит только для тех конкретных колес и , когда присутствует другой плагин.Исключением является 0xC00000FD, которое возникает при вызове CreateEffect.

Мне было трудно воспроизвести эту ошибку, поскольку у меня нет доступа к проблемному оборудованию.В частности, это происходит только с рулевым колесом Logitech G920 и только при нормальном запуске игры, когда плагин ScriptHookVDotNet также активен.С тех пор, как пришли отчеты, мне удалось только добавить больше журналирования, что привело меня к коду исключения и функции, которая его вызывает.

Проблема может быть обойдена, либо не используя плагин, не используяэтот конкретный руль, или запустив игру через стороннюю программу запуска (RagePluginHook).

В качестве подтверждения концепции я повторно использовал код ошибки в отдельном консольном приложении Windows (длянастройте входы), где эта проблема не возникает.

Мой код размещен на 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, похоже, указывает на ошибку переполнения стека, но я не знаю, что может вызвать эту ошибку.На моей стороне нет рекурсии, и мой код отлично работает практически для всех других комбинаций аппаратного и программного обеспечения.

...