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

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,748
4,849
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

Известный
125
131
Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.
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 тоже пробовал
 

sc6ut

неизвестный
Модератор
383
1,092
когда делаю http запрос в длл библиотеке, то он остается в строках процесса. есть ли возможность как-либо скрыть его?
 

sc6ut

неизвестный
Модератор
383
1,092
Вроде хук
C++:
void CALLBACK WndProc_hooked(HWND &hwnd, UINT &Message, WPARAM &wparam, LPARAM &lparam) {
    switch (Message) {
    case WM_KEYUP:
        if (wparam == '9') {
            // ...
        }
        break;
    default:
        break;
    }
}

static hook wndproc(reinterpret_cast<LRESULT(CALLBACK*)(HWND,UINT,WPARAM,LPARAM)>(0x747EB0), WndProc_hooked);
я не знаю, конечно, какой хукер ты юзаешь, но в хукнутой функции у тебя почему-то стоят референсы вместо просто параметров, вместо LRESULT - void, и нет вызова оригинальной функции, поэтому игра ломается. вот тебе пример рабочего хука с помощью MinHook:
C++:
#include <Windows.h>
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v120-mt.lib") // либу выбираешь под версию тулсета и рантайм либу

WNDPROC origWndProc = nullptr; // создаём прототип для сохранения оригинального вндпрока

LRESULT __stdcall HOOKED_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    // твой код
    return origWndProc(hWnd, uMsg, wParam, lParam); // вызываем оригинальный вндпрок чтобы не сломать игру
}

// иницилиазируем минхук (1 раз)
MH_Initialize();
// создаем и включаем хук
MH_CreateHook(reinterpret_cast<LPVOID>(0x747EB0), &HOOKED_WndProc, reinterpret_cast<LPVOID*>(&origWndProc));
MH_EnableHook(reinterpret_cast<LPVOID>(0x747EB0));
 
  • Нравится
Реакции: etereon и Ya Zaregalsya

imring

Ride the Lightning
Всефорумный модератор
2,366
2,557
но в хукнутой функции у тебя почему-то стоят референсы вместо просто параметров, вместо LRESULT - void, и нет вызова оригинальной функции, поэтому игра ломается
вот хук, который использовался - https://github.com/allwanttokissme/Yet-another-hook-library. если тип возвращаемого значения void, то будет вызываться оригинальная функция (https://github.com/allwanttokissme/Yet-another-hook-library/blob/master/hook.h#L327, https://github.com/allwanttokissme/Yet-another-hook-library/blob/master/hook.h#L342)
 
  • Нравится
Реакции: sc6ut

Sana_Minotazaki

Известный
75
2
1 - Как исправить это в Visual Studio 2019?
C:\Новая папка\SFPlugin\SFPlugin\SFPlugin.vcxproj : warning : Невозможно найти средства сборки для Visual Studio 2012 - Windows XP (v110_xp). Установите Visual Studio 2012 - Windows XP (v110_xp), чтобы выполнить сборку с использованием средств сборки Visual Studio 2012 - Windows XP (v110_xp).
2 - Как я могу отправить сообщение в чат не используя SF Api?
 

sc6ut

неизвестный
Модератор
383
1,092
Как исправить это в Visual Studio 2019?
в настройках проекта выбери установленый тулсет и винсдк
2 - Как я могу отправить сообщение в чат не используя SF Api?
перед использованием проверь загруженость сампа
C++:
void add_chat_message(DWORD dwColor, LPCSTR szString, ...)
{
    va_list ap;

    char msg[/* SAMP_MAX_CHAT_MESSAGE */ 144] = { 0 };

    va_start(ap, szString);
    vsprintf_s(msg, szString, ap);
    va_end(ap);

    DWORD base = reinterpret_cast<DWORD>(GetModuleHandleW(L"samp.dll"));
    DWORD ptr_chat_info = base + /* SAMP_PTR_CHAT_INFO */ 0x21A0E4;
    DWORD ptr_function = base + /* SAMP_PTR_FUNC_ADDTOCHATWND */ 0x64010;

    __asm
    {
        mov eax, dword ptr[ptr_chat_info]
        mov ecx, dword ptr[eax]
        push 0
        push dwColor
        push 0
        lea eax, msg
        push eax
        push 8
        call ptr_function
    }
}
 
  • Нравится
Реакции: Vintik и bottom_text

Sana_Minotazaki

Известный
75
2
в настройках проекта выбери установленый тулсет и винсдк

перед использованием проверь загруженость сампа
C++:
void add_chat_message(DWORD dwColor, LPCSTR szString, ...)
{
    va_list ap;

    char msg[/* SAMP_MAX_CHAT_MESSAGE */ 144] = { 0 };

    va_start(ap, szString);
    vsprintf_s(msg, szString, ap);
    va_end(ap);

    DWORD base = reinterpret_cast<DWORD>(GetModuleHandleW(L"samp.dll"));
    DWORD ptr_chat_info = base + /* SAMP_PTR_CHAT_INFO */ 0x21A0E4;
    DWORD ptr_function = base + /* SAMP_PTR_FUNC_ADDTOCHATWND */ 0x64010;

    __asm
    {
        mov eax, dword ptr[ptr_chat_info]
        mov ecx, dword ptr[eax]
        push 0
        push dwColor
        push 0
        lea eax, msg
        push eax
        push 8
        call ptr_function
    }
}
Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там
 

sc6ut

неизвестный
Модератор
383
1,092
Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там
пкм по названию проекту - настройки. выбираешь установленый тулсет (у меня это v141), применяешь настройки. после чего выбираешь версию winsdk (у меня это 10.0.17763.0), применяешь настройки.
1610523487032.png
1610523496235.png
1610523546623.png
1610523579337.png
1610523642673.png
 
  • Нравится
Реакции: Sana_Minotazaki