mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2024-11-29 11:24:19 +01:00
1d9949e1a0
--HG-- rename : core-1.4/CPlugin.cpp => core-legacy/CPlugin.cpp rename : core-1.4/CPlugin.h => core-legacy/CPlugin.h rename : core-1.4/CSmmAPI.cpp => core-legacy/CSmmAPI.cpp rename : core-1.4/CSmmAPI.h => core-legacy/CSmmAPI.h rename : core-1.4/IPluginManager.h => core-legacy/IPluginManager.h rename : core-1.4/ISmmAPI.h => core-legacy/ISmmAPI.h rename : core-1.4/ISmmPlugin.h => core-legacy/ISmmPlugin.h rename : core-1.4/Makefile => core-legacy/Makefile rename : core-1.4/concommands.cpp => core-legacy/concommands.cpp rename : core-1.4/concommands.h => core-legacy/concommands.h rename : core-1.4/convar_smm.h => core-legacy/convar_smm.h rename : core-1.4/msvc7/sourcemm.sln => core-legacy/msvc7/sourcemm.sln rename : core-1.4/msvc7/sourcemm.vcproj => core-legacy/msvc7/sourcemm.vcproj rename : core-1.4/msvc8/sourcemm.sln => core-legacy/msvc8/sourcemm.sln rename : core-1.4/msvc8/sourcemm.vcproj => core-legacy/msvc8/sourcemm.vcproj rename : core-1.4/msvc9/sourcemm.sln => core-legacy/msvc9/sourcemm.sln rename : core-1.4/msvc9/sourcemm.vcproj => core-legacy/msvc9/sourcemm.vcproj rename : core-1.4/oslink.cpp => core-legacy/oslink.cpp rename : core-1.4/oslink.h => core-legacy/oslink.h rename : core-1.4/sourcehook.cpp => core-legacy/sourcehook.cpp rename : core-1.4/sourcehook/FastDelegate.h => core-legacy/sourcehook/FastDelegate.h rename : core-1.4/sourcehook/generate/FastDelegate.h => core-legacy/sourcehook/generate/FastDelegate.h rename : core-1.4/sourcehook/generate/FastDelegate.hxx => core-legacy/sourcehook/generate/FastDelegate.hxx rename : core-1.4/sourcehook/generate/generate => core-legacy/sourcehook/generate/generate rename : core-1.4/sourcehook/generate/generate.bat => core-legacy/sourcehook/generate/generate.bat rename : core-1.4/sourcehook/generate/sh_memfuncinfo.h => core-legacy/sourcehook/generate/sh_memfuncinfo.h rename : core-1.4/sourcehook/generate/sh_memfuncinfo.hxx => core-legacy/sourcehook/generate/sh_memfuncinfo.hxx rename : core-1.4/sourcehook/generate/shworker.bin => core-legacy/sourcehook/generate/shworker.bin rename : core-1.4/sourcehook/generate/shworker.exe => core-legacy/sourcehook/generate/shworker.exe rename : core-1.4/sourcehook/generate/shworker/Makefile => core-legacy/sourcehook/generate/shworker/Makefile rename : core-1.4/sourcehook/generate/shworker/fd_hopter.cpp => core-legacy/sourcehook/generate/shworker/fd_hopter.cpp rename : core-1.4/sourcehook/generate/shworker/msvc7/shworker.vcproj => core-legacy/sourcehook/generate/shworker/msvc7/shworker.vcproj rename : core-1.4/sourcehook/generate/shworker/msvc8/shworker.vcproj => core-legacy/sourcehook/generate/shworker/msvc8/shworker.vcproj rename : core-1.4/sourcehook/generate/shworker/shworker.cpp => core-legacy/sourcehook/generate/shworker/shworker.cpp rename : core-1.4/sourcehook/generate/sourcehook.h => core-legacy/sourcehook/generate/sourcehook.h rename : core-1.4/sourcehook/generate/sourcehook.hxx => core-legacy/sourcehook/generate/sourcehook.hxx rename : core-1.4/sourcehook/sh_list.h => core-legacy/sourcehook/sh_list.h rename : core-1.4/sourcehook/sh_memfuncinfo.h => core-legacy/sourcehook/sh_memfuncinfo.h rename : core-1.4/sourcehook/sh_memory.h => core-legacy/sourcehook/sh_memory.h rename : core-1.4/sourcehook/sh_stack.h => core-legacy/sourcehook/sh_stack.h rename : core-1.4/sourcehook/sh_string.h => core-legacy/sourcehook/sh_string.h rename : core-1.4/sourcehook/sh_tinyhash.h => core-legacy/sourcehook/sh_tinyhash.h rename : core-1.4/sourcehook/sh_vector.h => core-legacy/sourcehook/sh_vector.h rename : core-1.4/sourcehook/sourcehook.cpp => core-legacy/sourcehook/sourcehook.cpp rename : core-1.4/sourcehook/sourcehook.h => core-legacy/sourcehook/sourcehook.h rename : core-1.4/sourcehook/sourcehook_impl.h => core-legacy/sourcehook/sourcehook_impl.h rename : core-1.4/sourcehook/test/Makefile => core-legacy/sourcehook/test/Makefile rename : core-1.4/sourcehook/test/main.cpp => core-legacy/sourcehook/test/main.cpp rename : core-1.4/sourcehook/test/msvc7/test.vcproj => core-legacy/sourcehook/test/msvc7/test.vcproj rename : core-1.4/sourcehook/test/msvc8/test.vcproj => core-legacy/sourcehook/test/msvc8/test.vcproj rename : core-1.4/sourcehook/test/sourcehook_test.h => core-legacy/sourcehook/test/sourcehook_test.h rename : core-1.4/sourcehook/test/test1.cpp => core-legacy/sourcehook/test/test1.cpp rename : core-1.4/sourcehook/test/test2.cpp => core-legacy/sourcehook/test/test2.cpp rename : core-1.4/sourcehook/test/test3.cpp => core-legacy/sourcehook/test/test3.cpp rename : core-1.4/sourcehook/test/test4.cpp => core-legacy/sourcehook/test/test4.cpp rename : core-1.4/sourcehook/test/testbail.cpp => core-legacy/sourcehook/test/testbail.cpp rename : core-1.4/sourcehook/test/testbail.h => core-legacy/sourcehook/test/testbail.h rename : core-1.4/sourcehook/test/testbail2.cpp => core-legacy/sourcehook/test/testbail2.cpp rename : core-1.4/sourcehook/test/testevents.h => core-legacy/sourcehook/test/testevents.h rename : core-1.4/sourcehook/test/testlist.cpp => core-legacy/sourcehook/test/testlist.cpp rename : core-1.4/sourcehook/test/testmanual.cpp => core-legacy/sourcehook/test/testmanual.cpp rename : core-1.4/sourcehook/test/testmulti.cpp => core-legacy/sourcehook/test/testmulti.cpp rename : core-1.4/sourcehook/test/testrecall.cpp => core-legacy/sourcehook/test/testrecall.cpp rename : core-1.4/sourcehook/test/testreentr.cpp => core-legacy/sourcehook/test/testreentr.cpp rename : core-1.4/sourcehook/test/testref.cpp => core-legacy/sourcehook/test/testref.cpp rename : core-1.4/sourcehook/test/testrefret.cpp => core-legacy/sourcehook/test/testrefret.cpp rename : core-1.4/sourcemm.cpp => core-legacy/sourcemm.cpp rename : core-1.4/sourcemm.h => core-legacy/sourcemm.h rename : core-1.4/svn_version.h => core-legacy/svn_version.h rename : core-1.4/svn_version.tpl => core-legacy/svn_version.tpl rename : core-1.4/util.cpp => core-legacy/util.cpp rename : core-1.4/util.h => core-legacy/util.h rename : core-1.4/version.rc => core-legacy/version.rc rename : core-1.4/vsp_listener.cpp => core-legacy/vsp_listener.cpp rename : core-1.4/vsp_listener.h => core-legacy/vsp_listener.h
131 lines
3.7 KiB
C++
131 lines
3.7 KiB
C++
/* ======== SourceMM ========
|
|
* Copyright (C) 2004-2008 Metamod:Source Development Team
|
|
* No warranties of any kind
|
|
*
|
|
* License: zlib/libpng
|
|
*
|
|
* Author(s): David "BAILOPAN" Anderson
|
|
* ============================
|
|
*/
|
|
|
|
#ifndef _INCLUDE_UTIL_H
|
|
#define _INCLUDE_UTIL_H
|
|
|
|
#include <stdarg.h>
|
|
#include <sourcehook/sourcehook.h>
|
|
|
|
/**
|
|
* @brief Utility functions
|
|
* @file util.h
|
|
*/
|
|
|
|
#define IA32_JMP_IMM32 '\xE9'
|
|
|
|
/**
|
|
* @brief Returns a pointer to the extension in a file name.
|
|
*/
|
|
const char *UTIL_GetExtension(const char *file);
|
|
|
|
/**
|
|
* @brief Removes C-style comments from string.
|
|
*/
|
|
void UTIL_TrimComments(char *buffer);
|
|
|
|
/**
|
|
* @brief Removes whitespace characters from left side of string.
|
|
*/
|
|
void UTIL_TrimLeft(char *buffer);
|
|
|
|
/**
|
|
* @brief Removes whitespace characters from right side of string.
|
|
*/
|
|
void UTIL_TrimRight(char *buffer);
|
|
|
|
/**
|
|
* @brief Breaks a string at the first space until it reaches a non-space.
|
|
*/
|
|
void UTIL_KeySplit(const char *str, char *buf1, size_t len1, char *buf2, size_t len2);
|
|
|
|
/**
|
|
* @brief Compares two file paths.
|
|
*/
|
|
bool UTIL_PathCmp(const char *path1, const char *path2);
|
|
|
|
/**
|
|
* @brief Same as snprintf except that it ensures the string buffer is null terminated.
|
|
*/
|
|
size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...);
|
|
|
|
/**
|
|
* @brief Same as vsnprintf except that it ensures the string buffer is null terminated.
|
|
*/
|
|
size_t UTIL_FormatArgs(char *buffer, size_t maxlength, const char *fmt, va_list params);
|
|
|
|
/**
|
|
* @brief Forms a relative path given two absolute paths.
|
|
*
|
|
* @param buffer Buffer to store relative path in.
|
|
* @param maxlength Maximum length of the output buffer.
|
|
* @param relTo Destination folder to use as a working directory.
|
|
* Final folder name should not be pathchar-terminated.
|
|
* @param relFrom Source file or folder to use as a target.
|
|
* @return True on success, false on failure.
|
|
*/
|
|
bool UTIL_Relatize(char buffer[],
|
|
size_t maxlength,
|
|
const char *relTo,
|
|
const char *relFrom);
|
|
|
|
/**
|
|
* @brief Compares memory address against a signature.
|
|
*
|
|
* @param addr Memory address to check.
|
|
* @param sig Signature used to check against memory address. Accept 0x2A as wildcard.
|
|
* @param len Length of signature.
|
|
* @return True if signature was verified, false otherwise.
|
|
*/
|
|
bool UTIL_VerifySignature(const void *addr, const char *sig, size_t len);
|
|
|
|
/**
|
|
* @brief Returns the original function address of a given virtual function.
|
|
*
|
|
* @param mfp Member function pointer to virtual function.
|
|
* @param ptr Pointer to interface in which the virtual function belongs.
|
|
* @param cls A CallClass for the interface in which the virtual function belongs.
|
|
* @return Address of function originally pointed to by the virtual function.
|
|
*/
|
|
template <class MFP, class Iface>
|
|
char *UTIL_GetOrigFunction(MFP vfunc, Iface *ptr, SourceHook::CallClass<Iface> *cls)
|
|
{
|
|
SourceHook::MemFuncInfo info = {true, -1, 0, 0};
|
|
SourceHook::GetFuncInfo(vfunc, info);
|
|
|
|
/* Get address of original GetUserMessageInfo() */
|
|
char *func = reinterpret_cast<char *>(cls->GetOrigFunc(info.vtbloffs, info.vtblindex));
|
|
|
|
/* If we can't get original function, that means there's no hook */
|
|
if (func == NULL)
|
|
{
|
|
/* Get virtual function address 'manually' then */
|
|
char *adjustedptr = reinterpret_cast<char *>(ptr) + info.vtbloffs + info.vtbloffs;
|
|
char **vtable = *reinterpret_cast<char ***>(adjustedptr);
|
|
|
|
func = vtable[info.vtblindex];
|
|
}
|
|
|
|
/* Check for relative jumps */
|
|
if (func[0] == IA32_JMP_IMM32)
|
|
{
|
|
/* Get address from displacement...
|
|
*
|
|
* Add 5 because it's relative to next instruction:
|
|
* Opcode <1 byte> + 32-bit displacement <4 bytes>
|
|
*/
|
|
func += *reinterpret_cast<unsigned long *>(func + 1) + 5;
|
|
}
|
|
|
|
return func;
|
|
}
|
|
|
|
#endif //_INCLUDE_UTIL_H
|