Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Как пофиксить Schema::init

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Ноя 2022
Сообщения
141
Реакции
3
Код:
Expand Collapse Copy
bool Schema::init(const char* ModuleName, int module_type)
{

    schema_system = I::Get<ISchemaSystem>("schemasystem.dll", "SchemaSystem_00");
    if (!schema_system)
        return false;

    CSchemaSystemTypeScope* pTypeScope = schema_system->FindTypeScopeForModule(ModuleName);
    if (pTypeScope == nullptr)
        return false;

    const int nTableSize = pTypeScope->hashClasses.Count();

    UtlTSHashHandle_t* pElements = new UtlTSHashHandle_t[nTableSize + 1U];
    const auto nElements = pTypeScope->hashClasses.GetElements(0, nTableSize, pElements);

    for (int i = 0; i < nElements; i++)
    {
        const UtlTSHashHandle_t hElement = pElements[i];

        if (hElement == 0)
            continue;

        CSchemaClassBinding* pClassBinding = pTypeScope->hashClasses[hElement];
        if (pClassBinding == nullptr)
            continue;

        SchemaClassInfoData_t* pDeclaredClassInfo;
        pTypeScope->FindDeclaredClass(&pDeclaredClassInfo, pClassBinding->szBinaryName);

        if (pDeclaredClassInfo == nullptr)
            continue;

        if (pDeclaredClassInfo->nFieldSize == 0)
            continue;

        for (auto j = 0; j < pDeclaredClassInfo->nFieldSize; j++)
        {
            SchemaClassFieldData_t* pFields = pDeclaredClassInfo->pFields;
            std::string szFieldClassBuffer = std::string(pDeclaredClassInfo->szName) + "->" + std::string(pFields[j].szName);
            
            dumped_data.emplace_back(hash_32_fnv1a_const(szFieldClassBuffer.c_str()), pFields[j].nSingleInheritanceOffset);
        }

        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        printf("[Schema] ");

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("Dumped Class: %s fields: %i \n", pDeclaredClassInfo->szName, pDeclaredClassInfo->nFieldSize);
    }

    delete[] pElements;

    return true;
}
Код:
Expand Collapse Copy
int GetElements(int nFirstElement, int nCount, UtlTSHashHandle_t* pHandles) const {
    int nIndex = 0;
    for (int nBucketIndex = 0; nBucketIndex < nBucketCount; nBucketIndex++) {
        const HashBucket_t& hashBucket = aBuckets[nBucketIndex];

        HashFixedData_t* pElement = hashBucket.pFirstUncommited;
        for (; pElement; pElement = pElement->pNext) {
            if (--nFirstElement >= 0)
                continue;

            pHandles[nIndex++] = reinterpret_cast<UtlTSHashHandle_t>(pElement);

            if (nIndex >= nCount)
                return nIndex;
        }
    }

    return nIndex;
}
как пофиксить краш get elements
заранее спасибо
 
Проблема скорее всего в том что ты используешь Count() для определения размера массива но Count() может не означать фактическое количество валидных элементов Если GetElements возвращает больше чем ты выделил произойдёт выход за границы массива Либо выделяй больше памяти например 4096 либо используй std::vector либо проверяй возвращаемое значение GetElements перед использованием Также убедись что проверка hElement == 0 корректна если это указатель используй nullptr. :)))


и ещё скажи у тебя есть сигнатура swapchain? та что в (https://yougame.biz/threads/361221/) не работает

Код:
Expand Collapse Copy
    SwapChain = **reinterpret_cast<ISwapChainDx11***>(MEM::ResolveRelativeAddress(MEM::FindPattern(RENDERSYSTEM_DLL, CXOR("48 89 2D???? 48 C7 05"), 0x4, 0x8));
    bSuccess &= (SwapChain!= nullptr);

    if (SwapChain!= nullptr)
    {
        if (FAILED(SwapChain->pDXGISwapChain->GetDevice(__uuidof(ID3D11Device), (void**)&Device))
        {
            printf(CXOR("failed to get device from swapchain\n"));

            CS_ASSERT(false);

            return false;
        }
        else
            Device->GetImmediateContext(&DeviceContext);
    }
1762015547183.png
 
спасибо
ша дам паттерн
у меня нет вроде на это паттерна у меня вот такой код
Код:
Expand Collapse Copy
inline IDXGISwapChain* CreateDummySwapChain()
{
    DXGI_SWAP_CHAIN_DESC sd = {};
    sd.BufferCount = 1;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.Width = 1;
    sd.BufferDesc.Height = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = GetForegroundWindow();
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    sd.Flags = 0;

    ID3D11Device* device = nullptr;
    ID3D11DeviceContext* context = nullptr;
    IDXGISwapChain* swapChain = nullptr;

    HRESULT hr = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd, &swapChain, &device, nullptr, &context);

    if (FAILED(hr))
    {
        return nullptr;
    }

    if (device) device->Release();
    if (context) context->Release();

    return swapChain;
}
void c_directx::initialize( ) {
    m_swap_chain = CreateDummySwapChain();
    if (!m_swap_chain)
        return;

    m_present_address = vmt::get_v_method( m_swap_chain, 8 );
}
 
Последнее редактирование:
спасибо
ша дам паттерн
у меня нет вроде на это паттерна у меня вот такой код
Код:
Expand Collapse Copy
inline IDXGISwapChain* CreateDummySwapChain()
{
    DXGI_SWAP_CHAIN_DESC sd = {};
    sd.BufferCount = 1;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.Width = 1;
    sd.BufferDesc.Height = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = GetForegroundWindow();
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    sd.Flags = 0;

    ID3D11Device* device = nullptr;
    ID3D11DeviceContext* context = nullptr;
    IDXGISwapChain* swapChain = nullptr;

    HRESULT hr = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd, &swapChain, &device, nullptr, &context);

    if (FAILED(hr))
    {
        return nullptr;
    }

    if (device) device->Release();
    if (context) context->Release();

    return swapChain;
}
void c_directx::initialize( ) {
    m_swap_chain = CreateDummySwapChain();
    if (!m_swap_chain)
        return;

    m_present_address = vmt::get_v_method( m_swap_chain, 8 );
}
в чем ваш разлад?
 
Код:
Expand Collapse Copy
bool Schema::init(const char* ModuleName, int module_type)
{

    schema_system = I::Get<ISchemaSystem>("schemasystem.dll", "SchemaSystem_00");
    if (!schema_system)
        return false;

    CSchemaSystemTypeScope* pTypeScope = schema_system->FindTypeScopeForModule(ModuleName);
    if (pTypeScope == nullptr)
        return false;

    const int nTableSize = pTypeScope->hashClasses.Count();

    UtlTSHashHandle_t* pElements = new UtlTSHashHandle_t[nTableSize + 1U];
    const auto nElements = pTypeScope->hashClasses.GetElements(0, nTableSize, pElements);

    for (int i = 0; i < nElements; i++)
    {
        const UtlTSHashHandle_t hElement = pElements[i];

        if (hElement == 0)
            continue;

        CSchemaClassBinding* pClassBinding = pTypeScope->hashClasses[hElement];
        if (pClassBinding == nullptr)
            continue;

        SchemaClassInfoData_t* pDeclaredClassInfo;
        pTypeScope->FindDeclaredClass(&pDeclaredClassInfo, pClassBinding->szBinaryName);

        if (pDeclaredClassInfo == nullptr)
            continue;

        if (pDeclaredClassInfo->nFieldSize == 0)
            continue;

        for (auto j = 0; j < pDeclaredClassInfo->nFieldSize; j++)
        {
            SchemaClassFieldData_t* pFields = pDeclaredClassInfo->pFields;
            std::string szFieldClassBuffer = std::string(pDeclaredClassInfo->szName) + "->" + std::string(pFields[j].szName);
          
            dumped_data.emplace_back(hash_32_fnv1a_const(szFieldClassBuffer.c_str()), pFields[j].nSingleInheritanceOffset);
        }

        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
        printf("[Schema] ");

        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        printf("Dumped Class: %s fields: %i \n", pDeclaredClassInfo->szName, pDeclaredClassInfo->nFieldSize);
    }

    delete[] pElements;

    return true;
}
Код:
Expand Collapse Copy
int GetElements(int nFirstElement, int nCount, UtlTSHashHandle_t* pHandles) const {
    int nIndex = 0;
    for (int nBucketIndex = 0; nBucketIndex < nBucketCount; nBucketIndex++) {
        const HashBucket_t& hashBucket = aBuckets[nBucketIndex];

        HashFixedData_t* pElement = hashBucket.pFirstUncommited;
        for (; pElement; pElement = pElement->pNext) {
            if (--nFirstElement >= 0)
                continue;

            pHandles[nIndex++] = reinterpret_cast<UtlTSHashHandle_t>(pElement);

            if (nIndex >= nCount)
                return nIndex;
        }
    }

    return nIndex;
}
как пофиксить краш get elements
заранее спасибо


utlhash.h:
Expand Collapse Copy
struct HashBucket_t {
private:
    MEM_PAD(0x08);

public:
    HashFixedData_t* pFirst;
    HashFixedData_t* pFirstUncommited;
};
 
Назад
Сверху Снизу