public static RedirectCallsState RevertJumpTo(IntPtr site, RedirectCallsState state)
 {
     RedirectCallsState detourState;
     unsafe
     {
         byte* sitePtr = (byte*)site.ToPointer();
         detourState = GetState(sitePtr);
         *sitePtr = state.a; // mov r11, target
         *(sitePtr + 1) = state.b;
         *((ulong*)(sitePtr + 2)) = state.f;
         *(sitePtr + 10) = state.c; // jmp r11
         *(sitePtr + 11) = state.d;
         *(sitePtr + 12) = state.e;
     }
     return detourState;
 }
 private static unsafe RedirectCallsState GetState(byte* sitePtr)
 {
     var state = new RedirectCallsState
     {
         a = *sitePtr,
         b = *(sitePtr + 1),
         c = *(sitePtr + 10),
         d = *(sitePtr + 11),
         e = *(sitePtr + 12),
         f = *((ulong*) (sitePtr + 2))
     };
     return state;
 }
 public static void RevertRedirect(MethodInfo from, RedirectCallsState state)
 {
     var fptr1 = from.MethodHandle.GetFunctionPointer();
     RevertJumpTo(fptr1, state);
 }