PsGetThreadProperty

PVOID __stdcall PsGetThreadProperty(_ETHREAD *Thread, ULONG_PTR Key, ULONG Flags){
  void *v3; 
  char v4; 
  _QWORD *v7; 
  UINT64 *v8; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v10; 
  _QWORD *v11; 
  __int64 v12; 
  _EJOB *v14; 
  void *v15; 
  v3 = 0i64;
  v4 = Flags;
  if( (Flags & 0xFFFFFFFE) != 0
    || Thread == *((_ETHREAD **)KeGetCurrentPrcb() + 3)
    || KeGetCurrentIrql() < 2u
    && (POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *((unsigned __int8 *)Thread - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Thread - 48) >> 8)] != PsThreadType
    || Thread == (_ETHREAD *)KeGetCurrentThread() && (*((_DWORD *)KeGetPcr() + 3243) & 0x10001) != 0 )
  {
    return 0i64;
  }
  v7 = (_QWORD *)((char *)Thread + 1480);
  v8 = (UINT64 *)((char *)Thread + 1496);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( _interlockedbittestandset64((volatile signed __int32 *)Thread + 374, 0i64) )
    KxWaitForSpinLockAndAcquire(v8);
  v10 = (_QWORD *)*v7;
  v11 = 0i64;
  if( (_QWORD *)*v7 != v7 )
  {
    while( v10[2] != Key )
    {
      v10 = (_QWORD *)*v10;
      if( v10 == v7 )
        goto LABEL_15;
    }
    v11 = v10;
    if( v10 )
    {
      v12 = v10[3];
      if( ObpTraceFlags )
        ObpPushStackInfo(v12 - 48, 1, 1i64, 1917875024i64);
      ObpIncrPointerCount((volatile INT64 *)(v12 - 48));
    }
  }
LABEL_15:
  _InterlockedAnd64((volatile signed __int64 *)v8, 0i64);
  __writecr8(CurrentIrql);
  if( v11 )
    return(PVOID)v11[3];
  if( (v4 & 1) == 0 )
  {
    v14 = (_EJOB *)*((_QWORD *)Thread + 193);
    if( v14 == (_EJOB *)-3i64 )
      v14 = *(_EJOB **)(*((_QWORD *)Thread + 68) + 1296i64);
    if( v14 )
    {
      LODWORD(v15) = PsGetJobProperty(v14, Key);
      return v15;
    }
  }
  return v3;
}

Referenced by:

No references.