AlpcDeleteBlobByHandle

INT64 __fastcall AlpcDeleteBlobByHandle(_ALPC_HANDLE_TABLE *HandleTable, VOID *Handle, VOID *Resource){
  INT64 result; 
  char v4; 
  int v6; 
  _EX_PUSH_LOCK *p_Lock; 
  unsigned __int64 v9; 
  void *retaddr; 
  result = (INT64)&retaddr;
  v4 = 0;
  v6 = (int)Handle;
  if( HandleTable )
  {
    p_Lock = &HandleTable->Lock;
    ExAcquirePushLockExclusiveEx((UINT64)&HandleTable->Lock, 0i64);
    v9 = (unsigned int)(v6 - 16);
    if( v9 < HandleTable->TotalHandles && HandleTable->Handles[v9].Object == Resource )
    {
      HandleTable->Handles[v9].Object = 0i64;
      v4 = 1;
    }
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_Lock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)p_Lock);
    KeAbPostRelease(p_Lock);
    LOBYTE(result) = v4;
  }
  else
  {
    LOBYTE(result) = 0;
  }
  return result;
}

Referenced by:

AlpcReserveDestroyProcedure
AlpcSectionDeleteProcedure
AlpcSectionDestroyProcedure
AlpcSecurityDestroyProcedure