ST_STORE::StDmCleanup

void __fastcall ST_STORE::StDmCleanup(__int64 a1, int a2){
  _DWORD *v2; 
  UINT64 v5; 
  PVOID *v6; 
  unsigned __int8 **v7; 
  __int64 v8; 
  __int16 v9; 
  __int64 v10; 
  unsigned int *v11; 
  __int64 v12; 
  void *v13; 
  void *v14; 
  void *v15; 
  void *v16; 
  void *v17; 
  void *v18; 
  __int64 v19; 
  INT64 v20; 
  v2 = (_DWORD *)(a1 + 192);
  SmHpChunkHeapProtect(a1 + 192, 1, 0i64);
  v5 = *(_QWORD *)(a1 + 760);
  if( v5 )
  {
    SmHpChunkFree(v2, v5);
    if( a2 )
    {
      *(_QWORD *)(a1 + 760) = 0i64;
      *(_DWORD *)(a1 + 768) = 0;
    }
  }
  v20 = *(_QWORD *)(a1 + 464);
  SmHpChunkHeapCleanup((INT64)v2);
  if( a2 )
    SmHpChunkHeapInitialize((INT64)v2, (INT64)&v20);
  B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultCleanup(
    (__int64 *)a1,
    a1 + 24,
    a2);
  if( *(_QWORD *)a1 )
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeNodeFree(
      a1,
      *(unsigned __int8 **)a1);
  B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultCleanup(
    (__int64 *)(a1 + 64),
    a1 + 88,
    a2);
  if( *(_QWORD *)(a1 + 64) )
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeNodeFree(
      a1 + 64,
      *(unsigned __int8 **)(a1 + 64));
  v6 = (PVOID *)(a1 + 152);
  v7 = (unsigned __int8 **)(a1 + 128);
  B_TREE::_ST_HASH_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_HASH_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
    (__int64 *)(a1 + 128),
    a1 + 152);
  if( *(_DWORD *)(a1 + 176) != -1 && *v6 && !a2 )
    ExFreePoolWithTag(*v6, 0);
  if( *v7 )
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeNodeFree(
      a1 + 128,
      *v7);
  if( a2 )
  {
    *(_OWORD *)a1 = 0i64;
    *(_QWORD *)(a1 + 16) = 0i64;
    *(_OWORD *)(a1 + 64) = 0i64;
    *(_QWORD *)(a1 + 80) = 0i64;
    *(_OWORD *)v7 = 0i64;
    *(_QWORD *)(a1 + 144) = 0i64;
  }
  NP_CONTEXT::NpCleanup((struct NP_CONTEXT *)(a1 + 1376), a2);
  NP_CONTEXT::NpCleanup((struct NP_CONTEXT *)(a1 + 1512), a2);
  NP_CONTEXT::NpCleanup((struct NP_CONTEXT *)(a1 + 1648), a2);
  if( a2 )
  {
    *(_QWORD *)(a1 + 16) = a1 + 1376;
    *(_QWORD *)(a1 + 80) = a1 + 1512;
    *(_QWORD *)(a1 + 144) = a1 + 1648;
  }
  if( *(_QWORD *)(a1 + 1032) )
  {
    ST_STORE::StDmInvalidateCurrentRegions(a1);
    LODWORD(v8) = -1;
    while( 1 )
    {
      v8 = (unsigned int)(v8 + 1);
      if( (_DWORD)v8 == *(_DWORD *)(a1 + 788) )
        break;
      v9 = *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v8);
      if( (v9 & 0x1FFF) != 0 )
        ST_STORE::StDmpUpdateRegionState(a1, v8, -(v9 & 0x1FFF), 0);
    }
    if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0
      && !a2
      && *(_DWORD *)(a1 + 840) != RtlNumberOfSetBits((PRTL_BITMAP)(a1 + 840)) )
    {
      ST_STORE::StDmLazyRegionsWorker(a1, 1, a1 + 864);
    }
    v10 = *(_QWORD *)(a1 + 1032);
    v11 = (unsigned int *)(a1 + 1104);
    v12 = 6i64;
    while( a2 )
    {
      v19 = *v11;
      if( (_DWORD)v19 == -1 )
        goto LABEL_29;
      if( *(_WORD *)(v10 + 2 * v19) < 0x4000u )
        break;
LABEL_31:
      v11 += 6;
      if( !--v12 )
        goto LABEL_32;
    }
    if( *v11 != -1 )
    {
      ExFreePoolWithTag(*((PVOID *)v11 + 1), 0);
      ExFreePoolWithTag(*((PVOID *)v11 + 2), 0);
    }
LABEL_29:
    if( a2 )
    {
      *(_OWORD *)v11 = 0i64;
      *((_QWORD *)v11 + 2) = 0i64;
      *v11 = -1;
    }
    goto LABEL_31;
  }
LABEL_32:
  if( !a2 )
  {
    v13 = *(void **)(a1 + 1056);
    if( v13 )
      ExFreePoolWithTag(v13, 0);
    v14 = *(void **)(a1 + 848);
    if( v14 )
      ExFreePoolWithTag(v14, 0);
    v15 = *(void **)(a1 + 1080);
    if( v15 )
      ExFreePoolWithTag(v15, 0);
    v16 = *(void **)(a1 + 1792);
    if( v16 )
      ExFreePoolWithTag(v16, 0);
    v17 = *(void **)(a1 + 1800);
    if( v17 )
      ExFreePoolWithTag(v17, 0);
    v18 = *(void **)(a1 + 1808);
    if( v18 )
      ExFreePoolWithTag(v18, 0);
  }
}

Referenced by:

No references.