ST_STORE::StReleaseRegion
void __fastcall ST_STORE::StReleaseRegion(__int64 a1, unsigned int a2){
__int64 v2;
__int64 v4;
int v5;
UINT64 *v6;
unsigned int v7;
__int64 v8;
MDL *v9;
INT64 Status;
int v11;
v2 = a2;
v11 = 0;
if( *(_BYTE *)(a1 + 776) )
{
*(_BYTE *)(a2 + *(_QWORD *)(a1 + 1048)) = 0;
}
else
{
v4 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v4 + 6021) & 4) != 0 )
{
v5 = SMKM_STORE::SmStReleaseVirtualRegion(*(_QWORD *)(a1 + 800), a2, 0);
}
else
{
v8 = *(_QWORD *)(v4 + 6216);
v9 = (MDL *)(*(_QWORD *)(v8 + 8i64 * a2) & 0xFFFFFFFFFFFFFFF8ui64);
MiFreePagesFromMdl(v9, 0i64);
ExFreePoolWithTag(v9, 0);
v5 = 0;
*(_QWORD *)(v8 + 8 * v2) = 0i64;
}
if( v5 == -1073741650 )
ST_STORE::StDmUpdateRegionLazyCleanup(a1, v2, 1);
v6 = SmEtwEnabled(0i64);
if( v6 )
{
LODWORD(Status) = 0;
SmEtwLogRegionOp(v6, 5ui64, a1, (unsigned int)v2, Status, *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v2) & 0x1FFF, 0);
}
if( (unsigned int)v2 < *(_DWORD *)(a1 + 1092) )
*(_DWORD *)(a1 + 1092) = v2;
}
if( *(_BYTE *)(a1 + 776) )
v7 = 0;
else
v7 = *(unsigned __int16 *)(*(_QWORD *)(a1 + 1032) + 2 * v2) >> 13;
--*(_DWORD *)(a1 + 8i64 * v7 + 1824);
if( !*(_BYTE *)(a1 + 776) )
*(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v2) &= 0x1FFFu;
if( (*(_DWORD *)(a1 + 832) & 4) != 0 )
{
ST_STORE::StDmGetSpaceStats(a1, &v11, 0i64);
if( (unsigned int)(*(_DWORD *)(a1 + 856) - v11) >= 8 && (*(_DWORD *)(a1 + 2232) & 1) == 0 )
{
*(_DWORD *)(a1 + 2216) = 0;
*(_DWORD *)(a1 + 2232) |= 1u;
SMKM_STORE::SmStWorkItemQueue(*(_QWORD *)(a1 + 800), a1 + 2200, 6);
}
}
}
Referenced by:
No references.