Advertisement
joxeankoret

Untitled

Aug 30th, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. void __stdcall SwitchToFiber(_FIBER *lpFiber)
  2. {
  3.   DWORD64 vRbx; // rbx
  4.   DWORD64 vRbp; // rbp
  5.   DWORD64 vRdi; // rdi
  6.   DWORD64 vRsi; // rsi
  7.   DWORD64 vR12; // r12
  8.   DWORD64 vR13; // r13
  9.   DWORD64 vR14; // r14
  10.   DWORD64 vR15; // r15
  11.   M128A vXmm6; // xmm6
  12.   M128A vXmm7; // xmm7
  13.   M128A vXmm8; // xmm8
  14.   M128A vXmm9; // xmm9
  15.   M128A vXmm10; // xmm10
  16.   M128A vXmm11; // xmm11
  17.   M128A vXmm12; // xmm12
  18.   M128A vXmm13; // xmm13
  19.   M128A vXmm14; // xmm14
  20.   M128A vXmm15; // xmm15
  21.   struct _TEB *teb; // rdx
  22.   _FIBER *fiber_data; // rax
  23.   CONTEXT *ctx; // r8
  24.   DWORD64 vRip; // [rsp+0h] [rbp+0h]
  25.  
  26.   if ( *(__int64 *)((char *)&lpFiber->TebFlags + 4) != ((unsigned __int64)lpFiber ^ qword_180217E28 ^ (_QWORD)lpFiber->StackBase) )
  27.     __fastfail(ERROR_INVALID_ACCESS);
  28.   teb = NtCurrentTeb();
  29.   fiber_data = teb->NtTib.FiberData;
  30.   teb->DeallocationStack = lpFiber->DeallocationStack;
  31.   teb->NtTib.FiberData = lpFiber;
  32.   fiber_data->StackLimit = teb->NtTib.StackLimit;
  33.   fiber_data->GuaranteedStackBytes = teb->GuaranteedStackBytes;
  34.   fiber_data->FlsData = teb->FlsData;
  35.   fiber_data->ActivationContextStackPointer = teb->ActivationContextStackPointer;
  36.   ctx = &fiber_data->FiberContext;
  37.   ctx->Rbx = vRbx;
  38.   ctx->Rbp = vRbp;
  39.   ctx->Rsi = vRsi;
  40.   ctx->Rdi = vRdi;
  41.   ctx->R12 = vR12;
  42.   ctx->R13 = vR13;
  43.   ctx->R14 = vR14;
  44.   ctx->R15 = vR15;
  45.   ctx->FltSave.XmmRegisters[6] = vXmm6;
  46.   ctx->FltSave.XmmRegisters[7] = vXmm7;
  47.   ctx->FltSave.XmmRegisters[offsetof(CONTEXT, P2Home)] = vXmm8;
  48.   ctx->FltSave.XmmRegisters[9] = vXmm9;
  49.   ctx->FltSave.XmmRegisters[0xA] = vXmm10;
  50.   ctx->FltSave.XmmRegisters[0xB] = vXmm11;
  51.   ctx->FltSave.XmmRegisters[0xC] = vXmm12;
  52.   ctx->FltSave.XmmRegisters[0xD] = vXmm13;
  53.   ctx->FltSave.XmmRegisters[0xE] = vXmm14;
  54.   ctx->FltSave.XmmRegisters[0xF] = vXmm15;
  55.   ctx->MxCsr = _mm_getcsr();
  56.   __asm { fnclex }
  57.   ctx->Rip = vRip;
  58.   ctx->Rsp = (DWORD64)&vRip;
  59.   teb->NtTib.StackBase = lpFiber->StackBase;
  60.   teb->NtTib.StackLimit = lpFiber->StackLimit;
  61.   teb->GuaranteedStackBytes = lpFiber->GuaranteedStackBytes;
  62.   teb->FlsData = lpFiber->FlsData;
  63.   teb->ActivationContextStackPointer = lpFiber->ActivationContextStackPointer;
  64.   _mm_setcsr(lpFiber->FiberContext.MxCsr);
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement