ExLockHandleTableEntry

UINT8 __stdcall ExLockHandleTableEntry(_HANDLE_TABLE *HandleTable, _HANDLE_TABLE_ENTRY *HandleTableEntry){
  __int64 LowValue; 

  while( 1 )
  {
    while( 1 )
    {
      _m_prefetchw(HandleTableEntry);
      LowValue = HandleTableEntry->LowValue;
      if( (HandleTableEntry->LowValue & 1) == 0 )
        break;
      if( LowValue == _InterlockedCompareExchange64(&HandleTableEntry->VolatileLowValue, LowValue - 1, LowValue) )
        return 1;
    }
    if( !LowValue )
      break;
    ExpBlockOnLockedHandleEntry(HandleTable, HandleTableEntry, LowValue);
  }
  return 0;
}

Referenced by:

ExDupHandleTable
ExQueryProcessHandleInformation
ExpSnapShotHandleTables
NtClose
ObReferenceFileObjectForWrite
ObWaitForMultipleObjects
ObpAuditObjectAccess
ObpReferenceProcessObjectByHandle
PspReferenceCidTableEntry