PspThreadDelete

VOID __fastcall PspThreadDelete(VOID *Object){
  VOID *v2; 
  char *v3; 
  _KERNEL_STACK_SEGMENT *v4; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TABLE_ENTRY *v6; 
  void *v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  char *v10; 
  __int64 v11; 
  __int64 v12; 
  int v13; 
  _QWORD *v14; 
  char *v15; 
  __int64 v16; 
  __int64 v17; 
  _EX_PUSH_LOCK *v18; 
  char *v19; 
  __int64 v20; 
  char **v21; 
  VOID *BugCheckParameter4; 
  VOID *v23; 
  void *v24; 

  KeCleanupThreadState((_KTHREAD *)Object);
  if( *((_DWORD *)Object + 343) )
    KeBugCheckEx(0x94u, (PVOID)1, Object, (PVOID)*((unsigned int *)Object + 343), 0i64);
  if( *((_DWORD *)Object + 340) )
    KeBugCheckEx(0x13Cu, Object, (PVOID)*((unsigned int *)Object + 340), 0i64, 0i64);
  if( *((_DWORD *)Object + 341) )
    KeBugCheckEx(0x13Cu, Object, (PVOID)*((unsigned int *)Object + 341), (PVOID)1, 0i64);
  if( *((_DWORD *)Object + 342) )
    KeBugCheckEx(0x13Cu, Object, (PVOID)*((unsigned int *)Object + 342), (PVOID)2, 0i64);
  v3 = (char *)*((_QWORD *)Object + 197);
  if( v3 != (char *)Object + 1576 )
    KeBugCheckEx(0x1C6u, (PVOID)0x14, Object, v3, 0i64);
  v4 = (_KERNEL_STACK_SEGMENT *)*((_QWORD *)Object + 200);
  if( v4 != (_KERNEL_STACK_SEGMENT *)((char *)Object + 1600) )
    KeBugCheckEx(0x1C6u, (PVOID)0x15, Object, v4, 0i64);
  if( *((_QWORD *)Object + 5) )
    KeEnumerateKernelStackSegments((_ETHREAD *)Object, PspDeleteKernelStack, 0i64, v4, BugCheckParameter4, v23);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( *((_QWORD *)Object + 144) )
  {
    --CurrentThread->Tcb.KernelApcDisable;
    v6 = ExMapHandleToPointer(PspCidTable, *((VOID **)Object + 144), v2, (INT64)v4, BugCheckParameter4, (INT64)v23, v24);
    if( !v6 )
      KeBugCheck(0x17u);
    ExDestroyHandle(PspCidTable, *((VOID **)Object + 144), v6);
    KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  }
  PspDeleteThreadSecurity((_ETHREAD *)Object);
  v7 = (void *)*((_QWORD *)Object + 194);
  if( v7 )
    ExFreePoolWithTag(v7, 0x6D4E6854u);
  if( KiQueryUnbiasedInterruptTime(1u) >= qword_140C4C3B0 )
  {
    v8 = qword_140C4C3A0;
    if( qword_140C4C3A0 )
    {
      if( (_DWORD)qword_140C4C3B8 )
      {
        v9 = 0i64;
        v10 = (char *)&stru_140C23628 + 6712;
        v11 = (unsigned int)qword_140C4C3B8;
        do
        {
          v12 = *(_QWORD *)v10;
          if( ((*(unsigned __int8 *)(*(_QWORD *)v10 + 66i64) >> 6) & 1) != _bittest64(&qword_140C4C3C0, v9)
            && !qword_140C4C370 )
          {
            qword_140C4C370 = (unsigned int)__ROL4__(1207959560, 133);
            xmmword_140C4C378 = 0i64;
            qword_140C4C388 = 268i64;
            qword_140C4C390 = v12;
          }
          ++v9;
          v10 += 8;
          --v11;
        }
        while( v11 );
        v8 = qword_140C4C3A0;
      }
      v13 = 64;
      v14 = (_QWORD *)(qword_140C4C3E0 + 112);
      v15 = (char *)(qword_140C4C3E0 + 112);
      if( qword_140C4C3E0 + 112 < (unsigned __int64)(qword_140C4C3E0 + 176) )
      {
        do
        {
          _mm_prefetchnta(v15);
          v15 += 64;
        }
        while( (unsigned __int64)v15 < qword_140C4C3E0 + 176 );
      }
      v16 = 8i64;
      do
      {
        v8 = __ROR8__(v8 - *v14++, qword_140C4C3A8);
        v13 -= 8;
        --v16;
      }
      while( v16 );
      for( ; v13; --v13 )
      {
        v17 = *(unsigned __int8 *)v14;
        v14 = (_QWORD *)((char *)v14 + 1);
        v8 = __ROR8__(v8 - v17, qword_140C4C3A8);
      }
      if( qword_140C4C3E8 != v8 )
      {
        if( qword_140C4C370 )
          goto LABEL_45;
        qword_140C4C370 = (unsigned int)__ROR4__(150994945, 152);
        xmmword_140C4C378 = 0i64;
        qword_140C4C388 = 268i64;
        qword_140C4C390 = qword_140C4C3E0;
      }
    }
    if( !qword_140C4C370 )
    {
LABEL_31:
      qword_140C4C3B0 = KiQueryUnbiasedInterruptTime(1u)
                      + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64
                      + 288000000000i64;
      goto LABEL_32;
    }
LABEL_45:
    if( (VOID(__stdcall *)(_KDPC *, PVOID, PVOID, PVOID))stru_140C4C330.DeferredRoutine != KiScanQueues )
      KeInitializeDpc(&stru_140C4C330, KiScanQueues, &stru_140C4C330);
    qword_140C4C398 = 1934400i64;
    KeInsertQueueDpc((UINT64)&stru_140C4C330, 0i64, 0i64);
    goto LABEL_31;
  }
LABEL_32:
  v18 = (_EX_PUSH_LOCK *)*((_QWORD *)Object + 68);
  if( v18 )
  {
    v19 = (char *)Object + 1256;
    if( *((_QWORD *)Object + 157) )
    {
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(v18 + 135, 0i64);
      ExAcquirePushLockExclusiveEx(v18 + 268, 0i64);
      KeFoldProcessStatisticsThread((_KTHREAD *)Object);
      v20 = *(_QWORD *)v19;
      if( *(char **)(*(_QWORD *)v19 + 8i64) != v19 || (v21 = (char **)*((_QWORD *)Object + 158), *v21 != v19) )
        __fastfail(3u);
      *v21 = (char *)v20;
      *(_QWORD *)(v20 + 8) = v21;
      if( (_InterlockedExchangeAdd64(&v18[268]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v18 + 268);
      KeAbPostRelease(&v18[268]);
      if( (_InterlockedExchangeAdd64(&v18[135]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v18 + 135);
      KeAbPostRelease(&v18[135]);
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
    }
    if( (*((_DWORD *)Object + 324) & 0x100000) != 0 )
      ((void(__fastcall *)(VOID *))xmmword_140C1DE50)(Object);
    ObfDereferenceObjectWithTag(v18, 0x72437350ui64);
  }
}

Referenced by:

No references.