mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2025-12-06 12:14:54 +01:00
Update detours library to latest.
This commit is contained in:
parent
5495f36ed6
commit
c162ca79d5
7 changed files with 1294 additions and 864 deletions
|
|
@ -18,6 +18,27 @@
|
|||
|
||||
#define NOTHROW
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
||||
#ifdef _DEBUG
|
||||
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
||||
int Detour_AssertExprWithFunctionName(int reportType, const char* filename, int linenumber, const char* FunctionName, const char* msg)
|
||||
{
|
||||
int nRet = 0;
|
||||
DWORD dwLastError = GetLastError();
|
||||
CHAR szModuleNameWithFunctionName[MAX_PATH * 2];
|
||||
szModuleNameWithFunctionName[0] = 0;
|
||||
GetModuleFileNameA((HMODULE)&__ImageBase, szModuleNameWithFunctionName, ARRAYSIZE(szModuleNameWithFunctionName));
|
||||
StringCchCatNA(szModuleNameWithFunctionName, ARRAYSIZE(szModuleNameWithFunctionName), ",", ARRAYSIZE(szModuleNameWithFunctionName) - strlen(szModuleNameWithFunctionName) - 1);
|
||||
StringCchCatNA(szModuleNameWithFunctionName, ARRAYSIZE(szModuleNameWithFunctionName), FunctionName, ARRAYSIZE(szModuleNameWithFunctionName) - strlen(szModuleNameWithFunctionName) - 1);
|
||||
SetLastError(dwLastError);
|
||||
nRet = _CrtDbgReport(reportType, filename, linenumber, szModuleNameWithFunctionName, msg);
|
||||
SetLastError(dwLastError);
|
||||
return nRet;
|
||||
}
|
||||
#endif// _DEBUG
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
struct _DETOUR_ALIGN
|
||||
|
|
@ -186,7 +207,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
// We have to place trampolines within +/- 2GB of code.
|
||||
ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);
|
||||
ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
|
||||
// And, within +/- 2GB of relative jmp targets.
|
||||
if (pbCode[0] == 0xe9) { // jmp +imm32
|
||||
|
|
@ -198,7 +219,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
else {
|
||||
lo = detour_2gb_below((ULONG_PTR)pbNew);
|
||||
}
|
||||
DETOUR_TRACE(("[%p..%p..%p] +imm32\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p] +imm32\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
}
|
||||
|
||||
*ppLower = (PDETOUR_TRAMPOLINE)lo;
|
||||
|
|
@ -399,7 +420,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
// We have to place trampolines within +/- 2GB of code.
|
||||
ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);
|
||||
ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
|
||||
// And, within +/- 2GB of relative jmp vectors.
|
||||
if (pbCode[0] == 0xff && pbCode[1] == 0x25) { // jmp [+imm32]
|
||||
|
|
@ -411,7 +432,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
else {
|
||||
lo = detour_2gb_below((ULONG_PTR)pbNew);
|
||||
}
|
||||
DETOUR_TRACE(("[%p..%p..%p] [+imm32]\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p] [+imm32]\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
}
|
||||
// And, within +/- 2GB of relative jmp targets.
|
||||
else if (pbCode[0] == 0xe9) { // jmp +imm32
|
||||
|
|
@ -423,7 +444,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
else {
|
||||
lo = detour_2gb_below((ULONG_PTR)pbNew);
|
||||
}
|
||||
DETOUR_TRACE(("[%p..%p..%p] +imm32\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p] +imm32\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
}
|
||||
|
||||
*ppLower = (PDETOUR_TRAMPOLINE)lo;
|
||||
|
|
@ -818,7 +839,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
// We have to place trampolines within +/- 2GB of code.
|
||||
ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);
|
||||
ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
|
||||
*ppLower = (PDETOUR_TRAMPOLINE)lo;
|
||||
*ppUpper = (PDETOUR_TRAMPOLINE)hi;
|
||||
|
|
@ -863,7 +884,7 @@ struct _DETOUR_TRAMPOLINE
|
|||
// An ARM64 instruction is 4 bytes long.
|
||||
//
|
||||
// The overwrite is always composed of 3 instructions (12 bytes) which perform an indirect jump
|
||||
// using _DETOUR_TRAMPOLINE::pbDetour as the address holding the target location.
|
||||
// using _DETOUR_TRAMPOLINE::pbDetour as the address holding the target location.
|
||||
//
|
||||
// Copied instructions can expand.
|
||||
//
|
||||
|
|
@ -1124,7 +1145,7 @@ inline void detour_find_jmp_bounds(PBYTE pbCode,
|
|||
|
||||
ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);
|
||||
ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", lo, pbCode, hi));
|
||||
DETOUR_TRACE(("[%p..%p..%p]\n", (PVOID)lo, pbCode, (PVOID)hi));
|
||||
|
||||
*ppLower = (PDETOUR_TRAMPOLINE)lo;
|
||||
*ppUpper = (PDETOUR_TRAMPOLINE)hi;
|
||||
|
|
@ -1237,7 +1258,7 @@ static PVOID detour_alloc_region_from_lo(PBYTE pbLo, PBYTE pbHi)
|
|||
break;
|
||||
}
|
||||
|
||||
DETOUR_TRACE((" Try %p => %p..%p %6x\n",
|
||||
DETOUR_TRACE((" Try %p => %p..%p %6lx\n",
|
||||
pbTry,
|
||||
mbi.BaseAddress,
|
||||
(PBYTE)mbi.BaseAddress + mbi.RegionSize - 1,
|
||||
|
|
@ -1252,6 +1273,9 @@ static PVOID detour_alloc_region_from_lo(PBYTE pbLo, PBYTE pbHi)
|
|||
if (pv != NULL) {
|
||||
return pv;
|
||||
}
|
||||
else if (GetLastError() == ERROR_DYNAMIC_CODE_BLOCKED) {
|
||||
return NULL;
|
||||
}
|
||||
pbTry += DETOUR_REGION_SIZE;
|
||||
}
|
||||
else {
|
||||
|
|
@ -1284,7 +1308,7 @@ static PVOID detour_alloc_region_from_hi(PBYTE pbLo, PBYTE pbHi)
|
|||
break;
|
||||
}
|
||||
|
||||
DETOUR_TRACE((" Try %p => %p..%p %6x\n",
|
||||
DETOUR_TRACE((" Try %p => %p..%p %6lx\n",
|
||||
pbTry,
|
||||
mbi.BaseAddress,
|
||||
(PBYTE)mbi.BaseAddress + mbi.RegionSize - 1,
|
||||
|
|
@ -1299,6 +1323,9 @@ static PVOID detour_alloc_region_from_hi(PBYTE pbLo, PBYTE pbHi)
|
|||
if (pv != NULL) {
|
||||
return pv;
|
||||
}
|
||||
else if (GetLastError() == ERROR_DYNAMIC_CODE_BLOCKED) {
|
||||
return NULL;
|
||||
}
|
||||
pbTry -= DETOUR_REGION_SIZE;
|
||||
}
|
||||
else {
|
||||
|
|
@ -1698,7 +1725,7 @@ LONG WINAPI DetourTransactionCommitEx(_Out_opt_ PVOID **pppFailedPointer)
|
|||
#endif // DETOURS_ARM
|
||||
}
|
||||
else {
|
||||
DETOUR_TRACE(("detours: pbTramp =%p, pbRemain=%p, pbDetour=%p, cbRestore=%d\n",
|
||||
DETOUR_TRACE(("detours: pbTramp =%p, pbRemain=%p, pbDetour=%p, cbRestore=%u\n",
|
||||
o->pTrampoline,
|
||||
o->pTrampoline->pbRemain,
|
||||
o->pTrampoline->pbDetour,
|
||||
|
|
@ -1990,13 +2017,13 @@ LONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,
|
|||
}
|
||||
|
||||
if (s_nPendingThreadId != (LONG)GetCurrentThreadId()) {
|
||||
DETOUR_TRACE(("transaction conflict with thread id=%d\n", s_nPendingThreadId));
|
||||
DETOUR_TRACE(("transaction conflict with thread id=%ld\n", s_nPendingThreadId));
|
||||
return ERROR_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// If any of the pending operations failed, then we don't need to do this.
|
||||
if (s_nPendingError != NO_ERROR) {
|
||||
DETOUR_TRACE(("pending transaction error=%d\n", s_nPendingError));
|
||||
DETOUR_TRACE(("pending transaction error=%ld\n", s_nPendingError));
|
||||
return s_nPendingError;
|
||||
}
|
||||
|
||||
|
|
@ -2177,7 +2204,7 @@ LONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,
|
|||
pTrampoline->rAlign[n].obTrampoline == 0) {
|
||||
break;
|
||||
}
|
||||
DETOUR_TRACE((" %d/%d",
|
||||
DETOUR_TRACE((" %u/%u",
|
||||
pTrampoline->rAlign[n].obTarget,
|
||||
pTrampoline->rAlign[n].obTrampoline
|
||||
));
|
||||
|
|
@ -2545,4 +2572,20 @@ BOOL WINAPI DetourVirtualProtectSameExecute(_In_ PVOID pAddress,
|
|||
pAddress, nSize, dwNewProtect, pdwOldProtect);
|
||||
}
|
||||
|
||||
BOOL WINAPI DetourAreSameGuid(_In_ REFGUID left, _In_ REFGUID right)
|
||||
{
|
||||
return
|
||||
left.Data1 == right.Data1 &&
|
||||
left.Data2 == right.Data2 &&
|
||||
left.Data3 == right.Data3 &&
|
||||
left.Data4[0] == right.Data4[0] &&
|
||||
left.Data4[1] == right.Data4[1] &&
|
||||
left.Data4[2] == right.Data4[2] &&
|
||||
left.Data4[3] == right.Data4[3] &&
|
||||
left.Data4[4] == right.Data4[4] &&
|
||||
left.Data4[5] == right.Data4[5] &&
|
||||
left.Data4[6] == right.Data4[6] &&
|
||||
left.Data4[7] == right.Data4[7];
|
||||
}
|
||||
|
||||
// End of File
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue