MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / AdjustTarget

Method AdjustTarget

KernelLibrary/disasm.cpp:903–983  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

901}
902
903PUCHAR Disasm::AdjustTarget(PUCHAR pDst, PUCHAR pSrc, ULONG op, ULONG targetOffset,
904 ULONG targetSize) {
905 PUCHAR pTarget = nullptr;
906
907#if 1 // fault injection to test code
908#ifdef DETOURS_X64
909 typedef LONGLONG T;
910#else
911 typedef LONG T;
912#endif // DETOURS_X64
913
914 T oldOffset;
915 T newOffset;
916 PVOID pTargetAddr = &pDst[targetOffset];
917
918 switch (targetSize) {
919 case 1:
920 oldOffset = *(signed char*&)pTargetAddr;
921 break;
922 case 2:
923 oldOffset = *(UNALIGNED SHORT*&)pTargetAddr;
924 break;
925 case 4:
926 oldOffset = *(UNALIGNED LONG*&)pTargetAddr;
927 break;
928#if defined(DETOURS_X64)
929 case 8:
930 oldOffset = *(UNALIGNED LONGLONG*&)pTargetAddr;
931 break;
932#endif
933 default:
934 ASSERT(!"cbTargetSize is invalid.");
935 oldOffset = 0;
936 break;
937 }
938
939 pTarget = pSrc + op + oldOffset;
940 newOffset = oldOffset - (T)(pDst - pSrc);
941
942 switch (targetSize) {
943 case 1:
944 *(CHAR*&)pTargetAddr = (CHAR)newOffset;
945 if (newOffset < SCHAR_MIN || newOffset > SCHAR_MAX) {
946 *m_pExtra = sizeof(ULONG) - 1;
947 }
948 break;
949 case 2:
950 *(UNALIGNED SHORT*&)pTargetAddr = (SHORT)newOffset;
951 if (newOffset < SHRT_MIN || newOffset > SHRT_MAX) {
952 *m_pExtra = sizeof(ULONG) - 2;
953 }
954 break;
955 case 4:
956 *(UNALIGNED LONG*&)pTargetAddr = (LONG)newOffset;
957 if (newOffset < LONG_MIN || newOffset > LONG_MAX) {
958 *m_pExtra = sizeof(ULONG) - 4;
959 }
960 break;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected