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