RtlCSparseBitmapBitsClear
NTSTATUS __stdcall RtlCSparseBitmapBitsClear(INT64 a1, UINT64 a2, INT64 a3){
void **v3;
UINT64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
volatile signed __int32 *v13;
UINT64 v14;
UINT64 v15;
__int64 *v16;
__int64 *v17;
__int64 v18;
__int64 *i;
__int64 v20;
bool v21;
int v22;
__int64 v23;
__int64 v25;
unsigned __int64 v26;
void *retaddr;
INT64 v28;
v3 = &retaddr;
while( a3 )
{
v7 = a2 & 0x7FFF;
v8 = a3;
v28 = a3;
v9 = v7 + a3;
if( a3 < 0 )
{
v8 = ~v7;
if( v9 >= 0 )
v8 = a3;
}
else
{
if( v9 <= 0x8000 )
goto LABEL_5;
v8 = 0x8000 - v7;
}
v28 = v8;
LABEL_5:
v10 = v8;
v25 = v8;
v11 = a2 >> 15;
if( _bittest64((const signed __int64 *)(a1 + 56), a2 >> 30) )
{
v3 = *(void ***)a1;
if( !_bittest64(*(const signed __int64 **)a1, v11) )
goto LABEL_36;
v26 = *(_QWORD *)(a1 + 8) + (v11 << 12);
v12 = v8;
v13 = (volatile signed __int32 *)(v26 + 4 * (v7 >> 5));
v14 = a2 & 0x1F;
if( v14 + v8 <= 0x20 )
{
if( v8 == 32 )
{
*v13 = 0;
goto LABEL_13;
}
v22 = ~(((1 << v8) - 1) << v14);
}
else
{
if( (a2 & 0x1F) != 0 )
{
_InterlockedAnd(v13, ~(((1 << (32 - (a2 & 0x1F))) - 1) << v14));
v8 = v28;
v12 = v28 - (32 - (unsigned int)(a2 & 0x1F));
++v13;
}
while( v12 >= 0x20 )
{
*v13++ = 0;
v12 -= 32i64;
}
if( !v12 )
{
LABEL_13:
if( v8 >= 512 )
{
LODWORD(v3) = 1;
}
else
{
v15 = a2 & 0x7E00;
if( 0x8000 - v15 < 0x200 )
{
LODWORD(v3) = 0;
}
else
{
v16 = (__int64 *)(v26 + 8 * (v15 >> 6));
v17 = (__int64 *)(v26 + 8 * ((v15 + 511) >> 6));
v18 = *v16;
if( v16 == v17 )
{
v21 = v18 == 0;
goto LABEL_22;
}
if( v18 )
{
LABEL_25:
LODWORD(v3) = 0;
}
else
{
for( i = v16 + 1; ; ++i )
{
v20 = *i;
if( i == v17 )
break;
if( v20 )
goto LABEL_25;
}
v21 = v20 == 0;
LABEL_22:
LODWORD(v3) = v21;
}
v10 = v25;
}
v8 = v28;
}
if( (_DWORD)v3 )
LODWORD(v3) = RtlpCSparseBitmapPageDecommit(a1, a2 >> 15, v10 == 0x8000);
goto LABEL_36;
}
v22 = -1 << v12;
}
_InterlockedAnd(v13, v22);
v8 = v28;
goto LABEL_13;
}
v3 = (void **)(a2 & 0x3FFFFFFF);
v8 = a3;
v23 = (__int64)v3 + a3;
if( a3 >= 0 )
{
if( v23 > 0x40000000 )
v8 = 0x40000000i64 - (_QWORD)v3;
}
else
{
v8 = ~(unsigned __int64)(unsigned int)v3;
if( v23 >= 0 )
v8 = a3;
}
LABEL_36:
a2 += v8;
a3 -= v8;
}
return(int)v3;
}Referenced by:
RtlCSparseBitmapBitmaskWrite
RtlpHpSegSegmentFree
RtlpHpVaMgrRangeCleanup
RtlpHpVaMgrRangeCreate