mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-12-24 09:24:15 +08:00
update detours lib
This commit is contained in:
parent
c0bc32849a
commit
d42a5a6a6b
@ -1,23 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation
|
||||
|
||||
All rights reserved.
|
||||
|
||||
# MIT License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -1,3 +1,10 @@
|
||||
============================================================================ INFO
|
||||
https://github.com/microsoft/Detours
|
||||
|
||||
VERSION: https://github.com/microsoft/Detours/tree/4b8c659f549b0ab21cf649377c7a84eb708f5e68
|
||||
|
||||
============================================================================ LICENSE MIT
|
||||
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
MIT License
|
@ -1395,6 +1395,12 @@ PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,
|
||||
return pbNewlyAllocated;
|
||||
}
|
||||
|
||||
BOOL WINAPI DetourIsFunctionImported(_In_ PBYTE pbCode,
|
||||
_In_ PBYTE pbAddress)
|
||||
{
|
||||
return detour_is_imported(pbCode, pbAddress);
|
||||
}
|
||||
|
||||
static PDETOUR_TRAMPOLINE detour_alloc_trampoline(PBYTE pbTarget)
|
||||
{
|
||||
// We have to place trampolines within +/- 2GB of target.
|
||||
@ -1437,7 +1443,8 @@ static PDETOUR_TRAMPOLINE detour_alloc_trampoline(PBYTE pbTarget)
|
||||
// We need to allocate a new region.
|
||||
|
||||
// Round pbTarget down to 64KB block.
|
||||
pbTarget = pbTarget - (PtrToUlong(pbTarget) & 0xffff);
|
||||
// /RTCc RuntimeChecks breaks PtrToUlong.
|
||||
pbTarget = pbTarget - (ULONG)((ULONG_PTR)pbTarget & 0xffff);
|
||||
|
||||
PVOID pbNewlyAllocated =
|
||||
detour_alloc_trampoline_allocate_new(pbTarget, pLo, pHi);
|
||||
@ -2098,6 +2105,12 @@ LONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,
|
||||
delete o;
|
||||
o = NULL;
|
||||
}
|
||||
if (ppRealDetour != NULL) {
|
||||
*ppRealDetour = NULL;
|
||||
}
|
||||
if (ppRealTarget != NULL) {
|
||||
*ppRealTarget = NULL;
|
||||
}
|
||||
s_ppPendingError = ppPointer;
|
||||
return error;
|
||||
}
|
||||
|
@ -56,6 +56,7 @@
|
||||
#define __try
|
||||
#define __except(x) if (0)
|
||||
#include <strsafe.h>
|
||||
#include <intsafe.h>
|
||||
#endif
|
||||
|
||||
// From winerror.h, as this error isn't found in some SDKs:
|
||||
@ -380,7 +381,11 @@ extern const GUID DETOUR_EXE_RESTORE_GUID;
|
||||
extern const GUID DETOUR_EXE_HELPER_GUID;
|
||||
|
||||
#define DETOUR_TRAMPOLINE_SIGNATURE 0x21727444 // Dtr!
|
||||
typedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;
|
||||
typedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;
|
||||
|
||||
#ifndef DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS
|
||||
#define DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS 32
|
||||
#endif // !DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS
|
||||
|
||||
/////////////////////////////////////////////////////////// Binary Structures.
|
||||
//
|
||||
@ -453,9 +458,9 @@ typedef struct _DETOUR_EXE_RESTORE
|
||||
#endif
|
||||
#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC // some environments do not have this
|
||||
BYTE raw[sizeof(IMAGE_NT_HEADERS64) +
|
||||
sizeof(IMAGE_SECTION_HEADER) * 32];
|
||||
sizeof(IMAGE_SECTION_HEADER) * DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS];
|
||||
#else
|
||||
BYTE raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * 32];
|
||||
BYTE raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS];
|
||||
#endif
|
||||
};
|
||||
DETOUR_CLR_HEADER clr;
|
||||
@ -589,7 +594,9 @@ PVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,
|
||||
BOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,
|
||||
_In_ BOOL fLimitReferencesToModule);
|
||||
PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,
|
||||
_Out_ PDWORD pcbAllocatedSize);
|
||||
_Out_ PDWORD pcbAllocatedSize);
|
||||
BOOL WINAPI DetourIsFunctionImported(_In_ PBYTE pbCode,
|
||||
_In_ PBYTE pbAddress);
|
||||
|
||||
///////////////////////////////////////////////////// Loaded Binary Functions.
|
||||
//
|
||||
@ -951,10 +958,10 @@ typedef DWORD (NTAPI *PF_SymSetOptions)(_In_ DWORD SymOptions);
|
||||
typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
|
||||
typedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,
|
||||
_In_opt_ HANDLE hFile,
|
||||
_In_ LPSTR ImageName,
|
||||
_In_opt_ LPSTR ImageName,
|
||||
_In_opt_ LPSTR ModuleName,
|
||||
_In_ DWORD64 BaseOfDll,
|
||||
_In_opt_ DWORD SizeOfDll);
|
||||
_In_ DWORD SizeOfDll);
|
||||
typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,
|
||||
_In_ DWORD64 qwAddr,
|
||||
_Out_ PIMAGEHLP_MODULE64 ModuleInfo);
|
||||
|
@ -279,7 +279,7 @@ class CDetourDis
|
||||
PBYTE CopyVex2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||
PBYTE CopyVex3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||
PBYTE CopyVexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc);
|
||||
PBYTE CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p);
|
||||
PBYTE CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p, BYTE fp16 = 0);
|
||||
PBYTE CopyEvex(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||
PBYTE CopyXop(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||
|
||||
@ -745,7 +745,7 @@ PBYTE CDetourDis::CopyFF(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)
|
||||
return pbOut;
|
||||
}
|
||||
|
||||
PBYTE CDetourDis::CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p)
|
||||
PBYTE CDetourDis::CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p, BYTE fp16)
|
||||
// m is first instead of last in the hopes of pbDst/pbSrc being
|
||||
// passed along efficiently in the registers they were already in.
|
||||
{
|
||||
@ -762,10 +762,13 @@ PBYTE CDetourDis::CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p)
|
||||
|
||||
REFCOPYENTRY pEntry;
|
||||
|
||||
switch (m) {
|
||||
// see https://software.intel.com/content/www/us/en/develop/download/intel-avx512-fp16-architecture-specification.html
|
||||
switch (m | fp16) {
|
||||
default: return Invalid(&ceInvalid, pbDst, pbSrc);
|
||||
case 1: pEntry = &s_rceCopyTable0F[pbSrc[0]];
|
||||
return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);
|
||||
case 5: // fallthrough
|
||||
case 6: // fallthrough
|
||||
case 2: return CopyBytes(&ceF38, pbDst, pbSrc);
|
||||
case 3: return CopyBytes(&ceF3A, pbDst, pbSrc);
|
||||
}
|
||||
@ -859,7 +862,9 @@ PBYTE CDetourDis::CopyEvex(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)
|
||||
|
||||
static const COPYENTRY ceInvalid = /* 62 */ ENTRY_Invalid;
|
||||
|
||||
if ((p0 & 0x0C) != 0)
|
||||
// This could also be handled by default in CopyVexEvexCommon
|
||||
// if 4u changed to 4|8.
|
||||
if (p0 & 8u)
|
||||
return Invalid(&ceInvalid, pbDst, pbSrc);
|
||||
|
||||
BYTE const p1 = pbSrc[2];
|
||||
@ -876,7 +881,7 @@ PBYTE CDetourDis::CopyEvex(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)
|
||||
m_bRaxOverride |= !!(p1 & 0x80); // w
|
||||
#endif
|
||||
|
||||
return CopyVexEvexCommon(p0 & 3u, pbDst + 4, pbSrc + 4, p1 & 3u);
|
||||
return CopyVexEvexCommon(p0 & 3u, pbDst + 4, pbSrc + 4, p1 & 3u, p0 & 4u);
|
||||
}
|
||||
|
||||
PBYTE CDetourDis::CopyXop(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)
|
||||
@ -1595,8 +1600,8 @@ const CDetourDis::COPYENTRY CDetourDis::s_rceCopyTable0F[] =
|
||||
};
|
||||
|
||||
BOOL CDetourDis::SanityCheckSystem()
|
||||
{
|
||||
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable) == 256);
|
||||
{
|
||||
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable) == 256);
|
||||
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable0F) == 256);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -1684,7 +1684,7 @@ BOOL CImage::Write(HANDLE hFile)
|
||||
m_nNextFileAddr = Max(m_SectionHeaders[n].PointerToRawData +
|
||||
m_SectionHeaders[n].SizeOfRawData,
|
||||
m_nNextFileAddr);
|
||||
// Old images have VirtualSize == 0 as a matter of course, e.g. NT 3.1.
|
||||
// Old images have VirtualSize == 0 as a matter of course, e.g. NT 3.1.
|
||||
// In which case, use SizeOfRawData instead.
|
||||
m_nNextVirtAddr = Max(m_SectionHeaders[n].VirtualAddress +
|
||||
(m_SectionHeaders[n].Misc.VirtualSize
|
||||
|
Loading…
x
Reference in New Issue
Block a user