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

san0

Известный
Друг
411
267
кого опускает? кто он такой чтобы опускать? какое у него право?
Прямое право он имеет) https://en.wikipedia.org/wiki/As-if_rule https://en.cppreference.com/w/cpp/language/as_if
Как простой пример - https://godbolt.org/z/o9vsGr
memset растворился даже при минимальной оптимизации (-O(1))

Именно по этой причине в языке c++ существует такое большое количество неопределенных (иногда unspecified, или implementation-defined) поведений по типу порядка вычисления аргументов и множества других, а также есть ключевое слово volatile.

Плюс еще, для таких задач, как, например, эта с memset, есть специальные функции под платформы:
Win - SecureZeroMemory, BSD - explicit_bzero, Linux Kernel - memzero_explicit, OpenSSL - OPENSSL_cleanse и т.д.
Специальная версия функции в стандарте С11 memset_s - https://en.cppreference.com/w/c/string/byte/memset
И еще и флаги компиляторов по типу -fno-builtin-memset, или #pragma optimize("", off)
Ну и volatile

Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
Посмотрите еще этот ответ, вопрос был похожий - https://www.blast.hk/threads/781/page-294#post-439421
 

CleanLegend

Известный
Всефорумный модератор
476
929
Как проверить, запущен ли определенный процесс в диспетчере задач?
сканить все процессы через: Process32First и Process32Next.
если нужно именно работать с диспетчером, то инжектишь туда dll и уже хукаешь эти функции в нём.
 
  • Нравится
Реакции: Smeruxa

dekname

Участник
44
2
Действительно, делай static
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
допустим callback я сделал для команды, но теперь мне нужен обработчик всех команд (detour по адресу base + 0x65A70). Т.е:

C++:
CMDPROC CInput::GetCommandHandler(const char* pName) {
    return ((CMDPROC(__thiscall*)(CInput*, const char*))GetAddress(0x65A70))(this, pName);
}

Сделал я так (для регистрации команд):

C++:
std::memcpy(&m_thunk[12], "\x55\x89\xe5\xff\x75\x08\xb9????\xb8????\xff\xd0\xc9\xc3", 20);
*(uintptr_t*)&m_thunk[19] = (uintptr_t)this;
*(uintptr_t*)&m_thunk[24] = m_union_cmd_callback.addr_as_uint64;

m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_thunk[12]);
 

Artem90

Новичок
11
0
1.Ваш вопрос : Как можно после загрузки игры отключить raknet или сделать так чтоб не подключался к серверу необходимое количество времени
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,712
1.Ваш вопрос : Как можно после загрузки игры отключить raknet или сделать так чтоб не подключался к серверу необходимое количество времени
Можно попробовать хукнуть функцию отправки через сокет(sendto или send), и отклонять отправку, пока не прошло необходимое кол-во времени.
 

AdCKuY_DpO4uLa

Известный
287
477
После инициализации имгуи, вечно рисуется курсор (курсор винды)
C++:
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
(void)io;
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(pDevice);
пробовать отключать через
C++:
ImGui::GetIO().MouseDrawCursor = 0;
не помогло
 
Последнее редактирование:

Romelo

dev.
Проверенный
540
624
После инициализации имгуи, вечно рисуется курсор (курсор винды)
C++:
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
(void)io;
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(pDevice);
пробовать отключать через
C++:
ImGui::GetIO().MouseDrawCursor = 0;
не помогло
C++:
io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
 
  • Нравится
Реакции: sc6ut и AdCKuY_DpO4uLa

manukhov

Известный
126
128
Вот если в процессе два .dll модуля с одинаковым названием, как можно получить оба? По хэндлу все время только 1
 

AdCKuY_DpO4uLa

Известный
287
477
у меня есть структура PlayerPool для R1
C++:
struct stPlayerPool
{
    uint32_t                MaxPlayerID;//???? not tested
    uint16_t                sLocalPlayerID;
    void                    *pVTBL_txtHandler;
    union
    {
        char    szLocalPlayerName[16];
        char    *pszLocalPlayerName;
    };
    int                        iLocalPlayerNameLen;
    int                        iLocalPlayerNameAllocated;
    struct stLocalPlayer    *pLocalPlayer;
    int                        iLocalPlayerPing;
    int                        iLocalPlayerScore;
    struct stRemotePlayer    *pRemotePlayer[SAMP_MAX_PLAYERS];
    int                        iIsListed[SAMP_MAX_PLAYERS];
    uint32_t                ulUnk1[SAMP_MAX_PLAYERS];
}
можете дать такую же структуру, но для R3?
 

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Модератор
1,895
3,064
у меня есть структура PlayerPool для R1
C++:
struct stPlayerPool
{
    uint32_t                MaxPlayerID;//???? not tested
    uint16_t                sLocalPlayerID;
    void                    *pVTBL_txtHandler;
    union
    {
        char    szLocalPlayerName[16];
        char    *pszLocalPlayerName;
    };
    int                        iLocalPlayerNameLen;
    int                        iLocalPlayerNameAllocated;
    struct stLocalPlayer    *pLocalPlayer;
    int                        iLocalPlayerPing;
    int                        iLocalPlayerScore;
    struct stRemotePlayer    *pRemotePlayer[SAMP_MAX_PLAYERS];
    int                        iIsListed[SAMP_MAX_PLAYERS];
    uint32_t                ulUnk1[SAMP_MAX_PLAYERS];
}
можете дать такую же структуру, но для R3?
C++:
enum { MAX_PLAYERS = 1004 };

int          m_nLargestId;
CPlayerInfo* m_pObject[MAX_PLAYERS];
BOOL         m_bNotEmpty[MAX_PLAYERS];
BOOL         m_bPrevCollisionFlag[MAX_PLAYERS];

struct SAMPAPI_EXPORT {
        int m_nPing;
        int m_nScore;
        ID  m_nId;
        std::string   m_szName;
        CLocalPlayer* m_pObject;
} m_localInfo;
 
  • Нравится
Реакции: AdCKuY_DpO4uLa

kin4stat

mq-team
Всефорумный модератор
2,730
4,712
C++:
enum { MAX_PLAYERS = 1004 };

int          m_nLargestId;
CPlayerInfo* m_pObject[MAX_PLAYERS];
BOOL         m_bNotEmpty[MAX_PLAYERS];
BOOL         m_bPrevCollisionFlag[MAX_PLAYERS];

struct SAMPAPI_EXPORT {
        int m_nPing;
        int m_nScore;
        ID  m_nId;
        std::string   m_szName;
        CLocalPlayer* m_pObject;
} m_localInfo;
C++:
struct SAMPAPI_EXPORT {
        int m_nPing;
        int m_nScore;
        ID  m_nId;
#ifndef _DEBUG
    private:
        int __alignment;
    public:
#endif
        std::string   m_szName;
        CLocalPlayer* m_pObject;
} m_localInfo;
 
  • Вау
Реакции: tinkoir

LuaQ

Участник
84
27
Вот если в процессе два .dll модуля с одинаковым названием, как можно получить оба? По хэндлу все время только 1
Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.
C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

int main()
{
    DWORD processId;
    std::cin >> processId;
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);
    if (hModuleSnap == INVALID_HANDLE_VALUE) {
        return 0;
    }

    MODULEENTRY32 me32;
    me32.dwSize = sizeof(me32);
    if (Module32First(hModuleSnap, &me32)) {
        std::cout << "  modules:" << std::endl;
                do {
                    printf("%x %ws\n", (DWORD)me32.hModule, me32.szModule);
                } while (Module32Next(hModuleSnap, &me32));
            }

    CloseHandle(hModuleSnap);
    return 0;
}
 
Последнее редактирование:

manukhov

Известный
126
128
Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.
C++:
int main()
{
    DWORD processId;
    std::cin >> processId;
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);
    if (hModuleSnap == INVALID_HANDLE_VALUE) {
        return 0;
    }

    MODULEENTRY32 me32;
    me32.dwSize = sizeof(me32);
    if (Module32First(hModuleSnap, &me32)) {
        std::cout << "  modules:" << std::endl;
                do {
                    std::wcout << me32.szModule << std::endl;
                    printf("%x\n", me32.modBaseSize);
                } while (Module32Next(hModuleSnap, &me32));
            }

    CloseHandle(hModuleSnap);
    return 0;
}
Пробовал, только один выдает. EnumProcessModules тоже пробовал