| 227 | } |
| 228 | |
| 229 | void DetourFindJmpBounds(PUCHAR pCode, PDETOUR_TRAMPOLINE* ppLower, |
| 230 | PDETOUR_TRAMPOLINE* ppUpper) { |
| 231 | // We have to place trampolines within +/- 2GB of code |
| 232 | ULONG_PTR lo = Detour2gbBelow((ULONG_PTR)pCode); |
| 233 | ULONG_PTR hi = Detour2gbAbove((ULONG_PTR)pCode); |
| 234 | LogDebug("[%p..%p..%p]\n", (PVOID)lo, pCode, (PVOID)hi); |
| 235 | |
| 236 | // And, within +/- 2GB of relative jmp vectors. |
| 237 | if (pCode[0] == 0xe9) { // jmp +imm32 |
| 238 | PUCHAR pNew = pCode + 5 + *(UNALIGNED INT32*) & pCode[1]; |
| 239 | |
| 240 | if (pNew < pCode) { |
| 241 | hi = Detour2gbAbove((ULONG_PTR)pNew); |
| 242 | } |
| 243 | else { |
| 244 | lo = Detour2gbBelow((ULONG_PTR)pNew); |
| 245 | } |
| 246 | LogDebug("[%p..%p..%p] +imm32\n", (PVOID)lo, pCode, (PVOID)hi); |
| 247 | } |
| 248 | |
| 249 | *ppLower = (PDETOUR_TRAMPOLINE)lo; |
| 250 | *ppUpper = (PDETOUR_TRAMPOLINE)hi; |
| 251 | } |
| 252 | |
| 253 | bool DetourDoesCodeEndFunction(PUCHAR pCode) { |
| 254 | if (pCode[0] == 0xeb || // jmp +imm8 |
nothing calls this directly
no test coverage detected