PsGetThreadProperty

VOID *__stdcall PsGetThreadProperty(PETHREAD Thread, ULONG_PTR Key, UINT64 Flags){
  VOID *v3; 
  char v4; 
  UINT64 v5; 
  _PS_PROPERTY_SET *p_PropertySet; 
  unsigned __int64 *p_Lock; 
  unsigned __int8 CurrentIrql; 
  _PS_PROPERTY_SET *Flink; 
  _PS_PROPERTY_SET *v11; 
  _LIST_ENTRY *v12; 
  _EJOB *Silo; 

  v3 = 0i64;
  v4 = Flags;
  v5 = *(_QWORD *)&Key;
  if( (Flags & 0xFFFFFFFE) != 0
    || Thread == KeGetCurrentPrcb()->IdleThread
    || KeGetCurrentIrql() < 2u
    && (POBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(Thread[-1].LockEntries[5].EntryLock) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Thread - 48) >> 8)] != PsThreadType
    || Thread == (PETHREAD)KeGetCurrentThread() && (KeGetPcr()->Prcb._bf_0 & 0x10001) != 0 )
  {
    return 0i64;
  }
  p_PropertySet = &Thread->PropertySet;
  p_Lock = &Thread->PropertySet.Lock;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  if( _interlockedbittestandset64((volatile signed __int32 *)&Thread->PropertySet.Lock, 0i64) )
    KxWaitForSpinLockAndAcquire(p_Lock);
  Flink = (_PS_PROPERTY_SET *)p_PropertySet->ListHead.Flink;
  v11 = 0i64;
  if( (_PS_PROPERTY_SET *)p_PropertySet->ListHead.Flink != p_PropertySet )
  {
    while( Flink->Lock != v5 )
    {
      Flink = (_PS_PROPERTY_SET *)Flink->ListHead.Flink;
      if( Flink == p_PropertySet )
        goto LABEL_15;
    }
    v11 = Flink;
    if( Flink )
    {
      v12 = Flink[1].ListHead.Flink;
      if( ObpTraceFlags )
        ObpPushStackInfo((_OBJECT_HEADER *)&v12[-3], 1u, 1ui64, 0x72507350ui64);
      ObpIncrPointerCount((_OBJECT_HEADER *)&v12[-3]);
    }
  }
LABEL_15:
  _InterlockedAnd64((volatile signed __int64 *)p_Lock, 0i64);
  __writecr8(CurrentIrql);
  if( v11 )
    return v11[1].ListHead.Flink;
  if( (v4 & 1) == 0 )
  {
    Silo = Thread->Silo;
    if( Silo == (_EJOB *)-3i64 )
      Silo = Thread->Tcb.Process->Job;
    if( Silo )
      return PsGetJobProperty(Silo, v5);
  }
  return v3;
}

Referenced by:

No references.