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.