ObpReleaseHandleInfo
VOID __stdcall ObpReleaseHandleInfo(_OBJECT_HEADER *ObjectHeader, _EPROCESS *Process, UINT64 *ProcessHandleCount){
_OBJECT_HEADER_HANDLE_INFO *v3;
int *v4;
_OBJECT_HANDLE_COUNT_DATABASE *v5;
__int64 v6;
_OBJECT_HEADER_HANDLE_INFO *HandleCountEntries;
_OBJECT_HANDLE_COUNT_DATABASE *HandleCountDataBase;
unsigned int CountEntries;
int v10;
int v11;
v3 = OBJECT_HEADER_TO_HANDLE_INFO(ObjectHeader);
HandleCountEntries = v3;
if( (*(_BYTE *)(v6 + 27) & 0x40) != 0 )
{
v11 = *((_DWORD *)&v3->SingleEntry + 2);
*v4 = v11 & 0xFFFFFF;
*((_DWORD *)&v3->SingleEntry + 2) = v11 ^ (v11 ^ (v11 - 1)) & 0xFFFFFF;
}
else
{
HandleCountDataBase = v3->HandleCountDataBase;
CountEntries = HandleCountDataBase->CountEntries;
HandleCountEntries = (_OBJECT_HEADER_HANDLE_INFO *)HandleCountDataBase->HandleCountEntries;
if( HandleCountDataBase->CountEntries )
{
while( 1 )
{
v10 = *((_DWORD *)&HandleCountEntries->SingleEntry + 2);
if( (v10 & 0xFFFFFF) != 0 && HandleCountEntries->HandleCountDataBase == v5 )
break;
++HandleCountEntries;
if( !--CountEntries )
goto LABEL_6;
}
*v4 = *((_DWORD *)&HandleCountEntries->SingleEntry + 2) & 0xFFFFFF;
*((_DWORD *)&HandleCountEntries->SingleEntry + 2) = v10 ^ (v10 ^ (v10 - 1)) & 0xFFFFFF;
}
}
LABEL_6:
if( !*((_BYTE *)&HandleCountEntries->SingleEntry + 11)
&& (*((_DWORD *)&HandleCountEntries->SingleEntry + 2) & 0xFFFFFF) == 0 )
{
HandleCountEntries->HandleCountDataBase = 0i64;
}
}Referenced by:
ObpDecrementHandleCount