KiAttachProcess

VOID __stdcall KiAttachProcess(
        _ETHREAD *Thread,
        _EPROCESS *Process,
        UINT8 OldIrql,
        UINT64 Force,
        _KAPC_STATE *SavedApcState){
  _KAPC_STATE *v5; 
  $F25F8C4BA33AF922A5F1AF68CD89DDDF *v6; 
  char v8; 
  unsigned __int64 v9; 
  _LIST_ENTRY *Flink; 
  $F25F8C4BA33AF922A5F1AF68CD89DDDF *v12; 
  _LIST_ENTRY *v13; 
  int v14; 
  struct _KPRCB *v15; 
  _EPROCESS *v16; 
  unsigned __int64 GroupIndex; 
  __int64 v18; 
  unsigned __int64 DirectoryTableBase; 
  unsigned __int64 v20; 
  struct _KPRCB *CurrentPrcb; 
  _LIST_ENTRY *v22; 
  _LIST_ENTRY *Blink; 
  _DWORD *SchedulerAssist; 
  int v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  UINT64 SpinCount; 

  v5 = SavedApcState;
  v6 = &Thread->Tcb.152;
  v8 = Force;
  v9 = OldIrql;
  SavedApcState->Process = Thread->Tcb.ApcState.Process;
  *(_WORD *)&v5->InProgressFlags = *(_WORD *)&Thread->Tcb.ApcStateFill[40];
  v5->UserApcPendingAll = Thread->Tcb.ApcState.UserApcPendingAll;
  Flink = Thread->Tcb.ApcState.ApcListHead[0].Flink;
  if( Flink == (_LIST_ENTRY *)v6 )
  {
    v5->ApcListHead[0].Blink = (_LIST_ENTRY *)v5;
    v5->ApcListHead[0].Flink = (_LIST_ENTRY *)v5;
    v5->KernelApcPending = 0;
  }
  else
  {
    Blink = v6->ApcState.ApcListHead[0].Blink;
    v5->ApcListHead[0].Flink = Flink;
    v5->ApcListHead[0].Blink = Blink;
    Flink->Blink = (_LIST_ENTRY *)v5;
    Blink->Flink = (_LIST_ENTRY *)v5;
  }
  v12 = ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v6->ApcState.ApcListHead[1].Flink;
  v13 = &v5->ApcListHead[1];
  if( v12 == ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)&v6->ApcStateFill[16] )
  {
    v5->ApcListHead[1].Blink = &v5->ApcListHead[1];
    v13->Flink = v13;
    v5->UserApcPendingAll = 0;
  }
  else
  {
    v22 = v6->ApcState.ApcListHead[1].Blink;
    v13->Flink = (_LIST_ENTRY *)v12;
    v5->ApcListHead[1].Blink = v22;
    v12->ApcState.ApcListHead[0].Blink = v13;
    v22->Flink = v13;
  }
  v6->ApcState.ApcListHead[0].Blink = (_LIST_ENTRY *)v6;
  Thread->Tcb.ApcState.ApcListHead[1].Blink = &Thread->Tcb.ApcState.ApcListHead[1];
  Thread->Tcb.ApcState.ApcListHead[1].Flink = &Thread->Tcb.ApcState.ApcListHead[1];
  v6->ApcState.ApcListHead[0].Flink = (_LIST_ENTRY *)v6;
  *(_WORD *)&Thread->Tcb.ApcStateFill[40] = 0;
  Thread->Tcb.ApcState.UserApcPendingAll = 0;
  if( v5 == (_KAPC_STATE *)&Thread->Tcb.600 )
    Thread->Tcb.ApcStateIndex = 1;
  if( (Force & 1) == 0 && (_InterlockedExchangeAdd(&Process->Pcb.StackCount.Value, 8u) & 7) != 0 )
  {
    KiReleaseThreadLockSafe((INT64)Thread);
    KiInSwapSingleProcess(Thread, Process, v9);
    KeGetCurrentIrql();
    __writecr8(2ui64);
    CurrentPrcb = KeGetCurrentPrcb();
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( Thread->Tcb.ThreadLock );
      SchedulerAssist = CurrentPrcb->SchedulerAssist;
      if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
      {
        v25 = SchedulerAssist[6] + 1;
        SchedulerAssist[6] = v25;
      }
    }
  }
  Thread->Tcb._bf_0 |= 0x800u;
  Thread->Tcb.ApcState.Process = Process;
  v14 = v8 & 2;
  if( !v14 )
    Thread->Tcb.ThreadLock = 0i64;
  v15 = KeGetCurrentPrcb();
  v16 = v5->Process;
  GroupIndex = v15->GroupIndex;
  v18 = 8i64 * v15->Group + 376;
  _interlockedbittestandset64((volatile signed __int32 *)&Process->Pcb.gap0[v18], GroupIndex);
  DirectoryTableBase = Process->Pcb.DirectoryTableBase;
  if( KiKvaShadow )
  {
    v20 = Process->Pcb.DirectoryTableBase;
    if( (DirectoryTableBase & 2) != 0 )
      v20 = DirectoryTableBase | 0x8000000000000000ui64;
    __writegsqword(0x9000u, v20);
    KiSetAddressPolicy(Process->Pcb.AddressPolicy);
  }
  __writecr3(DirectoryTableBase);
  if( !KiFlushPcid && KiKvaShadow )
  {
    v26 = __readcr4();
    if( (v26 & 0x20080) != 0 )
    {
      __writecr4(v26 ^ 0x80);
      __writecr4(v26);
    }
    else
    {
      v27 = __readcr3();
      __writecr3(v27);
    }
  }
  _interlockedbittestandreset64((volatile signed __int32 *)&v16->Pcb.gap0[v18], GroupIndex);
  Thread->Tcb._bf_0 &= ~0x800u;
  if( !v14 )
    __writecr8(v9);
}

Referenced by:

KeAttachProcess
KeStackAttachProcess
KiStackAttachProcess
MiTrimOrAgeWorkingSet