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.