| 901 | } |
| 902 | |
| 903 | PUCHAR 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; |
nothing calls this directly
no outgoing calls
no test coverage detected