RtlpCSparseBitmapPageDecommit
INT64 __fastcall RtlpCSparseBitmapPageDecommit(INT64 a1, UINT64 rdx0, INT64 r8_0){
int v3;
const signed __int64 *v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
const signed __int64 *v10;
const signed __int64 *v11;
signed __int64 v12;
const signed __int64 *v13;
_BOOL8 v14;
unsigned __int64 v15;
__int64 v17;
const signed __int64 *v18;
const signed __int64 *v19;
signed __int64 v20;
bool j;
bool v22;
bool v23;
char v24;
INT64 v25;
signed __int32 v26[10];
const signed __int64 *i;
unsigned __int64 v28;
const signed __int64 *v29;
__int64 a2;
UINT64 v31;
UINT64 v32[3];
INT64 v33;
INT64 a3[2];
__int128 v35;
UINT8 v36[16];
__int64 v37[9];
int v38;
v3 = r8_0;
v33 = a1;
a2 = 0i64;
v32[0] = 0i64;
v31 = 0i64;
*(_OWORD *)a3 = 0i64;
v38 = 0;
v6 = *(const signed __int64 **)(a1 + 8);
v28 = *(_QWORD *)(a1 + 16);
v29 = v6;
v7 = rdx0 << 15;
v32[1] = rdx0 << 15;
v8 = 0x8000i64;
v9 = v28 - (rdx0 << 15);
if( v9 <= 0x8000 )
v8 = v9;
v32[2] = v8;
v35 = *(_OWORD *)RtlCSparseBitmapEnterLockingRegion(v37, a1);
while( 1 )
{
if( v3 )
goto LABEL_23;
i = 0i64;
if( v7 >= v28 )
{
LABEL_14:
LODWORD(v14) = 0;
goto LABEL_20;
}
if( v8 <= 1 )
{
if( v8 != 1 )
goto LABEL_14;
v14 = !_bittest64(v29, v7);
}
else
{
if( v28 - v7 < v8 )
goto LABEL_14;
v10 = &v29[v7 >> 6];
i = v10;
v11 = &v29[(v8 + v7 - 1) >> 6];
v12 = *v10;
if( v10 == v11 )
{
v15 = 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << v7;
}
else
{
if( (v12 & (-1i64 << v7)) != 0 )
goto LABEL_14;
v13 = v10 + 1;
for( i = v13; ; i = v13 )
{
v12 = *v13;
if( v13 == v11 )
break;
if( v12 )
goto LABEL_14;
++v13;
}
v15 = 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v8 + (unsigned __int8)v7 - 1);
}
LODWORD(v14) = (v12 & v15) == 0;
}
LABEL_20:
v26[8] = v14;
if( !v14 )
goto LABEL_21;
LABEL_23:
RtlpCSparseBitmapLock(a1, 1i64, (INT64)a3);
a2 = *(_QWORD *)(a1 + 32);
v17 = v33;
if( a2 == -1 )
break;
RtlpCSparseBitmapUnlock(a3);
RtlpCSparseBitmapWaitOnAddress((_QWORD *)(v17 + 32), &a2, v25, a1);
if( !_bittest64(*(const signed __int64 **)a1, rdx0) )
goto LABEL_21;
v3 = 0;
}
*(_QWORD *)(v33 + 32) = rdx0;
RtlpCSparseBitmapUnlock(a3);
v38 = 1;
if( !_bittest64(*(const signed __int64 **)a1, rdx0) || v7 >= v28 )
goto LABEL_21;
if( v8 <= 1 )
{
if( v8 != 1 )
goto LABEL_21;
if( !_bittest64(v29, v7) )
goto LABEL_36;
v23 = 0;
LABEL_35:
if( !v23 )
goto LABEL_21;
LABEL_36:
_interlockedbittestandreset64(*(volatile signed __int32 **)a1, rdx0);
v32[0] = *(_QWORD *)(a1 + 8) + (rdx0 << 12);
v31 = 4096i64;
RtlpHpEnvFreeVA(v32, &v31, 1073758208i64);
goto LABEL_21;
}
if( v28 - v7 < v8 )
goto LABEL_21;
v18 = &v29[v7 >> 6];
v19 = &v29[(v8 + v7 - 1) >> 6];
v20 = *v18;
if( v18 == v19 )
{
v22 = (v20 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << v7)) == 0;
LABEL_34:
v23 = v22;
goto LABEL_35;
}
for( j = (v20 & (-1i64 << v7)) == 0; j; j = *v18 == 0 )
{
if( ++v18 == v19 )
{
v22 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v8 + (unsigned __int8)v7 - 1)) & *v18) == 0;
goto LABEL_34;
}
}
LABEL_21:
if( v38 )
{
*(_QWORD *)(a1 + 32) = -1i64;
v24 = *(_BYTE *)(a1 + 48);
_InterlockedOr(v26, 0);
if( !v24 )
{
if( *(_QWORD *)(a1 + 40) )
ExpUnblockPushLock((_EX_PUSH_LOCK *)(a1 + 40), 0i64, 0i64);
}
}
*(_OWORD *)v36 = v35;
return RtlCSparseBitmapLeaveLockingRegion(v36);
}Referenced by:
RtlCSparseBitmapBitsClear