ATI(DirectX) - и ну них кривые руки:) + Microsoft помагает ...

Тема в разделе "WASM.RESEARCH", создана пользователем shchetinin, 25 окт 2011.

  1. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Вообще не сколько дней отлаживаю хакнутое приложения, в нем хакнут DirectX(Что за приложение секрет, хакал не я так что я как всегда белый и пушистый)

    DirectX10
    (Я ЕГо не знаю , мы его пришлость отлажиывать)

    Вообщем контекст следующий
    for (Slot = 0; Slot < CountSlots ; ++Slot ) { // CountSlots должно быть шесть но по факту 4.
    PSSetShaderResources( Slot, 1, &m_pShaderResourceView );
    }

    Установка шейдера
    GetDevice()->PSSetShader( m_pPixelShader );


    GetDevice()->Draw(4, 0);

    Забегая вперед получаем варнинги :

    D3D10: INFO: ID3D10Device::lol: raw: The Pixel Shader unit expects a Shader Resource View at Slot 4, but none is bound. This is OK, as reads of an unbound Shader Resource View are defined to return 0. It is also possible the developer knows the data will not be used anyway. This is only a problem if the developer actually intended to bind a Shader Resource View here. [ EXECUTION INFO #353: DEVICE_DRAW_SHADERRESOURCEVIEW_NOT_SET ]

    D3D10: INFO: ID3D10Device::lol: raw: The Pixel Shader unit expects a Shader Resource View at Slot 5, but none is bound. This is OK, as reads of an unbound Shader Resource View are defined to return 0. It is also possible the developer knows the data will not be used anyway. This is only a problem if the developer actually intended to bind a Shader Resource View here. [ EXECUTION INFO #353: DEVICE_DRAW_SHADERRESOURCEVIEW_NOT_SET ]

    (Это не два ресурса которые и не установлены, то и есть равны нулю, но при draw они не будут использоватся)

    Стект исключения (Которого быть не должно):
    atiumd64.dll!d3dPropagateProtection() + 0x4e bytes
    atiumd64.dll!d3dPrimDraw() + 0x2ca bytes
    atiumd64.dll!d3dlhDrawPrimitive() + 0x26d bytes
    d3d10level9.dll!LDDMUMDevice::UnderlyingDraw() + 0x2a bytes
    d3d10level9.dll!UMDevice::lol: raw_Default() + 0x5f bytes
    D3D10SDKLayers.DLL!NDebug::CDevice::lol: raw() + 0xcd bytes
    d3d10_1core.dll!NMultithread::CDevice::lol: raw() + 0x4e bytes


    Причина
    73 09 jae d3dPropagateProtection+54h (7FEF61E70D4h)
    48 8B 02 mov rax,qword ptr [rdx]
    F6 40 34 04 test byte ptr [rax+34h],4 Access violation without check rax(is zero)
    75 0E jne d3dPropagateProtection+62h (7FEF61E70E2h)

    Вызов функции (d3dPropagateProtection) только валидируется ресурсы и не как на них не влияет .

    После
    mov rax,qword ptr [rdx]
    должен быть
    test eax, eax, но его нет((

    Теперь место где еще работают с этим указателем

    > atiumd64.dll!d3dTexGetCubeFaceNum()
    atiumd64.dll!d3dTexSamplerStateTexMap()
    atiumd64.dll!d3dlhSetTexture()

    000007FEF61F8521 48 8B 42 08 mov rax,qword ptr [rdx+8]
    000007FEF61F8525 48 85 C0 test rax,rax
    000007FEF61F8528 74 27 je

    Значит тут мы ой проверяем , а там сука нет.

    На NVIDIA все гуд.

    Так что фикс простой

    // Делаем установку всех 6 указателей как первый
    for (Slot = 0; Slot < 6 ; ++Slot ) {
    PSSetShaderResources( Slot, 1, &m_pShaderResourceView[0] );
    }

    //Реальная установка.
    for (Slot = 0; Slot < CountSlots ; ++Slot ) {
    PSSetShaderResources( Slot, 1, &m_pShaderResourceView[Slot] );
    }



    Отстаются пару вопроса:

    - Где понять почему надо ставить 6 а не четыре ShaderResourceView ?
    - Почему в ATI пишут гавно кодесы.
    - У кого то что подобное было?

    А и да atiumd64.dll - User Mode display driver
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Чуть не забыл чем помогает майкрософт:
    GetDevice()->Draw(4, 0); внутри происходит зават критеческой секции (устройство много поточное), а вот освобождения нет из за исключения. Правильно было бы поставить SEH(Ну или конструктор с деструктором).