ObHandleRevocationBlockAddObject

NTSTATUS __stdcall ObHandleRevocationBlockAddObject(_OB_HANDLE_REVOCATION_BLOCK *RevocationBlock, VOID *Object){
  char v3; 
  _HANDLE_REVOCATION_INFO *v4; 
  UINT8 v5; 
  _ETHREAD *CurrentThread; 
  UINT8 v7; 
  _LIST_ENTRY *Blink; 
  NTSTATUS result; 

  v3 = 0;
  v4 = OBJECT_HEADER_TO_HANDLE_REVOCATION_INFO((_OBJECT_HEADER *)((char *)Object - 48));
  v5 = ExAcquireRundownProtection(&RevocationBlock->Rundown);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = v5;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&RevocationBlock->Lock, 0i64);
  if( !_InterlockedCompareExchange64(
          (volatile signed __int64 *)&v4->RevocationBlock,
          (signed __int64)RevocationBlock,
          0i64) )
  {
    Blink = RevocationBlock->RevocationInfos.Blink;
    if( (_OB_HANDLE_REVOCATION_BLOCK *)Blink->Flink != RevocationBlock )
      __fastfail(3u);
    v4->ListEntry.Flink = &RevocationBlock->RevocationInfos;
    v3 = 1;
    v4->ListEntry.Blink = Blink;
    Blink->Flink = &v4->ListEntry;
    RevocationBlock->RevocationInfos.Blink = &v4->ListEntry;
  }
  ExReleasePushLockEx((_DWORD)RevocationBlock + 16, 0);
  KeLeaveCriticalRegion();
  if( v7 )
  {
    if( !v3 )
      ExReleaseRundownProtection(&RevocationBlock->Rundown);
  }
  return result;
}

Referenced by:

ObpCreateHandle