ObSetHandleAttributes
__int64 __fastcall ObSetHandleAttributes(unsigned __int64 a1, _BYTE *a2, char a3){
unsigned __int64 v4;
char v5;
char v6;
__int64 v7;
void *v8;
INT64 v9;
_HANDLE_TABLE *v10;
_ETHREAD *CurrentThread;
_HANDLE_TABLE_ENTRY *v12;
volatile signed __int64 *p_VolatileLowValue;
unsigned __int64 v14;
int v15;
unsigned int v16;
int v18[8];
_KAPC_STATE decode_size;
memset(&decode_size, 0, sizeof(decode_size));
v4 = a1;
v5 = 0;
v6 = 0;
v7 = *((_QWORD *)KeGetCurrentThread() + 23);
if( ObpIsKernelHandle((PVOID)a1, a3) )
{
v4 ^= 0xFFFFFFFF80000000ui64;
v10 = (_HANDLE_TABLE *)ObpKernelHandleTable;
if( (PEPROCESS)v7 != PsInitialSystemProcess )
{
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &decode_size);
v5 = 1;
}
}
else if( *((_BYTE *)KeGetCurrentThread() + 586) == 1 )
{
v10 = (_HANDLE_TABLE *)ObReferenceProcessHandleTable((struct _EX_RUNDOWN_REF *)v7);
if( !v10 )
return 3221225480i64;
v6 = 1;
}
else
{
v10 = *(_HANDLE_TABLE **)(*((_QWORD *)KeGetCurrentThread() + 23) + 1392i64);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v12 = ExMapHandleToPointer(
v10,
(VOID *)v4,
v8,
v9,
(INT64)decode_size.ApcListHead[0].Flink,
(INT64)decode_size.ApcListHead[0].Blink,
decode_size.ApcListHead[1].Flink);
p_VolatileLowValue = &v12->VolatileLowValue;
if( v12 )
{
v14 = (v12->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64;
if( !*a2
|| (*(_DWORD *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(v14 + 24) ^ (unsigned __int64)BYTE1(v14)]
+ 72) & 2) == 0 )
{
v15 = (*a2 != 0 ? 2 : 0) | 1;
if( !a2[1] )
v15 = *a2 != 0 ? 2 : 0;
ExSetHandleAttributes((__int64)p_VolatileLowValue, v15, 3);
}
_InterlockedExchangeAdd64(p_VolatileLowValue, 1ui64);
_InterlockedOr(v18, 0);
if( v10->HandleContentionEvent.Value )
ExfUnblockPushLock(&v10->HandleContentionEvent, 0i64);
v16 = 0;
}
else
{
v16 = -1073741790;
}
KeLeaveCriticalRegionThread((__int64)CurrentThread);
if( v5 )
KiUnstackDetachProcess(&decode_size, 0i64);
if( v6 )
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v7 + 1112));
return v16;
}Referenced by:
NtSetInformationObject