PspThreadDelete

NTSTATUS __stdcall PspThreadDelete(PVOID P){
  INT64 v2; 
  void *v3; 
  char *v4; 
  char *v5; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TABLE_ENTRY *v7; 
  void *v8; 
  UINT64 UnbiasedInterruptTime; 
  __int64 v10; 
  unsigned __int64 v11; 
  __int64 *v12; 
  __int64 v13; 
  __int64 v14; 
  int v15; 
  _QWORD *v16; 
  char *v17; 
  __int64 v18; 
  __int64 v19; 
  UINT64 v20; 
  unsigned __int64 v21; 
  volatile INT64 *v22; 
  char *v23; 
  __int64 v24; 
  char **v25; 
  ULONG_PTR BugCheckParameter4; 
  INT64 v28; 
  void *v29; 
  KeCleanupThreadState((_KTHREAD *)P);
  if( *((_DWORD *)P + 343) )
    KeBugCheckEx(0x94u, 1ui64, (ULONG_PTR)P, *((unsigned int *)P + 343), 0i64);
  if( *((_DWORD *)P + 340) )
    KeBugCheckEx(0x13Cu, (ULONG_PTR)P, *((unsigned int *)P + 340), 0i64, 0i64);
  if( *((_DWORD *)P + 341) )
    KeBugCheckEx(0x13Cu, (ULONG_PTR)P, *((unsigned int *)P + 341), 1ui64, 0i64);
  if( *((_DWORD *)P + 342) )
    KeBugCheckEx(0x13Cu, (ULONG_PTR)P, *((unsigned int *)P + 342), 2ui64, 0i64);
  v4 = (char *)*((_QWORD *)P + 197);
  if( v4 != (char *)P + 1576 )
    KeBugCheckEx(0x1C6u, 0x14ui64, (ULONG_PTR)P, (ULONG_PTR)v4, 0i64);
  v5 = (char *)*((_QWORD *)P + 200);
  if( v5 != (char *)P + 1600 )
    KeBugCheckEx(0x1C6u, 0x15ui64, (ULONG_PTR)P, (ULONG_PTR)v5, 0i64);
  if( *((_QWORD *)P + 5) )
    KeEnumerateKernelStackSegments(P, (__int64(__fastcall *)(__int64, __int128 *, __int64))PspDeleteKernelStack, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( *((_QWORD *)P + 144) )
  {
    --*((_WORD *)CurrentThread + 242);
    v7 = ExMapHandleToPointer(PspCidTable, *((VOID **)P + 144), v3, (INT64)v5, BugCheckParameter4, v28, v29);
    if( !v7 )
      KeBugCheck(0x17ui64);
    ExDestroyHandle(PspCidTable, *((VOID **)P + 144), v7);
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
  }
  PspDeleteThreadSecurity((INT64)P, v2, (INT64)v3);
  v8 = (void *)*((_QWORD *)P + 194);
  if( v8 )
    ExFreePoolWithTag(v8, 0x6D4E6854u);
  UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
  if( UnbiasedInterruptTime >= qword_140C4C3B0 )
  {
    v10 = qword_140C4C3A0;
    if( qword_140C4C3A0 )
    {
      if( (_DWORD)qword_140C4C3B8 )
      {
        v11 = 0i64;
        v12 = ObpObjectTypes;
        v13 = (unsigned int)qword_140C4C3B8;
        do
        {
          v14 = *v12;
          if( ((*(unsigned __int8 *)(*v12 + 66) >> 6) & 1) != _bittest64(&qword_140C4C3C0, v11) && !qword_140C4C370 )
          {
            qword_140C4C370 = (unsigned int)__ROL4__(1207959560, 133);
            xmmword_140C4C378 = 0i64;
            qword_140C4C388 = 268i64;
            qword_140C4C390 = v14;
          }
          ++v11;
          ++v12;
          --v13;
        }
        while( v13 );
        v10 = qword_140C4C3A0;
      }
      v15 = 64;
      v16 = (_QWORD *)(qword_140C4C3E0 + 112);
      v17 = (char *)(qword_140C4C3E0 + 112);
      if( qword_140C4C3E0 + 112 < (unsigned __int64)(qword_140C4C3E0 + 176) )
      {
        do
        {
          _mm_prefetchnta(v17);
          v17 += 64;
        }
        while( (unsigned __int64)v17 < qword_140C4C3E0 + 176 );
      }
      v18 = 8i64;
      do
      {
        v10 = __ROR8__(v10 - *v16++, qword_140C4C3A8);
        v15 -= 8;
        --v18;
      }
      while( v18 );
      for( ; v15; --v15 )
      {
        v19 = *(unsigned __int8 *)v16;
        v16 = (_QWORD *)((char *)v16 + 1);
        v10 = __ROR8__(v10 - v19, qword_140C4C3A8);
      }
      if( qword_140C4C3E8 != v10 )
      {
        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:
      v20 = KiQueryUnbiasedInterruptTime(1u);
      v21 = 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64;
      LODWORD(UnbiasedInterruptTime) = v20 + v21 + 237191168;
      qword_140C4C3B0 = v20 + v21 + 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(&stru_140C4C330, 0i64, 0i64);
    goto LABEL_31;
  }
LABEL_32:
  v22 = (volatile INT64 *)*((_QWORD *)P + 68);
  if( v22 )
  {
    v23 = (char *)P + 1256;
    if( *((_QWORD *)P + 157) )
    {
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx((UINT64)(v22 + 135), 0i64);
      ExAcquirePushLockExclusiveEx((UINT64)(v22 + 268), 0i64);
      KeFoldProcessStatisticsThread((__int64)P);
      v24 = *(_QWORD *)v23;
      if( *(char **)(*(_QWORD *)v23 + 8i64) != v23 || (v25 = (char **)*((_QWORD *)P + 158), *v25 != v23) )
        __fastfail(3u);
      *v25 = (char *)v24;
      *(_QWORD *)(v24 + 8) = v25;
      if( (_InterlockedExchangeAdd64(v22 + 268, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v22 + 268);
      KeAbPostRelease((PVOID)(v22 + 268));
      if( (_InterlockedExchangeAdd64(v22 + 135, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v22 + 135);
      KeAbPostRelease((PVOID)(v22 + 135));
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
    }
    if( (*((_DWORD *)P + 324) & 0x100000) != 0 )
      ((void(__fastcall *)(PVOID))xmmword_140C1DE50)(P);
    LODWORD(UnbiasedInterruptTime) = ObfDereferenceObjectWithTag((PVOID)v22, 0x72437350ui64);
  }
  return UnbiasedInterruptTime;
}

Referenced by:

No references.