PspUserThreadStartup

VOID __stdcall PspUserThreadStartup(PKSTART_ROUTINE StartRoutine, PVOID StartContext){
  _ETHREAD *CurrentThread; 
  __int64 v3; 
  int SessionLocaleId; 
  __int64 v5; 
  struct _KPRCB *CurrentPrcb; 
  ULONG LowPart; 
  int v8; 
  unsigned __int64 v9; 
  int v10; 
  _LARGE_INTEGER CurrentTime; 
  __int64 v12; 
  _ETHREAD *v13; 
  INT64 result[14]; 
  CurrentTime.QuadPart = 0i64;
  __writecr8(0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v13 = CurrentThread;
  PspDisablePrimaryTokenExchange((__int64)CurrentThread);
  if( (*((_DWORD *)CurrentThread + 324) & 2) == 0 )
    PspTerminateThreadByPointer((ULONG_PTR)CurrentThread, -1073741749, 1);
  v3 = *((_QWORD *)CurrentThread + 23);
  v12 = v3;
  if( (*(_DWORD *)(v3 + 2172) & 1) != 0 )
  {
    DbgkCreateMinimalThread((PETHREAD)CurrentThread);
  }
  else
  {
    SessionLocaleId = MmGetSessionLocaleId();
    *(_DWORD *)(v5 + 264) = SessionLocaleId;
    PspWriteTebIdealProcessor((__int64)CurrentThread, (__int64)CurrentThread);
    DbgkCreateThread(CurrentThread);
    if( (*(_DWORD *)(v3 + 1124) & 0x80000) == 0
      && !_interlockedbittestandset((volatile signed __int32 *)(v3 + 1124), 0x13u) )
    {
      PfProcessCreateNotification(v3, *(_QWORD *)(v3 + 1304));
    }
  }
  while( !KUSER_SHARED_DATA.Cookie )
  {
    KeQuerySystemTimePrecise(&CurrentTime);
    CurrentPrcb = KeGetCurrentPrcb();
    LowPart = KeQueryPerformanceCounter(0i64).LowPart;
    v8 = ExGenRandom(1i64);
    v9 = __rdtsc();
    _InterlockedCompareExchange(
      (volatile signed __int32 *)&KUSER_SHARED_DATA.Cookie,
      CurrentTime.LowPart ^ CurrentTime.HighPart ^ LowPart ^ v9 ^ v8 ^ *((_DWORD *)CurrentPrcb + 2884) ^ *((_DWORD *)CurrentPrcb + 8096) ^ *((_DWORD *)CurrentPrcb + 8100),
      0);
  }
  if( (*(_BYTE *)(v3 + 992) & 1) != 0 )
  {
    *((_DWORD *)CurrentThread + 325) |= 0x200u;
    memset((INT64)result, 0i64);
    v10 = VslpEnterIumSecureMode(0, 0, *((unsigned int *)KeGetCurrentThread() + 199), (INT64)result);
    PspTerminateThreadByPointer((ULONG_PTR)CurrentThread, v10, 1);
  }
  else if( (*((_DWORD *)CurrentThread + 324) & 1) != 0 )
  {
    KeWaitForSingleObject(CurrentThread, UserRequest, 1, 0, 0i64);
  }
  else if( (*(_DWORD *)(v3 + 2172) & 1) == 0 )
  {
    PspInitializeThunkContext();
  }
}

Referenced by:

No references.