RtlpFcAddDelayedUsageReportToBuffer
__int64 __fastcall RtlpFcAddDelayedUsageReportToBuffer(unsigned __int32 *a1, _QWORD *a2){
unsigned int v2;
unsigned __int32 v5;
int v6;
char *v7;
unsigned __int32 v8;
unsigned int i;
unsigned int v10;
unsigned int v11;
__int64 *v12;
__int64 j;
unsigned __int64 v14;
unsigned int SizeOfBitMap;
__int64 v16;
_RTL_BITMAP BitMapHeader;
unsigned int v19;
v2 = 0;
*(_QWORD *)&BitMapHeader.SizeOfBitMap = 64i64;
v19 = 0;
BitMapHeader.Buffer = a1 + 2;
while( 1 )
{
_m_prefetchw(a1);
v5 = *a1;
if( *a1 == 64 )
{
v2 = -1073741670;
_InterlockedIncrement((volatile signed __int32 *)a1 + 1);
return v2;
}
if( v5 == _InterlockedCompareExchange((volatile signed __int32 *)a1, v5 + 1, v5) )
break;
RtlBackoff(&v19);
}
v6 = ((__int64)BitMapHeader.Buffer & 4) != 0i64 ? 0x20 : 0;
v7 = (char *)BitMapHeader.Buffer - (((__int64)BitMapHeader.Buffer & 4) != 0i64 ? 4 : 0);
do
{
v8 = v5 < BitMapHeader.SizeOfBitMap ? v5 : 0;
for( i = BitMapHeader.SizeOfBitMap - 1; ; i = SizeOfBitMap - 1 )
{
v10 = v6 + i;
if( i - v8 == -1 )
goto LABEL_8;
v12 = (__int64 *)&v7[8 * ((unsigned __int64)(v6 + v8) >> 6)];
for( j = *v12 | ((1i64 << ((v6 + v8) & 0x3F)) - 1); j == -1; j = *v12 )
{
if( ++v12 > (__int64 *)&v7[8 * ((unsigned __int64)v10 >> 6)] )
goto LABEL_8;
}
_BitScanForward64(&v14, ~j);
v11 = v14 + ((unsigned int)(((char *)v12 - v7) >> 3) << 6);
if( v11 > v10 )
{
LABEL_8:
v11 = -1;
}
else if( v11 != -1 )
{
break;
}
if( !v8 )
break;
SizeOfBitMap = v5 + 1;
v8 = 0;
if( v5 + 1 > BitMapHeader.SizeOfBitMap )
SizeOfBitMap = BitMapHeader.SizeOfBitMap;
}
v16 = v11 - v6;
if( v11 == -1 )
v16 = 0xFFFFFFFFi64;
}
while( !RtlInterlockedSetClearRun((INT64)&BitMapHeader, (unsigned int)v16, 1ui64) );
*(_QWORD *)&a1[3 * v16 + 5] = *a2;
return v2;
}Referenced by:
CmFcManagerNotifyFeatureUsage