ST_STORE::StDmPageRemove
__int64 __fastcall ST_STORE::StDmPageRemove(UINT64 CompressedSize, __int64 a2){
__int64 v3;
__int64 v4;
int v5;
int v6;
int v7;
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;
VOID *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;
unsigned __int8 v35;
int v36;
bool v37;
__int64 v38;
_KLOCK_ENTRY *v39;
__int64 v40;
_DWORD *v41;
__int64 v42;
UINT64 v43;
_ETHREAD *CurrentThread;
__int64 SessionId;
unsigned __int8 v46;
int v47;
__int64 v48;
_KLOCK_ENTRY *v49;
__int64 v50;
UINT64 StoreId;
UINT64 v52;
int v53;
VOID *Chunk;
VOID *EtwRegHandle;
__int128 v56[5];
int v57;
int v59;
UINT64 a3;
v56[0] = 0i64;
EtwRegHandle = SmEtwEnabled(SmEtwKeywordStoreOps);
v3 = CompressedSize + 24;
v5 = *(_DWORD *)(v4 + 12) + *(_DWORD *)(v4 + 8) - 1;
v6 = *(_DWORD *)(CompressedSize + 56);
HIDWORD(v52) = 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 *)CompressedSize,
CompressedSize + 24);
v6 = *(_DWORD *)(CompressedSize + 56);
}
*(_DWORD *)(CompressedSize + 56) = v6 & 0xFFFFFFFE;
v7 = *(_DWORD *)(CompressedSize + 120);
if( (*(_BYTE *)(CompressedSize + 120) & 1) != 0 )
{
B_TREE::_ST_REGION_ENTRY,4096,NP_CONTEXT,ST_STORE::ST_REGION_ENTRY_COMPARATOR>::BTreeSearchResultDeref(
(__int64 *)(CompressedSize + 64),
CompressedSize + 88);
v7 = *(_DWORD *)(CompressedSize + 120);
}
v57 = 0;
*(_DWORD *)(CompressedSize + 120) = v7 & 0xFFFFFFFE;
v8 = 0;
v9 = 0;
LABEL_6:
v59 = 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(
CompressedSize,
*(_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(
CompressedSize,
(__int64)v56,
v3);
v12 = *(struct B_TREE_NODE_HDR **)&v56[0];
if( !*(_QWORD *)&v56[0] )
goto LABEL_33;
v13 = *((_QWORD *)&v56[0] + 1) + 8i64;
v14 = (unsigned __int16)**(_DWORD **)&v56[0] + 2i64;
*((_QWORD *)&v56[0] + 1) = v13;
if( v13 < *(_QWORD *)&v56[0] + 8 * v14 )
goto LABEL_10;
v11 = CompressedSize + 16;
if( **(_DWORD **)((CompressedSize + 16) & -(__int64)(CompressedSize != 0)) == -1 )
{
LeafSibling = *(struct B_TREE_NODE_HDR **)(*(_QWORD *)&v56[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(
CompressedSize,
*(__int64 *)&v56[0]);
v11 = -1i64;
if( LeafSibling == (struct B_TREE_NODE_HDR *)-1i64 )
{
v15 = -1i64;
goto LABEL_11;
}
}
if( LeafSibling )
{
v13 = (unsigned __int64)LeafSibling + 16;
*(_QWORD *)&v56[0] = LeafSibling;
*((_QWORD *)&v56[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 = v57;
goto LABEL_33;
}
v16 = *(_DWORD *)v15;
if( HIDWORD(v52) < *(_DWORD *)v15 )
{
v8 = v57;
LABEL_33:
if( v8 )
{
v42 = *(_QWORD *)(CompressedSize + 800);
if( (*(_BYTE *)(v42 + 6021) & 4) != 0 )
{
v43 = v42 + 6024;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v43, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v43);
LODWORD(v52) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v43) == 1 )
SessionId = (unsigned int)MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
else
SessionId = 0xFFFFFFFFi64;
--CurrentThread->Tcb.SpecialApcDisable;
v46 = ++CurrentThread->Tcb.AbAllocationRegionCount;
v47 = ((char)CurrentThread->Tcb.AbEntrySummary | (char)CurrentThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v37 = !_BitScanReverse((unsigned int *)&v48, v47);
if( v37 )
goto LABEL_107;
v49 = &CurrentThread->Tcb.LockEntries[v48];
v47 &= ~(1 << v48);
if( (v49->AcquiredByte & 1) != 0
&& (v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v43 & 0x7FFFFFFFFFFFFFFCi64)
&& v49->LockState.SessionId == (_DWORD)SessionId )
{
v49->AcquiredByte &= ~1u;
if( v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
}
if( !v49 )
{
LABEL_107:
if( (*(&CurrentThread->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, CurrentThread, (PVOID)v43, (PVOID)SessionId, 0i64);
goto LABEL_119;
}
v49->CrossThreadReleasableAndBusyByte |= 2u;
if( v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v49);
LODWORD(v52) = v49->BoostBitmap.AllFields & 0x1FFFF;
v49->BoostBitmap.AllFields &= 0xFFFE0000;
v49->ThreadLocalFlags &= ~1u;
v49->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v50 = v49 - CurrentThread->Tcb.LockEntries;
if( v46 == 1 )
CurrentThread->Tcb.AbEntrySummary |= 1 << v50;
else
_InterlockedOr8((volatile signed __int8 *)&CurrentThread->Tcb.AbOrphanedEntrySummary, 1 << v50);
LABEL_119:
--CurrentThread->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&CurrentThread->Tcb, (VOID *)v43, &v52);
v37 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
if( v37
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
{
KiCheckForKernelApcDelivery();
}
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
SMKM_STORE_MGR::SmEvictKeys(v11, &v59, v8);
SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(CompressedSize + 800));
}
if( !*(_BYTE *)(CompressedSize + 776) && (*(_BYTE *)(CompressedSize + 1904) & 3) != 3 )
{
v27 = ST_STORE::StDmCheckForCompaction(CompressedSize, 0);
if( v27 )
ST_STORE::StQueueCompaction(CompressedSize, v27);
}
v10 = 0;
break;
}
v17 = ST_STORE::StDmCombinePageEntry(CompressedSize, v15);
v53 = *(_DWORD *)(v15 + 4);
Chunk = v17;
ST_STORE::StDmPageRecordUnprotect(CompressedSize, (INT64)v17);
if( EtwRegHandle )
{
LODWORD(StoreId) = *(_DWORD *)Chunk;
SmEtwLogStoreOp(EtwRegHandle, 1ui64, (VOID *)v15, (UINT64)EtwRegHandle, StoreId, CompressedSize, 0, 0);
}
v18 = *(_DWORD *)(v3 + 24);
v19 = v3 + 8;
v20 = v3 + 8;
if( v18 == -1 || !v18 )
{
v21 = CompressedSize + 24;
}
else
{
v26 = 16i64 * (unsigned int)(v18 - 1);
v21 = CompressedSize + 24;
v20 = *(_QWORD *)(CompressedSize + 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 *)CompressedSize,
v21);
if( *(_DWORD *)(CompressedSize + 48) != -1 )
{
v3 = CompressedSize + 24;
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
CompressedSize,
*((_DWORD *)v12 + 4),
CompressedSize + 24);
v30 = *(_DWORD *)(CompressedSize + 48);
if( v30 != -1 && v30 )
v19 = *(_QWORD *)v3 + 16i64 * (unsigned int)(v30 - 1);
*(_QWORD *)(v19 + 8) = v13;
goto LABEL_21;
}
*(_OWORD *)v20 = v56[0];
}
v3 = CompressedSize + 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 *)v56,
(__int64 *)CompressedSize);
v56[0] = 0i64;
v22 = B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeDeleteEx(
CompressedSize,
v3);
v10 = v22;
if( v22 < 0 )
{
if( v22 != -1073741818 )
__int2c();
break;
}
v23 = Chunk;
if( !*(_BYTE *)(CompressedSize + 776) )
{
v24 = *((_DWORD *)Chunk + 1);
if( !(v24 >> 12) )
__int2c();
v8 = v57;
*((_DWORD *)Chunk + 1) = 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(
CompressedSize + 64,
v53,
CompressedSize + 88);
if( v10 < 0 )
{
if( v10 == -1073741818 )
goto LABEL_59;
if( v10 != -1073741275 || (v8 = v57, **(int **)(CompressedSize + 1920) < 2) )
{
__int2c();
LABEL_59:
if( v10 != -1073741275 )
break;
v8 = v57;
}
}
else
{
v10 = ST_STORE::StDmPageRecordRemove(CompressedSize, (unsigned __int64)v23, CompressedSize + 88);
if( v10 < 0 )
break;
SmHpChunkFree((_SMHP_CHUNK_HEAP *)(CompressedSize + 192), v23);
v25 = a2;
v8 = v57;
if( (*(_DWORD *)(a2 + 16) & 1) != 0 )
{
if( v57 && v16 - v9 != v57 )
{
v31 = *(_QWORD *)(CompressedSize + 800);
if( (*(_BYTE *)(v31 + 6021) & 4) != 0 )
{
v32 = v31 + 6024;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v32, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v32);
LODWORD(a3) = 0;
v33 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v32) == 1 )
v34 = MmGetSessionIdEx(v33->Tcb.ApcState.Process);
else
v34 = -1;
--v33->Tcb.SpecialApcDisable;
v35 = ++v33->Tcb.AbAllocationRegionCount;
v36 = ((char)v33->Tcb.AbEntrySummary | (char)v33->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v37 = !_BitScanReverse((unsigned int *)&v38, v36);
if( v37 )
break;
v39 = &v33->Tcb.LockEntries[v38];
v36 &= ~(1 << v38);
if( (v39->AcquiredByte & 1) != 0
&& (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v32 & 0x7FFFFFFFFFFFFFFCi64)
&& v39->LockState.SessionId == v34 )
{
v39->AcquiredByte &= ~1u;
if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v39 )
{
v39->CrossThreadReleasableAndBusyByte |= 2u;
if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v39);
LODWORD(a3) = 0;
LODWORD(a3) = v39->BoostBitmap.AllFields & 0x1FFFF;
v39->BoostBitmap.AllFields &= 0xFFFE0000;
v39->ThreadLocalFlags &= ~1u;
v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v40 = v39 - v33->Tcb.LockEntries;
if( v35 == 1 )
v33->Tcb.AbEntrySummary |= 1 << v40;
else
_InterlockedOr8((volatile signed __int8 *)&v33->Tcb.AbOrphanedEntrySummary, 1 << v40);
goto LABEL_81;
}
break;
}
}
}
if( (*(&v33->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v33, (PVOID)v32, (PVOID)v34, 0i64);
LABEL_81:
--v33->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v33->Tcb, (VOID *)v32, &a3);
v37 = v33->Tcb.SpecialApcDisable++ == -1;
if( v37 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v33->Tcb.ApcState.ApcListHead[0].Flink != &v33->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
SMKM_STORE_MGR::SmEvictKeys(v25, &v59, v57);
SMKM_STORE::SmStAcquireStoreLockExclusive(*(_QWORD *)(CompressedSize + 800));
v9 = v59;
v3 = CompressedSize + 24;
v8 = 0;
v57 = 0;
}
v41 = *(_DWORD **)(CompressedSize + 1920);
if( !*v41 || *v41 == 3 && v16 < v41[1] )
{
if( !v8 )
v9 = v16;
v57 = ++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 *)v56,
(__int64 *)CompressedSize);
return(unsigned int)v10;
}
Referenced by:
No references.