ST_STORE::StDmCleanup

void __fastcall ST_STORE::StDmCleanup(UINT64 a1, int a2){
  _SMHP_CHUNK_HEAP *v2; 
  UINT64 v5; 
  VOID *v6; 
  PVOID *v7; 
  unsigned __int8 **v8; 
  __int64 v9; 
  __int16 v10; 
  __int64 v11; 
  unsigned int *v12; 
  __int64 v13; 
  void *v14; 
  void *v15; 
  void *v16; 
  void *v17; 
  void *v18; 
  void *v19; 
  __int64 v20; 
  _SMHP_CHUNK_PARAMS Parameters; 

  v2 = (_SMHP_CHUNK_HEAP *)(a1 + 192);
  SmHpChunkHeapProtect(a1 + 192, 1, 0i64);
  v6 = *(VOID **)(a1 + 760);
  if( v6 )
  {
    SmHpChunkFree(v2, v6);
    if( a2 )
    {
      *(_QWORD *)(a1 + 760) = 0i64;
      *(_DWORD *)(a1 + 768) = 0;
    }
  }
  Parameters = *(_SMHP_CHUNK_PARAMS *)(a1 + 464);
  SmHpChunkHeapCleanup(v2, (UINT64)v6, v5);
  if( a2 )
    SmHpChunkHeapInitialize(v2, &Parameters);
  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));
  v7 = (PVOID *)(a1 + 152);
  v8 = (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 && *v7 && !a2 )
    ExFreePoolWithTag(*v7, 0);
  if( *v8 )
    B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeNodeFree(
      a1 + 128,
      *v8);
  if( a2 )
  {
    *(_OWORD *)a1 = 0i64;
    *(_QWORD *)(a1 + 16) = 0i64;
    *(_OWORD *)(a1 + 64) = 0i64;
    *(_QWORD *)(a1 + 80) = 0i64;
    *(_OWORD *)v8 = 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(v9) = -1;
    while( 1 )
    {
      v9 = (unsigned int)(v9 + 1);
      if( (_DWORD)v9 == *(_DWORD *)(a1 + 788) )
        break;
      v10 = *(_WORD *)(*(_QWORD *)(a1 + 1032) + 2 * v9);
      if( (v10 & 0x1FFF) != 0 )
        ST_STORE::StDmpUpdateRegionState(a1, (unsigned int)v9, -(v10 & 0x1FFF), 0);
    }
    if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0
      && !a2
      && *(_DWORD *)(a1 + 840) != RtlNumberOfSetBits((UINT64 *)(a1 + 840)) )
    {
      ST_STORE::StDmLazyRegionsWorker(a1, 1, a1 + 864);
    }
    v11 = *(_QWORD *)(a1 + 1032);
    v12 = (unsigned int *)(a1 + 1104);
    v13 = 6i64;
    while( a2 )
    {
      v20 = *v12;
      if( (_DWORD)v20 == -1 )
        goto LABEL_29;
      if( *(_WORD *)(v11 + 2 * v20) < 0x4000u )
        break;
LABEL_31:
      v12 += 6;
      if( !--v13 )
        goto LABEL_32;
    }
    if( *v12 != -1 )
    {
      ExFreePoolWithTag(*((PVOID *)v12 + 1), 0);
      ExFreePoolWithTag(*((PVOID *)v12 + 2), 0);
    }
LABEL_29:
    if( a2 )
    {
      *(_OWORD *)v12 = 0i64;
      *((_QWORD *)v12 + 2) = 0i64;
      *v12 = -1;
    }
    goto LABEL_31;
  }
LABEL_32:
  if( !a2 )
  {
    v14 = *(void **)(a1 + 1056);
    if( v14 )
      ExFreePoolWithTag(v14, 0);
    v15 = *(void **)(a1 + 848);
    if( v15 )
      ExFreePoolWithTag(v15, 0);
    v16 = *(void **)(a1 + 1080);
    if( v16 )
      ExFreePoolWithTag(v16, 0);
    v17 = *(void **)(a1 + 1792);
    if( v17 )
      ExFreePoolWithTag(v17, 0);
    v18 = *(void **)(a1 + 1800);
    if( v18 )
      ExFreePoolWithTag(v18, 0);
    v19 = *(void **)(a1 + 1808);
    if( v19 )
      ExFreePoolWithTag(v19, 0);
  }
}

Referenced by:

No references.