Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement