ExFastReplenishHandleTableEntry

NTSTATUS __stdcall ExFastReplenishHandleTableEntry(
        _HANDLE_TABLE_ENTRY *HandleEntry,
        _HANDLE_TABLE_ENTRY *HandleData,
        INT64 ReplenishCount){
  __int64 v4; 
  unsigned __int64 LowValue; 
  unsigned __int64 v7; 
  __int64 v8; 
  int v9; 
  int v10; 
  unsigned __int64 v11; 
  _HANDLE_TABLE_ENTRY v12; 
  unsigned __int8 v13; 
  _HANDLE_TABLE_ENTRY v15; 

  v4 = (int)ReplenishCount;
  LowValue = HandleData->LowValue;
  v7 = LowValue >> 20;
  do
  {
    v8 = v4 + (unsigned __int16)(LowValue >> 1);
    v9 = v4 + (unsigned __int16)(LowValue >> 1);
    v15 = *HandleData;
    if( v8 > 0xFFFF )
      v9 = 0xFFFF;
    v10 = v8 - 0xFFFF;
    if( v8 <= 0xFFFF )
      v10 = 0;
    v15.LowValue = ((unsigned int)HandleData->LowValue ^ (2 * v9)) & 0x1FFFE ^ HandleData->LowValue;
    v12 = *HandleData;
    v13 = _InterlockedCompareExchange128(&HandleEntry->VolatileLowValue, v15.HighValue, v15.LowValue, &v12.LowValue);
    v11 = v12.LowValue;
    *HandleData = v12;
    if( v13 )
    {
      LODWORD(v4) = v10;
      return v4;
    }
    LowValue = v11;
  }
  while( v11 >> 20 == v7 && (v11 & 1) != 0 );
  *HandleData = v15;
  return v4;
}

Referenced by:

ObReferenceFileObjectForWrite
ObWaitForMultipleObjects
ObpReferenceObjectByHandleWithTag