#include <Windows.h>
#include <iostream>
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")
typedef void(__thiscall* tChatAddEntry)(void *, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor);
tChatAddEntry origChatAddEntry = nullptr;
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) {
printf("type: %d, msg: %s\n", nType, szText);
return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}
class CPluginInit {
public:
CPluginInit() {
base = (DWORD)GetModuleHandleA("samp.dll");
MH_Initialize();
MH_CreateHook((void*)(base + 0x0064010)...
#include <Windows.h>
#include <iostream>
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")
typedef void(__thiscall* tChatAddEntry)(void *, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor);
tChatAddEntry origChatAddEntry = nullptr;
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) {
printf("type: %d, msg: %s\n", nType, szText);
return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}
class CPluginInit {
public:
CPluginInit() {
base = (DWORD)GetModuleHandleA("samp.dll");
MH_Initialize();
MH_CreateHook((void*)(base + 0x0064010), &HOOKED_ChatAddEntry, (void**)&origChatAddEntry);
MH_EnableHook((void*)(base + 0x0064010));
};
~CPluginInit() {
MH_DisableHook((void*)(base + 0x0064010));
};
private:
DWORD base = 0;
}PluginInit;
C++:#include <Windows.h> #include <iostream> #include "MinHook.h" #pragma comment(lib, "libMinHook-x86-v141-mt.lib") typedef void(__thiscall* tChatAddEntry)(void *, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor); tChatAddEntry origChatAddEntry = nullptr; void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) { printf("type: %d, msg: %s\n", nType, szText); return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor); } class CPluginInit { public: CPluginInit() { base = (DWORD)GetModuleHandleA("samp.dll"); MH_Initialize(); MH_CreateHook((void*)(base + 0x0064010), &HOOKED_ChatAddEntry, (void**)&origChatAddEntry); MH_EnableHook((void*)(base + 0x0064010)); }; ~CPluginInit() { MH_DisableHook((void*)(base + 0x0064010)); }; private: DWORD base = 0; }PluginInit;
Посмотреть вложение 111593
#define _CRT_SECURE_NO_WARNINGS
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) {
if(nType == 8 && strstr(szText, "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started"))
sprintf(szText, "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ");
return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor);
}
А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.В самое начало, перед всеми инклюдами
void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, const char* szText, const char* szPrefix, DWORD textColor, DWORD prefixColor) {
std::string_view Message = szText;
if(nType == 8 && Message == "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started")
Message = "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ";
return origChatAddEntry(_this, nType, Message.data(), szPrefix, textColor, prefixColor);
}
В чем проявляется UB?А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.
Да и вообще, зачем использовать функцию форматирования с кучей проверок форматирования для копирования константной строки? Про strcpy не слышал? Еще ты потерял const у szText и szPrefix.
О, а еще у тебя UB, так как имена начинающиеся на _ и на __ зарезервированы.
C++:void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, const char* szText, const char* szPrefix, DWORD textColor, DWORD prefixColor) { std::string_view Message; if(nType == 8 && std::string_view(szText) == "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started") Message = "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ"; return origChatAddEntry(_this, nType, Message.data(), szPrefix, textColor, prefixColor); }
Переформулирую. Из-за чего он происходит?Undefined Behaviour.
Можешь случайно задеть какую нибудь переменную из внутренней имплементацииПереформулирую. Из-за чего он происходит?
msbuild запрещает использование __thiscall в любом случае, поэтому приходится костылить через __fastcallподдержка этого кейворда есть только начиная с MSVC 2005
он не запрещает его использовать при вызове других не статических методов класса, но не позволяет определять не статические методы класса, который не был объявленmsbuild запрещает использование __thiscall в любом случае, поэтому приходится костылить через __fastcall
Для Win32 GCC и Clang используют соглашение __thiscall с this в ECX. Для POSIX у них везде используется только __cdecl (даже для классов)Не советую использовать __thiscall, потому что поддержка этого кейворда есть только начиная с MSVC 2005. При этом компилируя через GCC, clang ты вообще потеряешь доступ к регистру хранящему this ptr (ecx) ибо он будет на стеке валяться. Для почти полной совместимости желательно использовать соглашение __fastcall, ибо оно абсолютно точно реализовано идентично в GCC, g++, clang, ICC и этого набора уже достаточно. А еще при создании функции хука ты можешь попасться на IDB на некоторых имплементациях MSVC, в связи с тем что у тебя нету дефайна класса, что лучше не допускать. (но к удивлению в 14.2 всё нормально)
В самое начало, перед всеми инклюдами
Один из вариантов того, как можно подменить определенное сообщениеC++:#define _CRT_SECURE_NO_WARNINGS
Посмотреть вложение 111662C++:void __fastcall HOOKED_ChatAddEntry(void *_this, void *pUnk, int nType, char* szText, char* szPrefix, DWORD textColor, DWORD prefixColor) { if(nType == 8 && strstr(szText, "{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started")) sprintf(szText, "САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ"); return origChatAddEntry(_this, nType, szText, szPrefix, textColor, prefixColor); }