PspWriteTebIdealProcessor

VOID __stdcall PspWriteTebIdealProcessor(_ETHREAD *CurrentThread, _ETHREAD *TargetThread){
  __int64 v4; 
  _PROCESSOR_NUMBER *v5; 
  _PROCESSOR_NUMBER *Teb; 
  _EPROCESS *Process; 
  _EWOW64PROCESS *WoW64Process; 
  char v9; 
  char v10; 
  _PROCESSOR_NUMBER *v11; 
  _PROCESSOR_NUMBER *i; 
  _PROCESSOR_NUMBER v13; 
  __int64 v14; 
  int v15[8]; 
  char v16; 
  char v17; 
  _PROCESSOR_NUMBER ProcNumber; 
  _PROCESSOR_NUMBER v19; 
  _PROCESSOR_NUMBER *v20; 
  __int64 v21; 
  __int64 v22; 
  _PROCESSOR_NUMBER *p_ProcNumber; 
  _PROCESSOR_NUMBER *v24; 
  _ETHREAD *v25; 
  _KAPC_STATE ApcState; 

  v25 = TargetThread;
  memset(&ApcState, 0, sizeof(ApcState));
  ProcNumber = 0;
  v19 = 0;
  v4 = 0i64;
  v21 = 0i64;
  v5 = 0i64;
  v22 = 0i64;
  Teb = (_PROCESSOR_NUMBER *)TargetThread->Tcb.Teb;
  v20 = Teb;
  v24 = Teb;
  Process = TargetThread->Tcb.Process;
  p_ProcNumber = &ProcNumber;
  WoW64Process = Process->WoW64Process;
  if( WoW64Process )
  {
    v14 = (__int64)&Teb[2048];
    if( WoW64Process->Machine == 0x8664 )
    {
      v5 = (_PROCESSOR_NUMBER *)v14;
      v22 = v14;
    }
    else
    {
      v4 = v14;
      v21 = v14;
    }
  }
  v9 = 0;
  v17 = 0;
  if( TargetThread != CurrentThread )
  {
    if( !ExAcquireRundownProtection(&TargetThread->RundownProtect) )
      return;
    v9 = 1;
    v17 = 1;
  }
  v10 = 0;
  v16 = 0;
  if( Process != CurrentThread->Tcb.ApcState.Process )
  {
    KiStackAttachProcess(Process, 0i64, &ApcState);
    v10 = 1;
    v16 = 1;
  }
  KeGetProcessorNumberFromIndex(TargetThread->Tcb.UserIdealProcessor, &ProcNumber);
  v11 = v20;
  for( i = p_ProcNumber; ; *i = v19 )
  {
    ProcNumber.Reserved = ProcNumber.Number;
    v13 = ProcNumber;
    v11[1489] = ProcNumber;
    if( v5 )
      v5[1489] = v13;
    if( v4 )
    {
      LOWORD(v20) = v13.Group;
      BYTE2(v20) = v13.Number & 0x1F;
      BYTE3(v20) = v13.Reserved & 0x1F;
      *(_DWORD *)(v4 + 3956) = (_DWORD)v20;
    }
    _InterlockedOr(v15, 0);
    KeGetProcessorNumberFromIndex(TargetThread->Tcb.UserIdealProcessor, &v19);
    if( v19.Group == ProcNumber.Group && v19.Number == ProcNumber.Number )
      break;
  }
  if( v10 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  if( v9 )
    ExReleaseRundownProtection(&TargetThread->RundownProtect);
}

Referenced by:

NtSetInformationThread
PspUserThreadStartup