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