Cstrike: Implement CS_OnBuy forward.

This commit is contained in:
Arkshine
2014-05-30 00:13:03 +02:00
parent 38e2e3e393
commit f130a8ea89
8 changed files with 404 additions and 39 deletions

View File

@ -56,6 +56,14 @@ ret name(void)
ret (*name##_Actual)(p1type) = NULL; \
ret name(p1type p1name)
#define DETOUR_DECL_STATIC2(name, ret, p1type, p1name, p2type, p2name) \
ret (*name##_Actual)(p1type, p2type) = NULL; \
ret name(p1type p1name, p2type p2name)
#define DETOUR_DECL_STATIC3(name, ret, p1type, p1name, p2type, p2name, p3type, p3name) \
ret (*name##_Actual)(p1type, p2type, p3type) = NULL; \
ret name(p1type p1name, p2type p2name, p3type p3name)
#define DETOUR_DECL_STATIC4(name, ret, p1type, p1name, p2type, p2name, p3type, p3name, p4type, p4name) \
ret (*name##_Actual)(p1type, p2type, p3type, p4type) = NULL; \
ret name(p1type p1name, p2type p2name, p3type p3name, p4type p4name)
@ -127,9 +135,9 @@ ret name##Class::name(p1type p1name, p2type p2name, p3type p3name, p4type p4name
#define GET_STATIC_CALLBACK(name) (void *)&name
#define GET_STATIC_TRAMPOLINE(name) (void **)&name##_Actual
#define DETOUR_CREATE_MEMBER(name, gamedata, target) CDetourManager::CreateDetour(GET_MEMBER_CALLBACK(name), GET_MEMBER_TRAMPOLINE(name), gamedata, target);
#define DETOUR_CREATE_STATIC(name, gamedata, target) CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), gamedata, target);
#define DETOUR_CREATE_STATIC_FIXED(name, address) CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), address);
#define DETOUR_CREATE_MEMBER(name, gamedata, target) CDetourManager::CreateDetour(GET_MEMBER_CALLBACK(name), GET_MEMBER_TRAMPOLINE(name), gamedata, target);
#define DETOUR_CREATE_STATIC(name, gamedata, target) CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), gamedata, target);
#define DETOUR_CREATE_STATIC_FIXED(name, address) CDetourManager::CreateDetour(GET_STATIC_CALLBACK(name), GET_STATIC_TRAMPOLINE(name), address);
class GenericClass {};
typedef void (GenericClass::*VoidFunc)();

View File

@ -29,6 +29,7 @@
#include "MemoryUtils.h"
#include <string.h>
#include <stdio.h>
#if defined(__linux__)
#include <fcntl.h>
@ -63,8 +64,6 @@
#endif // MAC_OS_X_VERSION_10_6
#endif // __APPLE__
MemoryUtils g_MemUtils;
MemoryUtils::MemoryUtils()
@ -103,6 +102,19 @@ MemoryUtils::~MemoryUtils()
#endif
}
void *MemoryUtils::DecodeAndFindPattern(const void *libPtr, const char *pattern)
{
unsigned char real_sig[511];
size_t real_bytes = DecodeHexString(real_sig, sizeof(real_sig), pattern);
if (real_bytes >= 1)
{
return FindPattern(libPtr, (char*)real_sig, real_bytes);
}
return NULL;
}
void *MemoryUtils::FindPattern(const void *libPtr, const char *pattern, size_t len)
{
DynLibInfo lib;
@ -655,3 +667,39 @@ bool MemoryUtils::GetLibraryOfAddress(const void *libPtr, char *buffer, size_t m
return true;
}
size_t MemoryUtils::DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr)
{
size_t written = 0;
size_t length = strlen(hexstr);
for (size_t i = 0; i < length; i++)
{
if (written >= maxlength)
break;
buffer[written++] = hexstr[i];
if (hexstr[i] == '\\' && hexstr[i + 1] == 'x')
{
if (i + 3 >= length)
continue;
/* Get the hex part. */
char s_byte[3];
int r_byte;
s_byte[0] = hexstr[i + 2];
s_byte[1] = hexstr[i + 3];
s_byte[2] = '\0';
/* Read it as an integer */
sscanf(s_byte, "%x", &r_byte);
/* Save the value */
buffer[written - 1] = r_byte;
/* Adjust index */
i += 3;
}
}
return written;
}

View File

@ -44,6 +44,10 @@
#include <windows.h>
#endif
#if defined _MSC_VER && _MSC_VER >= 1400
#pragma warning (disable:4996) /* Disable deprecation warnings */
#endif
struct DynLibInfo
{
void *baseAddress;
@ -66,6 +70,7 @@ class MemoryUtils
~MemoryUtils();
public:
void *DecodeAndFindPattern(const void *libPtr, const char *pattern);
void *FindPattern(const void *libPtr, const char *pattern, size_t len);
void *ResolveSymbol(void *handle, const char *symbol);
@ -73,6 +78,9 @@ class MemoryUtils
bool GetLibraryInfo(const void *libPtr, DynLibInfo &lib);
bool GetLibraryOfAddress(const void *libPtr, char *buffer, size_t maxlength, uintptr_t *base);
public:
size_t DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr);
#if defined(__linux__) || defined(__APPLE__)
private:
ke::Vector<LibSymbolTable *> m_SymTables;