RtlCSparseBitmapStart
NTSTATUS __stdcall RtlCSparseBitmapStart(INT64 a1, UINT64 a2, UINT8 a3, INT64 a4){
UINT64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
_KAPC_STATE **v8;
NTSTATUS result;
unsigned __int64 v10;
_KAPC_STATE *v11;
UINT64 v12;
UINT64 v13;
INT64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
INT64 v20;
INT64 v21;
unsigned __int64 v22;
INT64 v23;
int v24;
v24 = 0;
*(_QWORD *)(a1 + 24) = 0i64;
*(_QWORD *)(a1 + 40) = 0i64;
*(_BYTE *)(a1 + 49) = a3;
*(_BYTE *)(a1 + 50) = a4;
*(_QWORD *)(a1 + 16) = a2;
*(_BYTE *)(a1 + 48) = (_DWORD)a4 != 0;
if( a2 > 0x7FFFFFFFFFFFFFFFi64 )
return -2147483643;
v5 = (((a2 + 7) >> 3) + 4095) & 0xFFFFFFFFFFFFF000ui64;
v6 = ((((v5 >> 12) + 7) >> 3) + 4095) & 0xFFFFFFFFFFFFF000ui64;
v7 = *(unsigned int *)(a1 + 52);
v23 = v6;
if( ((v6 >> 12) + 7) >> 3 > v7 )
return -2147483643;
LODWORD(v20) = 0;
v8 = (_KAPC_STATE **)(a1 + 8);
v22 = v6 + v5;
LODWORD(v16) = (unsigned __int8)a4;
LODWORD(v14) = a3;
LODWORD(v12) = 4;
result = RtlpHpEnvAllocVA((INT64 *)(a1 + 8), (INT64 *)&v22, 0i64, 1056768i64, v12, v14, v16, v18, v20);
if( result >= 0 )
{
_BitScanForward64(&v10, v22);
v11 = *v8;
*(_BYTE *)(a1 + 51) = v10;
result = RtlpEnvRegisterFaultRange(v11, (_KAPC_STATE *)v5);
if( result >= 0 )
{
*(_QWORD *)a1 = (char *)*v8 + v5;
if( v6 <= 0x1000 )
{
LODWORD(v21) = 0;
LODWORD(v17) = *(unsigned __int8 *)(a1 + 50);
LODWORD(v15) = *(unsigned __int8 *)(a1 + 49);
LODWORD(v13) = 4;
result = RtlpHpEnvAllocVA((INT64 *)a1, &v23, 0i64, 1073745920i64, v13, v15, v17, v19, v21);
if( result < 0 )
return result;
*(_QWORD *)(a1 + 56) = 1i64;
}
return 0;
}
}
return result;
}Referenced by:
RtlHpHeapManagerStart
RtlpHpVaMgrCtxStart