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.