mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-11-23 11:15:34 +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.
|
Copyright (c) Microsoft Corporation.
|
||||||
|
|
||||||
MIT License
|
MIT License
|
@ -1395,6 +1395,12 @@ PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,
|
|||||||
return pbNewlyAllocated;
|
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)
|
static PDETOUR_TRAMPOLINE detour_alloc_trampoline(PBYTE pbTarget)
|
||||||
{
|
{
|
||||||
// We have to place trampolines within +/- 2GB of target.
|
// 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.
|
// We need to allocate a new region.
|
||||||
|
|
||||||
// Round pbTarget down to 64KB block.
|
// Round pbTarget down to 64KB block.
|
||||||
pbTarget = pbTarget - (PtrToUlong(pbTarget) & 0xffff);
|
// /RTCc RuntimeChecks breaks PtrToUlong.
|
||||||
|
pbTarget = pbTarget - (ULONG)((ULONG_PTR)pbTarget & 0xffff);
|
||||||
|
|
||||||
PVOID pbNewlyAllocated =
|
PVOID pbNewlyAllocated =
|
||||||
detour_alloc_trampoline_allocate_new(pbTarget, pLo, pHi);
|
detour_alloc_trampoline_allocate_new(pbTarget, pLo, pHi);
|
||||||
@ -2098,6 +2105,12 @@ LONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,
|
|||||||
delete o;
|
delete o;
|
||||||
o = NULL;
|
o = NULL;
|
||||||
}
|
}
|
||||||
|
if (ppRealDetour != NULL) {
|
||||||
|
*ppRealDetour = NULL;
|
||||||
|
}
|
||||||
|
if (ppRealTarget != NULL) {
|
||||||
|
*ppRealTarget = NULL;
|
||||||
|
}
|
||||||
s_ppPendingError = ppPointer;
|
s_ppPendingError = ppPointer;
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
#define __try
|
#define __try
|
||||||
#define __except(x) if (0)
|
#define __except(x) if (0)
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
|
#include <intsafe.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// From winerror.h, as this error isn't found in some SDKs:
|
// 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;
|
extern const GUID DETOUR_EXE_HELPER_GUID;
|
||||||
|
|
||||||
#define DETOUR_TRAMPOLINE_SIGNATURE 0x21727444 // Dtr!
|
#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.
|
/////////////////////////////////////////////////////////// Binary Structures.
|
||||||
//
|
//
|
||||||
@ -453,9 +458,9 @@ typedef struct _DETOUR_EXE_RESTORE
|
|||||||
#endif
|
#endif
|
||||||
#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC // some environments do not have this
|
#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC // some environments do not have this
|
||||||
BYTE raw[sizeof(IMAGE_NT_HEADERS64) +
|
BYTE raw[sizeof(IMAGE_NT_HEADERS64) +
|
||||||
sizeof(IMAGE_SECTION_HEADER) * 32];
|
sizeof(IMAGE_SECTION_HEADER) * DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS];
|
||||||
#else
|
#else
|
||||||
BYTE raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * 32];
|
BYTE raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * DETOUR_MAX_SUPPORTED_IMAGE_SECTION_HEADERS];
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
DETOUR_CLR_HEADER clr;
|
DETOUR_CLR_HEADER clr;
|
||||||
@ -589,7 +594,9 @@ PVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,
|
|||||||
BOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,
|
BOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,
|
||||||
_In_ BOOL fLimitReferencesToModule);
|
_In_ BOOL fLimitReferencesToModule);
|
||||||
PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,
|
PVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,
|
||||||
_Out_ PDWORD pcbAllocatedSize);
|
_Out_ PDWORD pcbAllocatedSize);
|
||||||
|
BOOL WINAPI DetourIsFunctionImported(_In_ PBYTE pbCode,
|
||||||
|
_In_ PBYTE pbAddress);
|
||||||
|
|
||||||
///////////////////////////////////////////////////// Loaded Binary Functions.
|
///////////////////////////////////////////////////// Loaded Binary Functions.
|
||||||
//
|
//
|
||||||
@ -951,10 +958,10 @@ typedef DWORD (NTAPI *PF_SymSetOptions)(_In_ DWORD SymOptions);
|
|||||||
typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
|
typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
|
||||||
typedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,
|
typedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,
|
||||||
_In_opt_ HANDLE hFile,
|
_In_opt_ HANDLE hFile,
|
||||||
_In_ LPSTR ImageName,
|
_In_opt_ LPSTR ImageName,
|
||||||
_In_opt_ LPSTR ModuleName,
|
_In_opt_ LPSTR ModuleName,
|
||||||
_In_ DWORD64 BaseOfDll,
|
_In_ DWORD64 BaseOfDll,
|
||||||
_In_opt_ DWORD SizeOfDll);
|
_In_ DWORD SizeOfDll);
|
||||||
typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,
|
typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,
|
||||||
_In_ DWORD64 qwAddr,
|
_In_ DWORD64 qwAddr,
|
||||||
_Out_ PIMAGEHLP_MODULE64 ModuleInfo);
|
_Out_ PIMAGEHLP_MODULE64 ModuleInfo);
|
||||||
|
@ -279,7 +279,7 @@ class CDetourDis
|
|||||||
PBYTE CopyVex2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
PBYTE CopyVex2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||||
PBYTE CopyVex3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
PBYTE CopyVex3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||||
PBYTE CopyVexCommon(BYTE m, 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 CopyEvex(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);
|
||||||
PBYTE CopyXop(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;
|
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
|
// m is first instead of last in the hopes of pbDst/pbSrc being
|
||||||
// passed along efficiently in the registers they were already in.
|
// 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;
|
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);
|
default: return Invalid(&ceInvalid, pbDst, pbSrc);
|
||||||
case 1: pEntry = &s_rceCopyTable0F[pbSrc[0]];
|
case 1: pEntry = &s_rceCopyTable0F[pbSrc[0]];
|
||||||
return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);
|
return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);
|
||||||
|
case 5: // fallthrough
|
||||||
|
case 6: // fallthrough
|
||||||
case 2: return CopyBytes(&ceF38, pbDst, pbSrc);
|
case 2: return CopyBytes(&ceF38, pbDst, pbSrc);
|
||||||
case 3: return CopyBytes(&ceF3A, 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;
|
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);
|
return Invalid(&ceInvalid, pbDst, pbSrc);
|
||||||
|
|
||||||
BYTE const p1 = pbSrc[2];
|
BYTE const p1 = pbSrc[2];
|
||||||
@ -876,7 +881,7 @@ PBYTE CDetourDis::CopyEvex(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)
|
|||||||
m_bRaxOverride |= !!(p1 & 0x80); // w
|
m_bRaxOverride |= !!(p1 & 0x80); // w
|
||||||
#endif
|
#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)
|
PBYTE CDetourDis::CopyXop(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)
|
||||||
@ -1595,8 +1600,8 @@ const CDetourDis::COPYENTRY CDetourDis::s_rceCopyTable0F[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
BOOL CDetourDis::SanityCheckSystem()
|
BOOL CDetourDis::SanityCheckSystem()
|
||||||
{
|
{
|
||||||
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable) == 256);
|
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable) == 256);
|
||||||
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable0F) == 256);
|
C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable0F) == 256);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1684,7 +1684,7 @@ BOOL CImage::Write(HANDLE hFile)
|
|||||||
m_nNextFileAddr = Max(m_SectionHeaders[n].PointerToRawData +
|
m_nNextFileAddr = Max(m_SectionHeaders[n].PointerToRawData +
|
||||||
m_SectionHeaders[n].SizeOfRawData,
|
m_SectionHeaders[n].SizeOfRawData,
|
||||||
m_nNextFileAddr);
|
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.
|
// In which case, use SizeOfRawData instead.
|
||||||
m_nNextVirtAddr = Max(m_SectionHeaders[n].VirtualAddress +
|
m_nNextVirtAddr = Max(m_SectionHeaders[n].VirtualAddress +
|
||||||
(m_SectionHeaders[n].Misc.VirtualSize
|
(m_SectionHeaders[n].Misc.VirtualSize
|
||||||
|
Loading…
Reference in New Issue
Block a user