Другое С/С++ Вопрос - Ответ

loganhackerdff

Известный
868
519
Как зарегистрировать windproc handler без SF api
 
Последнее редактирование:
D

Deleted member 240777

Гость
пытаюсь написать фпс анлок который выключается при включение лимита в настройках.
код:
#include <Windows.h>
#include <process.h>
#include <stdint.h>

enum SA_Mem
{
    settingsFPSLimit = 0xBA6794,
    FPSLimit = 0x9D9D0
};

void WriteMemory(void* address, void* bytes, int byteSize)
{
    DWORD NewProtection;
    VirtualProtect(address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection);
    memcpy(address, bytes, byteSize);
    VirtualProtect(address, byteSize, NewProtection, &NewProtection);
}

void __cdecl MainThread(void* pArg)
{
    DWORD dwSamp = DWORD(GetModuleHandleA("samp.dll"));
    uint8_t* old = 0;
    unsigned char settingsFPSLimitStatus = 0, oldSettingsFPSLimitStatus = 120;
    if (dwSamp)
    {
        old = reinterpret_cast<uint8_t*>(dwSamp + SA_Mem::FPSLimit);
        while (true)
        {
            Sleep(500);
            settingsFPSLimitStatus = *reinterpret_cast<unsigned char*>(SA_Mem::settingsFPSLimit);
            if (settingsFPSLimitStatus != oldSettingsFPSLimitStatus)
            {
                if(settingsFPSLimitStatus == 1)
                    WriteMemory((void*)(dwSamp + SA_Mem::FPSLimit), old, 4);
                else
                    WriteMemory((void*)(dwSamp + SA_Mem::FPSLimit), (uint8_t*)"0x5051FF15", 4);
                oldSettingsFPSLimitStatus = settingsFPSLimitStatus;
            }
        }
    }
}

BOOL WINAPI DllMain(_In_ HINSTANCE hinstDLL, _In_ DWORD fdwReason, _In_ PVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH) _beginthread(MainThread, NULL, nullptr);
    return TRUE;
}
если захожу с включенным лимитом, то анлока нет и могу использовать /fpslimit (если выключаю лимит в настройках, то все как во втором случае).
если захожу с выключенным лимитом, то анлок есть. включая лимит в настройках, фпс анлок остаётся (проверял через чит енжин), соотвественном управление /fpslimit не работает. не могу понять в чем проблема.
 
D

Deleted member 240777

Гость
как работать с ини файлами в сф? есть встроенные функции или самому перезаписывать?
 

Dark_Knight

Me, me and me.
Друг
4,078
2,096
В СФ нет никаких встроенных функций для работы с ини. Можно юзать винапи(а он не удобен) или же поискать для себя удобную либу для работы с ини. В нете их навалом. Ищи так "C++ ini wrapper"
Соберите из этого чит в Visual Studio https://yadi.sk/d/FX-O72F-J98EjQ
Это не стол заказов. Тебе в другой раздел под названием "Работа и услуги"
 
  • Нравится
Реакции: Deleted member 240777

Receiver

leet-cheats 👑
Проверенный
620
889
ауе, почему при возврате оригинального wndproc крашит игру?)
C++:
if (reason == DLL_PROCESS_DETACH) {
    SetWindowLongA(gl.gameWindow, GWL_WNDPROC, reinterpret_cast<long>(gl.originalWndProc));
}
вызывается в DllMain
 

#Rin

Известный
Всефорумный модератор
1,214
1,043
ауе, почему при возврате оригинального wndproc крашит игру?)
C++:
if (reason == DLL_PROCESS_DETACH) {
    SetWindowLongA(gl.gameWindow, GWL_WNDPROC, reinterpret_cast<long>(gl.originalWndProc));
}
вызывается в DllMain
Любой плагин может установить до и после тебя свой WndProc.
Выгружая свой плагин, адрес на твой WndProc, который другие плагины считают за "оригинальный" становится невалидным, из-за чего они вызывают функцию которой уже нету в памяти. Вернув таким образом якобы "оригинальный" WndProc который тебе известен, ты ломаешь цепочку обработчиков.
Избежать этого можно оставив в памяти функцию пустышку для продолжения цепочки вызовов.
 
  • Нравится
Реакции: Receiver

Dark_Knight

Me, me and me.
Друг
4,078
2,096
Как? Молча. Найти из-за чего крашит при выходе и пофиксить это. Если ты думаешь, что у тебя нормальный код, то задай себе вопрос. Какого хера он крашит.
 

Receiver

leet-cheats 👑
Проверенный
620
889
Как? Молча. Найти из-за чего крашит при выходе и пофиксить это. Если ты думаешь, что у тебя нормальный код, то задай себе вопрос. Какого хера он крашит.
Не при выходе крашит. Пытаюсь отгрузить через FreeLibraryAndExitThread – краш. Перед вызовом, я конечно же отгружаю всё что использую.