ObpDecrementHandleCount
VOID __stdcall ObpDecrementHandleCount(_EPROCESS *Process, _OBJECT_HEADER *ObjectHeader){
unsigned __int64 v4;
__int64 v5;
__int64 HandleCount;
_ETHREAD *CurrentThread;
void(__fastcall *v8)(_EPROCESS *, _QUAD *, _QWORD, __int64);
char v9;
_EJOB *v10;
INT64 v11;
_EJOB *v12;
UINT64 ProcessHandleCount;
_KAPC_STATE ApcState;
LODWORD(ProcessHandleCount) = 0;
v4 = (unsigned __int8)ObHeaderCookie ^ ObjectHeader->TypeIndex ^ (unsigned __int64)BYTE1(ObjectHeader);
memset(&ApcState, 0, sizeof(ApcState));
v5 = ObTypeIndexTable[v4];
if( (*(_BYTE *)(v5 + 66) & 0x10) != 0 || (ObjectHeader->Flags & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&ObjectHeader->Lock, 0i64);
HandleCount = ObjectHeader->HandleCount;
if( _InterlockedExchangeAdd64(&ObjectHeader->HandleCount, 0xFFFFFFFFFFFFFFFFui64) == 1
&& (ObjectHeader->Flags & 8) != 0 )
{
*(__int64 *)((char *)&ObjectHeader->PointerCount
- *((unsigned __int8 *)&dword_140C25D60 + (ObjectHeader->InfoMask & 0x1F))) = 0i64;
}
if( (*(_BYTE *)(v5 + 66) & 0x10) != 0 )
ObpReleaseHandleInfo(ObjectHeader, Process, &ProcessHandleCount);
ExReleasePushLockEx((_DWORD)ObjectHeader + 16, 0);
KeLeaveCriticalRegion();
}
else
{
HandleCount = _InterlockedExchangeAdd64(&ObjectHeader->HandleCount, 0xFFFFFFFFFFFFFFFFui64);
}
v8 = *(void(__fastcall **)(_EPROCESS *, _QUAD *, _QWORD, __int64))(v5 + 128);
if( v8 )
{
v9 = 0;
v10 = 0i64;
if( KeGetCurrentThread()->ApcState.Process != Process )
{
v9 = 1;
LODWORD(v11) = PsGetProcessServerSilo((INT64)Process);
LODWORD(v12) = PsAttachSiloToCurrentThread(v11);
v10 = v12;
KiStackAttachProcess(Process, 0i64, &ApcState);
v8 = *(void(__fastcall **)(_EPROCESS *, _QUAD *, _QWORD, __int64))(v5 + 128);
}
v8(Process, &ObjectHeader->Body, (unsigned int)ProcessHandleCount, HandleCount);
if( v9 )
{
KiUnstackDetachProcess(&ApcState, 0i64);
PsDetachSiloFromCurrentThread(v10);
}
}
if( HandleCount == 1 )
ObpDeleteNameCheck(ObjectHeader);
_InterlockedAdd((volatile signed __int32 *)(v5 + 48), 0xFFFFFFFF);
}Referenced by:
AlpcHandleDataDestroyProcedure
ObCompleteObjectDuplication
ObpCreateHandle
ObpInsertOrLocateNamedObject