ST_STORE::StDmPageRemove
__int64 __fastcall ST_STORE::StDmPageRemove(__int64 a1, __int64 a2){
__int64 v3;
__int64 v4;
int v5;
int v6;
int v7;
unsigned int v8;
int v9;
int v10;
__int64 v11;
struct B_TREE_NODE_HDR *v12;
unsigned __int64 v13;
__int64 v14;
__int64 v15;
unsigned int v16;
_DWORD *v17;
int v18;
__int64 v19;
__int64 v20;
__int64 v21;
int v22;
unsigned __int64 v23;
unsigned int v24;
__int64 v25;
__int64 v26;
int v27;
struct B_TREE_NODE_HDR *LeafSibling;
int v30;
__int64 v31;
UINT64 v32;
_ETHREAD *v33;
unsigned int v34;
char v35;
int v36;
bool v37;
__int64 v38;
unsigned __int64 v39;
__int64 v40;
_DWORD *v41;
__int64 v42;
UINT64 v43;
_ETHREAD *CurrentThread;
ULONG_PTR SessionId;
char v46;
int v47;
__int64 v48;
unsigned __int64 v49;
__int64 v50;
ULONG_PTR BugCheckParameter4;
int v52;
unsigned int v53;
int v54;
UINT64 a2a;
PVOID EtwRegHandle;
__int128 v57[5];
unsigned int v58;
int v60;
int v61;
v57[0] = 0i64;
EtwRegHandle = SmEtwEnabled(0i64);
v3 = a1 + 24;
v5 = *(_DWORD *)(v4 + 12) + *(_DWORD *)(v4 + 8) - 1;
v6 = *(_DWORD *)(a1 + 56);
v53 = v5;
if( (v6 & 1) != 0 )
{
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultDeref(
(__int64 *)a1,
a1 + 24);
v6 = *(_DWORD *)(a1 + 56);
}
*(_DWORD *)(a1 + 56) = v6 & 0xFFFFFFFE;
v7 = *(_DWORD *)(a1 + 120);
if( (*(_BYTE *)(a1 + 120) & 1) != 0 )
{
B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
(__int64 *)(a1 + 64),
a1 + 88);
v7 = *(_DWORD *)(a1 + 120);
}
v58 = 0;
*(_DWORD *)(a1 + 120) = v7 & 0xFFFFFFFE;
v8 = 0;
v9 = 0;
LABEL_6:
v60 = v9;
while( 1 )
{
v10 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
a1,
*(_DWORD *)(a2 + 8),
v3);
if( v10 == -1073741818 )
break;
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorFromSearchResult(
a1,
(__int64)v57,
v3);
v12 = *(struct B_TREE_NODE_HDR **)&v57[0];
if( !*(_QWORD *)&v57[0] )
goto LABEL_33;
v13 = *((_QWORD *)&v57[0] + 1) + 8i64;
v14 = (unsigned __int16)**(_DWORD **)&v57[0] + 2i64;
*((_QWORD *)&v57[0] + 1) = v13;
if( v13 < *(_QWORD *)&v57[0] + 8 * v14 )
goto LABEL_10;
v11 = a1 + 16;
if( **(_DWORD **)((a1 + 16) & -(__int64)(a1 != 0)) == -1 )
{
LeafSibling = *(struct B_TREE_NODE_HDR **)(*(_QWORD *)&v57[0] + 8i64);
}
else
{
LeafSibling = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeFindLeafSibling(
a1,
*(__int64 *)&v57[0]);
v11 = -1i64;
if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
{
v15 = -1i64;
goto LABEL_11;
}
}
if( LeafSibling )
{
v13 = (unsigned __int64)LeafSibling + 16;
*(_QWORD *)&v57[0] = LeafSibling;
*((_QWORD *)&v57[0] + 1) = (char *)LeafSibling + 16;
v12 = LeafSibling;
LABEL_10:
v15 = v13;
goto LABEL_11;
}
v15 = 0i64;
LABEL_11:
if( v15 == -1 )
{
v10 = -1073741818;
break;
}
if( !v15 )
{
v8 = v58;
goto LABEL_33;
}
v16 = *(_DWORD *)v15;
if( v53 < *(_DWORD *)v15 )
{
v8 = v58;
LABEL_33:
if( v8 )
{
v42 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v42 + 6021) & 4) != 0 )
{
v43 = v42 + 6024;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v43, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v43);
v52 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (unsigned int)MiGetSystemRegionType(v43) == 1 )
SessionId = (unsigned int)MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
else
SessionId = 0xFFFFFFFFi64;
--*((_WORD *)CurrentThread + 243);
v46 = ++*((_BYTE *)CurrentThread + 794);
v47 = (*((char *)CurrentThread + 792) | *((char *)CurrentThread + 870)) ^ 0x3F;
while( 1 )
{
v37 = !_BitScanReverse((unsigned int *)&v48, v47);
if( v37 )
goto LABEL_107;
v49 = *((_QWORD *)CurrentThread + 100) + 96 * v48;
v47 &= ~(1 << v48);
if( (*(_BYTE *)(v49 + 26) & 1) != 0
&& (*(_DWORD *)(v49 + 32) & 1) == 0
&& (*(_QWORD *)(v49 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v43 & 0x7FFFFFFFFFFFFFFCi64)
&& *(_DWORD *)(v49 + 40) == (_DWORD)SessionId )
{
*(_BYTE *)(v49 + 26) &= ~1u;
if( *(_QWORD *)(v49 + 32) )
break;
}
}
if( !v49 )
{
LABEL_107:
if( (*((_DWORD *)CurrentThread + 30) & 0x10000) == 0 )
KeBugCheckEx(0x162u, (ULONG_PTR)CurrentThread, v43, SessionId, 0i64);
goto LABEL_119;
}
*(_BYTE *)(v49 + 32) |= 2u;
if( *(__int64 *)(v49 + 32) < 0 )
KiAbEntryRemoveFromTree(v49);
v52 = *(_DWORD *)(v49 + 88) & 0x1FFFF;
*(_DWORD *)(v49 + 88) &= 0xFFFE0000;
*(_BYTE *)(v49 + 25) &= ~1u;
*(_QWORD *)(v49 + 32) = 0i64;
v50 = (__int64)(v49 - *((_QWORD *)CurrentThread + 100)) / 96;
if( v46 == 1 )
*((_BYTE *)CurrentThread + 792) |= 1 << v50;
else
_InterlockedOr8((volatile signed __int8 *)CurrentThread + 870, 1 << v50);
LABEL_119:
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, v43, (unsigned int *)&v52);
v37 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
if( v37 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
SMKM_STORE_MGR::SmEvictKeys(v11, &v60, v8);
SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(a1 + 800));
}
if( !*(_BYTE *)(a1 + 776) && (*(_BYTE *)(a1 + 1904) & 3) != 3 )
{
v27 = ST_STORE::StDmCheckForCompaction(a1, 0);
if( v27 )
ST_STORE::StQueueCompaction(a1, v27);
}
v10 = 0;
break;
}
v17 = ST_STORE::StDmCombinePageEntry(a1, v15);
v54 = *(_DWORD *)(v15 + 4);
a2a = (UINT64)v17;
ST_STORE::StDmPageRecordUnprotect(a1, (__int64)v17);
if( EtwRegHandle )
{
LODWORD(BugCheckParameter4) = *(_DWORD *)a2a;
SmEtwLogStoreOp(EtwRegHandle, 1ui64, (PVOID)v15, (UINT64)EtwRegHandle, BugCheckParameter4, a1, 0, 0);
}
v18 = *(_DWORD *)(v3 + 24);
v19 = v3 + 8;
v20 = v3 + 8;
if( v18 == -1 || !v18 )
{
v21 = a1 + 24;
}
else
{
v26 = 16i64 * (unsigned int)(v18 - 1);
v21 = a1 + 24;
v20 = *(_QWORD *)(a1 + 24) + v26;
}
if( *(struct B_TREE_NODE_HDR **)v20 == v12 )
{
*(_QWORD *)(v20 + 8) = v13;
}
else
{
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultDeref(
(__int64 *)a1,
v21);
if( *(_DWORD *)(a1 + 48) != -1 )
{
v3 = a1 + 24;
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
a1,
*((_DWORD *)v12 + 4),
a1 + 24);
v30 = *(_DWORD *)(a1 + 48);
if( v30 != -1 && v30 )
v19 = *(_QWORD *)v3 + 16i64 * (unsigned int)(v30 - 1);
*(_QWORD *)(v19 + 8) = v13;
goto LABEL_21;
}
*(_OWORD *)v20 = v57[0];
}
v3 = a1 + 24;
LABEL_21:
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorCleanup(
(__int64 *)v57,
(__int64 *)a1);
v57[0] = 0i64;
v22 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeDeleteEx(
a1,
v3);
v10 = v22;
if( v22 < 0 )
{
if( v22 != -1073741818 )
__int2c();
break;
}
v23 = a2a;
if( !*(_BYTE *)(a1 + 776) )
{
v24 = *(_DWORD *)(a2a + 4);
if( !(v24 >> 12) )
__int2c();
v8 = v58;
*(_DWORD *)(a2a + 4) = v24 & 0xFFF | (((v24 >> 12) - 1) << 12);
if( ((v24 >> 12) - 1) << 12 )
continue;
}
v10 = B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchKey(
a1 + 64,
v54,
a1 + 88);
if( v10 < 0 )
{
if( v10 == -1073741818 )
goto LABEL_59;
if( v10 != -1073741275 || (v8 = v58, **(int **)(a1 + 1920) < 2) )
{
__int2c();
LABEL_59:
if( v10 != -1073741275 )
break;
v8 = v58;
}
}
else
{
v10 = ST_STORE::StDmPageRecordRemove(a1, v23, a1 + 88);
if( v10 < 0 )
break;
SmHpChunkFree((_DWORD *)(a1 + 192), v23);
v25 = a2;
v8 = v58;
if( (*(_DWORD *)(a2 + 16) & 1) != 0 )
{
if( v58 && v16 - v9 != v58 )
{
v31 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v31 + 6021) & 4) != 0 )
{
v32 = v31 + 6024;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v32, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v32);
v61 = 0;
v33 = (_ETHREAD *)KeGetCurrentThread();
if( (unsigned int)MiGetSystemRegionType(v32) == 1 )
v34 = MmGetSessionIdEx(*((_QWORD *)v33 + 23));
else
v34 = -1;
--*((_WORD *)v33 + 243);
v35 = ++*((_BYTE *)v33 + 794);
v36 = (*((char *)v33 + 792) | *((char *)v33 + 870)) ^ 0x3F;
while( 1 )
{
v37 = !_BitScanReverse((unsigned int *)&v38, v36);
if( v37 )
break;
v39 = *((_QWORD *)v33 + 100) + 96 * v38;
v36 &= ~(1 << v38);
if( (*(_BYTE *)(v39 + 26) & 1) != 0
&& (*(_DWORD *)(v39 + 32) & 1) == 0
&& (*(_QWORD *)(v39 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v32 & 0x7FFFFFFFFFFFFFFCi64)
&& *(_DWORD *)(v39 + 40) == v34 )
{
*(_BYTE *)(v39 + 26) &= ~1u;
if( *(_QWORD *)(v39 + 32) )
{
if( v39 )
{
*(_BYTE *)(v39 + 32) |= 2u;
if( *(__int64 *)(v39 + 32) < 0 )
KiAbEntryRemoveFromTree(v39);
v61 = 0;
v61 = *(_DWORD *)(v39 + 88) & 0x1FFFF;
*(_DWORD *)(v39 + 88) &= 0xFFFE0000;
*(_BYTE *)(v39 + 25) &= ~1u;
*(_QWORD *)(v39 + 32) = 0i64;
v40 = (__int64)(v39 - *((_QWORD *)v33 + 100)) / 96;
if( v35 == 1 )
*((_BYTE *)v33 + 792) |= 1 << v40;
else
_InterlockedOr8((volatile signed __int8 *)v33 + 870, 1 << v40);
goto LABEL_81;
}
break;
}
}
}
if( (*((_DWORD *)v33 + 30) & 0x10000) == 0 )
KeBugCheckEx(0x162u, (ULONG_PTR)v33, v32, v34, 0i64);
LABEL_81:
--*((_BYTE *)v33 + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)v33, v32, (unsigned int *)&v61);
v37 = (*((_WORD *)v33 + 243))++ == 0xFFFF;
if( v37 && *((_ETHREAD **)v33 + 19) != (_ETHREAD *)((char *)v33 + 152) )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
SMKM_STORE_MGR::SmEvictKeys(v25, &v60, v58);
SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(a1 + 800));
v9 = v60;
v3 = a1 + 24;
v8 = 0;
v58 = 0;
}
v41 = *(_DWORD **)(a1 + 1920);
if( !*v41 || *v41 == 3 && v16 < v41[1] )
{
if( !v8 )
v9 = v16;
v58 = ++v8;
goto LABEL_6;
}
}
}
}
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorCleanup(
(__int64 *)v57,
(__int64 *)a1);
return(unsigned int)v10;
}
Referenced by:
No references.