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.