Sync detour.h with upstream

Add GET_ORIGINAL()
This commit is contained in:
8dcc 2023-07-26 13:35:11 +02:00
parent 684f950509
commit dbc12b6fb5
1 changed files with 21 additions and 5 deletions

View File

@ -34,15 +34,31 @@ bool detour_del(detour_data_t* d);
/*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/
/* Declare the type for the original function */ /* Declare the type for the original function */
#define DECL_DETOUR_TYPE(funcRet, funcName, ...) \ #define DECL_DETOUR_TYPE(funcRet, newTypeName, ...) \
typedef funcRet (*funcName##_t)(__VA_ARGS__); typedef funcRet (*newTypeName##_t)(__VA_ARGS__);
/* Reset original bytes, call original, detour again. detourData is NOT a ptr */ /* Reset original bytes, call original, detour again.
#define CALL_ORIGINAL(detourData, funcName, ...) \ * Keep in mind that:
* - The returned value of the original function is not stored. If the
* function is not void, and you care about the return value, use
* GET_ORIGINAL() instead.
* - detourData is NOT a pointer, it expects the full struct
* - funcType should be the same name passed to DECL_DETOUR_TYPE, without the
* ending added by the macro ("_t") */
#define CALL_ORIGINAL(detourData, funcType, ...) \
{ \ { \
detour_del(&detourData); \ detour_del(&detourData); \
((funcName##_t)detourData.orig)(__VA_ARGS__); \ ((funcType##_t)detourData.orig)(__VA_ARGS__); \
detour_add(&detourData); \ detour_add(&detourData); \
} }
/* Same as CALL_ORIGINAL, but accepts an extra parameter for storing the
* returned value of the original function */
#define GET_ORIGINAL(detourData, returnVar, funcType, ...) \
{ \
detour_del(&detourData); \
returnVar = ((funcType##_t)detourData.orig)(__VA_ARGS__); \
detour_add(&detourData); \
}
#endif /* DETOUR_H_ */ #endif /* DETOUR_H_ */