ObpDecrementHandleCount
void __fastcall ObpDecrementHandleCount(ULONG_PTR BugCheckParameter1, __int64 a2){
unsigned __int64 v4;
__int64 v5;
signed __int64 v6;
_ETHREAD *CurrentThread;
void(__fastcall *v8)(ULONG_PTR, __int64, _QWORD, signed __int64);
char v9;
_EJOB *v10;
_EJOB *ProcessServerSilo;
_KAPC_STATE ApcState;
v4 = (unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(a2 + 24) ^ (unsigned __int64)BYTE1(a2);
memset(&ApcState, 0, sizeof(ApcState));
v5 = ObTypeIndexTable[v4];
if( (*(_BYTE *)(v5 + 66) & 0x10) != 0 || (*(_BYTE *)(a2 + 27) & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a2 + 16, 0i64);
v6 = *(_QWORD *)(a2 + 8);
if( _InterlockedExchangeAdd64((volatile signed __int64 *)(a2 + 8), 0xFFFFFFFFFFFFFFFFui64) == 1
&& (*(_BYTE *)(a2 + 27) & 8) != 0 )
{
*(_QWORD *)(a2 - *((unsigned __int8 *)ObpInfoMaskToOffset + (*(_BYTE *)(a2 + 26) & 0x1F))) = 0i64;
}
if( (*(_BYTE *)(v5 + 66) & 0x10) != 0 )
ObpReleaseHandleInfo(a2);
ExReleasePushLockEx(a2 + 16, 0i64);
KeLeaveCriticalRegion();
}
else
{
v6 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a2 + 8), 0xFFFFFFFFFFFFFFFFui64);
}
v8 = *(void(__fastcall **)(ULONG_PTR, __int64, _QWORD, signed __int64))(v5 + 128);
if( v8 )
{
v9 = 0;
v10 = 0i64;
if( *((_QWORD *)KeGetCurrentThread() + 23) != BugCheckParameter1 )
{
v9 = 1;
ProcessServerSilo = (_EJOB *)PsGetProcessServerSilo(BugCheckParameter1);
v10 = PsAttachSiloToCurrentThread(ProcessServerSilo);
KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
v8 = *(void(__fastcall **)(ULONG_PTR, __int64, _QWORD, signed __int64))(v5 + 128);
}
v8(BugCheckParameter1, a2 + 48, 0i64, v6);
if( v9 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
PsDetachSiloFromCurrentThread(v10);
}
}
if( v6 == 1 )
ObpDeleteNameCheck(a2);
_InterlockedAdd((volatile signed __int32 *)(v5 + 48), 0xFFFFFFFF);
}Referenced by:
AlpcHandleDataDestroyProcedure
ObCompleteObjectDuplication
ObpCreateHandle
ObpInsertOrLocateNamedObject