PspInitializeThunkContext

VOID __stdcall PspInitializeThunkContext(){
  _ETHREAD *CurrentThread; 
  unsigned int v1; 
  NTSTATUS ExtendedContextLength; 
  INT64 v3; 
  unsigned __int64 v4; 
  void *v5; 
  char *v6; 
  void *InstrumentationCallback; 
  __int64 v8; 
  _KPROCESSOR_MODE v9; 
  _KTRAP_FRAME *InitialStack; 
  _KTRAP_FRAME *i; 
  _BYTE Buffer[1424]; 

  memset(&Buffer[60], 0i64, 0x7Cu);
  memset(&Buffer[4], 0, 20);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *(_QWORD *)&Buffer[24] = CurrentThread;
  v1 = ((unsigned __int32)CurrentThread->Tcb._bf_0 >> 14) & 0x40 | 0x10001B;
  ExtendedContextLength = RtlGetExtendedContextLength(v1, (UINT64 *)&Buffer[4]);
  if( ExtendedContextLength >= 0 )
  {
    v3 = *(unsigned int *)&Buffer[4];
    v4 = *(unsigned int *)&Buffer[4] + 15i64;
    if( v4 <= *(unsigned int *)&Buffer[4] )
      v4 = 0xFFFFFFFFFFFFFF0i64;
    v5 = alloca(v4 & 0xFFFFFFFFFFFFFFF0ui64);
    memset(Buffer, 0i64, *(size_t *)&Buffer[4]);
    ExtendedContextLength = RtlInitializeExtendedContext(Buffer, v1, (_CONTEXT_EX **)&Buffer[8]);
    if( ExtendedContextLength >= 0 )
    {
      memset(&Buffer[192], 0i64, 0x4D0u);
      --CurrentThread->Tcb.SpecialApcDisable;
      PspCallThreadNotifyRoutines(CurrentThread, 1u, 1u);
      ExtendedContextLength = PspGetContextThreadInternal(CurrentThread, (_CONTEXT *)Buffer, 0, 1, 0);
      *(_DWORD *)Buffer = ExtendedContextLength;
      if( ExtendedContextLength >= 0 )
      {
        v6 = (char *)((*(_QWORD *)&Buffer[152] - v3) & 0xFFFFFFFFFFFFFFF0ui64);
        *(_QWORD *)&Buffer[344] = v6 - 40;
        PspCreateUserContext((INT64)&Buffer[192], 0, PspLoaderInitRoutine, (INT64)v6, (INT64)PspSystemDlls[5].Object);
        InstrumentationCallback = CurrentThread->Tcb.ApcState.Process->Pcb.InstrumentationCallback;
        if( InstrumentationCallback )
        {
          *(_QWORD *)&Buffer[392] = *(_QWORD *)&Buffer[440];
          *(_QWORD *)&Buffer[440] = InstrumentationCallback;
        }
        v8 = (__int64)v6;
        if( (unsigned __int64)(v3 - 1) > 0xFFE )
        {
          ProbeForWrite((UINT64)v6, v3, 16i64);
        }
        else
        {
          if( (unsigned __int64)v6 >= 0x7FFFFFFF0000i64 )
            v8 = 0x7FFFFFFF0000i64;
          *(_BYTE *)v8 = *(_BYTE *)v8;
          *(_BYTE *)(v8 + v3 - 1) = *(_BYTE *)(v8 + v3 - 1);
        }
        ExtendedContextLength = RtlInitializeExtendedContext(v6, v1, (_CONTEXT_EX **)&Buffer[16]);
        *(_DWORD *)Buffer = ExtendedContextLength;
        if( ExtendedContextLength >= 0 )
        {
          ExtendedContextLength = RtlCopyContext((_X86_NT5_CONTEXT *)v6, v1, (_X86_NT5_CONTEXT *)Buffer);
          *(_DWORD *)Buffer = ExtendedContextLength;
          if( ExtendedContextLength >= 0 )
            KePopulateContinuationContext(*(INT64 *)&Buffer[248]);
        }
        if( ExtendedContextLength >= 0 )
          ExtendedContextLength = PspSetContextThreadInternal(CurrentThread, (_CONTEXT *)&Buffer[192], 0, 1, 2u);
      }
    }
  }
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( ExtendedContextLength < 0 )
  {
    *(_DWORD *)&Buffer[36] = 0;
    *(_QWORD *)&Buffer[48] = PspLoaderInitRoutine;
    *(_DWORD *)&Buffer[32] = ExtendedContextLength;
    *(_DWORD *)&Buffer[56] = 0;
    *(_QWORD *)&Buffer[40] = 0i64;
    InitialStack = (_KTRAP_FRAME *)CurrentThread->Tcb.InitialStack;
    for( i = InitialStack; (i->P2Home & 1) != 0; i = *(_KTRAP_FRAME **)&i->PreviousMode )
      ;
    if( (InitialStack->P2Home & 1) != 0 )
    {
      do
        InitialStack = *(_KTRAP_FRAME **)&InitialStack->PreviousMode;
      while( (InitialStack->P2Home & 1) != 0 );
    }
    LOBYTE(v9) = 1;
    KiDispatchException((PEXCEPTION_RECORD)&Buffer[32], (PKEXCEPTION_FRAME)&InitialStack[-2]._R9, i - 1, v9, 0);
  }
}

Referenced by:

PspUserThreadStartup