ObpHandleRevocationBlockRemoveInsertedObject

VOID __stdcall ObpHandleRevocationBlockRemoveInsertedObject(
        _HANDLE_REVOCATION_INFO *RevocationInfo,
        _OB_HANDLE_REVOCATION_BLOCK *RevocationBlock,
        UINT64 NewState,
        UINT8 RevocationBlockLocked){
  _ETHREAD *CurrentThread; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 

  if( RevocationBlock == (_OB_HANDLE_REVOCATION_BLOCK *)_InterlockedCompareExchange64(
                                                           (volatile signed __int64 *)&RevocationInfo->RevocationBlock,
                                                           2i64,
                                                           (signed __int64)RevocationBlock) )
  {
    if( !RevocationBlockLocked )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(&RevocationBlock->Lock, 0i64);
    }
    Flink = RevocationInfo->ListEntry.Flink;
    if( (_HANDLE_REVOCATION_INFO *)RevocationInfo->ListEntry.Flink->Blink != RevocationInfo
      || (Blink = RevocationInfo->ListEntry.Blink, (_HANDLE_REVOCATION_INFO *)Blink->Flink != RevocationInfo) )
    {
      __fastfail(3u);
    }
    Blink->Flink = Flink;
    Flink->Blink = Blink;
    if( !RevocationBlockLocked )
    {
      ExReleasePushLockEx((_DWORD)RevocationBlock + 16, 0);
      KeLeaveCriticalRegion();
    }
    ExReleaseRundownProtection(&RevocationBlock->Rundown);
    RevocationInfo->RevocationBlock = (_OB_HANDLE_REVOCATION_BLOCK *)NewState;
  }
}

Referenced by:

ObDestroyHandleRevocationBlock
ObRevokeHandles
ObpHandleRevocationBlockRemoveObject