RtlpCSparseBitmapPageCommit
NTSTATUS __fastcall RtlpCSparseBitmapPageCommit(INT64 a4, UINT64 a2, INT64 *a3, _OWORD *r9_0){
unsigned __int64 v5;
unsigned __int64 v7;
int v9;
int v11;
INT64 v12;
UINT64 v13;
INT64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
INT64 v18[2];
UINT8 v19[16];
__int64 v20;
INT64 v21;
VOID *CompareAddress;
CompareAddress = (VOID *)a2;
v5 = a2 >> 15;
v7 = a2;
if( !_bittest64((const signed __int64 *)(a4 + 56), a2 >> 15) )
{
LODWORD(v17) = 0;
v21 = 4096i64;
v18[0] = *(_QWORD *)a4 + (v5 << 12);
LODWORD(v15) = *(unsigned __int8 *)(a4 + 50);
LODWORD(v14) = *(unsigned __int8 *)(a4 + 49);
LODWORD(v13) = 4;
v9 = RtlpHpEnvAllocVA(v18, &v21, 0i64, 1073745920i64, v13, v14, v15, v16, v17);
if( v9 < 0 )
return v9;
_interlockedbittestandset64((volatile signed __int32 *)(a4 + 56), v5);
v7 = (unsigned __int64)CompareAddress;
}
*r9_0 = *(_OWORD *)RtlCSparseBitmapEnterLockingRegion(&v20, a4);
while( 1 )
{
RtlpCSparseBitmapLock(a4, 0, (__int64)a3);
if( *(_QWORD *)(a4 + 32) != v7 )
break;
RtlpCSparseBitmapUnlock(a3);
RtlpCSparseBitmapWaitOnAddress((VOID *)(a4 + 32), &CompareAddress, v12, a4);
}
if( !_bittest64(*(const signed __int64 **)a4, v7) )
{
v11 = *(unsigned __int8 *)(a4 + 49);
LODWORD(v17) = 0;
v18[0] = *(_QWORD *)(a4 + 8) + (v7 << 12);
LODWORD(v15) = *(unsigned __int8 *)(a4 + 50);
LODWORD(v14) = v11;
v21 = 4096i64;
LODWORD(v13) = 4;
v9 = RtlpHpEnvAllocVA(v18, &v21, 0i64, 1073745920i64, v13, v14, v15, v16, v17);
if( v9 < 0 )
{
RtlpCSparseBitmapUnlock(a3);
*(_OWORD *)v19 = *r9_0;
RtlCSparseBitmapLeaveLockingRegion(v19);
return v9;
}
_interlockedbittestandset64(*(volatile signed __int32 **)a4, v7);
}
return 0;
}Referenced by:
RtlCSparseBitmapBitmaskWrite
RtlSparseArrayElementAllocate