ST_STORE::StMapAndLockRegion
__int64 __fastcall ST_STORE::StMapAndLockRegion(__int64 a1, unsigned int a2, unsigned int a3, __int64 a4){
int v4;
__int64 v5;
int v6;
__int64 v7;
__int64 v9;
int VirtualRegion;
int v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
int v18;
__int64 v19;
__int64 v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
int v24;
v4 = 0;
v5 = a2;
v6 = a4;
v7 = a3;
if( (*(_WORD *)(*(_QWORD *)(a1 + 1032) + 2i64 * a2) & 0x1FFF) == 0 )
{
v9 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v9 + 6021) & 4) != 0 )
VirtualRegion = SMKM_STORE::SmStAllocateVirtualRegion(v9, a2);
else
VirtualRegion = SMKM_STORE::SmStAllocatePhysicalRegion(v9, a2);
if( VirtualRegion < 0 )
return 0i64;
++*(_DWORD *)(a1 + 8 * v7 + 1824);
if( !*(_BYTE *)(a1 + 776) )
*(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v5) = ((_WORD)v7 << 13) | *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v5) & 0x1FFF;
v4 = 1;
}
if( *(_BYTE *)(a1 + 776) )
v11 = 0;
else
v11 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v5) >> 13;
v12 = SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v5, 0, a4, v6 | (v11 << 7) | 0x10u);
v14 = v12;
if( v12 )
{
if( ((v12 - 1) & 0xFFFFFFFFFFFFFFFDui64) != 0 )
{
if( (*(_DWORD *)(a1 + 776) & 0x40000) == 0 || !SMKM_STORE::SmStIsRegionBusy(*(_QWORD *)(a1 + 800), v5) )
{
SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v5, 0, v13, 2u);
return v14;
}
v16 = -1i64;
}
else
{
ST_STORE::StDmUpdateRegionLazyCleanup(a1, v5, 1);
v16 = (v14 != 1) - 1i64;
v14 = 0i64;
}
if( v14 )
{
if( *(_BYTE *)(a1 + 776) )
v18 = 0;
else
v18 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v5) >> 13;
v19 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v19 + 6021) & 4) != 0 )
{
SMKM_STORE::SmStUnmapVirtualRegion(v19, v5, v15, v19, v24, (16 * v18) | 4);
}
else
{
v20 = *(_QWORD *)(v19 + 6216);
v21 = *(_QWORD *)(v20 + 8 * v5);
v22 = v21 & 0xFFFFFFFFFFFFFFFDui64;
v23 = v21 & 0xFFFFFFFFFFFFFFF8ui64;
*(_QWORD *)(v20 + 8 * v5) = v22;
if( (v22 & 3) == 0 )
SmFpFree(v19 + 6608, 5i64, (INT64)KeGetCurrentThread(), v23);
}
}
}
else
{
v16 = 0i64;
}
if( v4 )
ST_STORE::StReleaseRegion(a1, v5);
return v16;
}
Referenced by:
No references.