joxeankoret icon

Untitled

joxeankoret | PRO | 08/30/18 11:40:28 AM UTC | 0 ⭐ | 487 👁️ | Never ⏰ | []
C++ |

2.2 KB

|

None

|

0 👍

/

0 👎

void __stdcall SwitchToFiber(_FIBER *lpFiber)
{
  DWORD64 vRbx; // rbx
  DWORD64 vRbp; // rbp
  DWORD64 vRdi; // rdi
  DWORD64 vRsi; // rsi
  DWORD64 vR12; // r12
  DWORD64 vR13; // r13
  DWORD64 vR14; // r14
  DWORD64 vR15; // r15
  M128A vXmm6; // xmm6
  M128A vXmm7; // xmm7
  M128A vXmm8; // xmm8
  M128A vXmm9; // xmm9
  M128A vXmm10; // xmm10
  M128A vXmm11; // xmm11
  M128A vXmm12; // xmm12
  M128A vXmm13; // xmm13
  M128A vXmm14; // xmm14
  M128A vXmm15; // xmm15
  struct _TEB *teb; // rdx
  _FIBER *fiber_data; // rax
  CONTEXT *ctx; // r8
  DWORD64 vRip; // [rsp+0h] [rbp+0h]
 
  if ( *(__int64 *)((char *)&lpFiber->TebFlags + 4) != ((unsigned __int64)lpFiber ^ qword_180217E28 ^ (_QWORD)lpFiber->StackBase) )
    __fastfail(ERROR_INVALID_ACCESS);
  teb = NtCurrentTeb();
  fiber_data = teb->NtTib.FiberData;
  teb->DeallocationStack = lpFiber->DeallocationStack;
  teb->NtTib.FiberData = lpFiber;
  fiber_data->StackLimit = teb->NtTib.StackLimit;
  fiber_data->GuaranteedStackBytes = teb->GuaranteedStackBytes;
  fiber_data->FlsData = teb->FlsData;
  fiber_data->ActivationContextStackPointer = teb->ActivationContextStackPointer;
  ctx = &fiber_data->FiberContext;
  ctx->Rbx = vRbx;
  ctx->Rbp = vRbp;
  ctx->Rsi = vRsi;
  ctx->Rdi = vRdi;
  ctx->R12 = vR12;
  ctx->R13 = vR13;
  ctx->R14 = vR14;
  ctx->R15 = vR15;
  ctx->FltSave.XmmRegisters[6] = vXmm6;
  ctx->FltSave.XmmRegisters[7] = vXmm7;
  ctx->FltSave.XmmRegisters[offsetof(CONTEXT, P2Home)] = vXmm8;
  ctx->FltSave.XmmRegisters[9] = vXmm9;
  ctx->FltSave.XmmRegisters[0xA] = vXmm10;
  ctx->FltSave.XmmRegisters[0xB] = vXmm11;
  ctx->FltSave.XmmRegisters[0xC] = vXmm12;
  ctx->FltSave.XmmRegisters[0xD] = vXmm13;
  ctx->FltSave.XmmRegisters[0xE] = vXmm14;
  ctx->FltSave.XmmRegisters[0xF] = vXmm15;
  ctx->MxCsr = _mm_getcsr();
  __asm { fnclex }
  ctx->Rip = vRip;
  ctx->Rsp = (DWORD64)&vRip;
  teb->NtTib.StackBase = lpFiber->StackBase;
  teb->NtTib.StackLimit = lpFiber->StackLimit;
  teb->GuaranteedStackBytes = lpFiber->GuaranteedStackBytes;
  teb->FlsData = lpFiber->FlsData;
  teb->ActivationContextStackPointer = lpFiber->ActivationContextStackPointer;
  _mm_setcsr(lpFiber->FiberContext.MxCsr);
}

Comments