diff --git a/libs/detours/LICENSE.md b/libs/detours/LICENSE.md deleted file mode 100644 index e6a4c563..00000000 --- a/libs/detours/LICENSE.md +++ /dev/null @@ -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. diff --git a/libs/detours/LICENSE b/libs/detours/SOURCE.txt similarity index 77% rename from libs/detours/LICENSE rename to libs/detours/SOURCE.txt index b2f52a2b..a9a26b90 100644 --- a/libs/detours/LICENSE +++ b/libs/detours/SOURCE.txt @@ -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 diff --git a/libs/detours/detours.cpp b/libs/detours/detours.cpp index 1fb297d2..c1138dca 100644 --- a/libs/detours/detours.cpp +++ b/libs/detours/detours.cpp @@ -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; } diff --git a/libs/detours/detours.h b/libs/detours/detours.h index 3354d72f..f3738af0 100644 --- a/libs/detours/detours.h +++ b/libs/detours/detours.h @@ -56,6 +56,7 @@ #define __try #define __except(x) if (0) #include +#include #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); diff --git a/libs/detours/disasm.cpp b/libs/detours/disasm.cpp index 6cd23b25..6a72d54d 100644 --- a/libs/detours/disasm.cpp +++ b/libs/detours/disasm.cpp @@ -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; } diff --git a/libs/detours/image.cpp b/libs/detours/image.cpp index 10b17a01..897df4eb 100644 --- a/libs/detours/image.cpp +++ b/libs/detours/image.cpp @@ -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