SmKmVirtualLockCtxMemoryUnlocked
VOID __fastcall SmKmVirtualLockCtxMemoryUnlocked(VOID *Lock, INT64 a2){
unsigned __int64 v3;
unsigned __int64 v4;
_ETHREAD *CurrentThread;
__int64 v6;
unsigned __int64 v7;
UINT64 v8;
unsigned __int64 v9;
_ETHREAD *v10;
unsigned int SessionId;
unsigned __int8 v12;
int v13;
_KLOCK_ENTRY *v14;
bool v15;
__int64 v16;
__int64 v17;
UINT64 *MaximumWorkingSetSize;
UINT64 MinimumWorkingSetSize;
UINT64 WorkingSetMaximumInBytes;
UINT64 PrivateWorkingSetSize;
UINT64 WorkingSetSize;
__int64 PeakWorkingSetSize[2];
UINT8 IncreaseOccurred;
int v25;
UINT64 a3;
UINT64 HardEnforcementFlags;
MinimumWorkingSetSize = 0i64;
WorkingSetMaximumInBytes = 0i64;
_InterlockedExchangeAdd64((volatile signed __int64 *)Lock + 1, -a2);
v3 = *((_QWORD *)Lock + 1);
v4 = *((_QWORD *)Lock + 2);
if( v3 < v4 && (!v3 || v4 - v3 >= 0x800000) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Lock, 0i64);
v6 = *((_QWORD *)Lock + 1);
v7 = *((_QWORD *)Lock + 2) - v6;
if( v7 >= 0x800000 || !v6 && *((_QWORD *)Lock + 2) )
{
PeakWorkingSetSize[0] = 0i64;
WorkingSetSize = 0i64;
LODWORD(HardEnforcementFlags) = 0;
PrivateWorkingSetSize = 0i64;
if( MmQueryWorkingSetInformation(
(UINT64 *)PeakWorkingSetSize,
&WorkingSetSize,
&PrivateWorkingSetSize,
&MinimumWorkingSetSize,
&WorkingSetMaximumInBytes,
&HardEnforcementFlags) >= 0 )
{
v8 = MinimumWorkingSetSize;
v9 = v7 & 0xFFFFFFFFFFC00000ui64;
*((_QWORD *)Lock + 2) -= v9;
if( v8 >= v9 )
{
LODWORD(MaximumWorkingSetSize) = 0;
MinimumWorkingSetSize = v8 - v9;
IncreaseOccurred = 0;
MmAdjustWorkingSetSizeEx(
v8 - v9,
WorkingSetMaximumInBytes,
WorkingSetTypeUser,
0,
(UINT64)MaximumWorkingSetSize,
&IncreaseOccurred);
}
}
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Lock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)Lock);
LODWORD(a3) = 0;
v10 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType((UINT64)Lock) == 1 )
SessionId = MmGetSessionIdEx(v10->Tcb.ApcState.Process);
else
SessionId = -1;
--v10->Tcb.SpecialApcDisable;
v12 = ++v10->Tcb.AbAllocationRegionCount;
v13 = ((char)v10->Tcb.AbEntrySummary | (char)v10->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v15 = !_BitScanReverse((unsigned int *)&v16, v13);
v25 = v16;
if( v15 )
goto LABEL_22;
v14 = &v10->Tcb.LockEntries[v16];
v13 &= ~(1 << v16);
if( (v14->AcquiredByte & 1) != 0
&& (v14->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v14->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)Lock & 0x7FFFFFFFFFFFFFFCi64)
&& v14->LockState.SessionId == SessionId )
{
v14->AcquiredByte &= ~1u;
if( v14->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
}
if( !v14 )
{
LABEL_22:
if( (*(&v10->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v10, Lock, (PVOID)SessionId, 0i64);
goto LABEL_29;
}
v14->CrossThreadReleasableAndBusyByte |= 2u;
if( v14->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v14);
LODWORD(a3) = v14->BoostBitmap.AllFields & 0x1FFFF;
v14->BoostBitmap.AllFields &= 0xFFFE0000;
v14->ThreadLocalFlags &= ~1u;
v14->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v17 = v14 - v10->Tcb.LockEntries;
if( v12 == 1 )
v10->Tcb.AbEntrySummary |= 1 << v17;
else
_InterlockedOr8((volatile signed __int8 *)&v10->Tcb.AbOrphanedEntrySummary, 1 << v17);
LABEL_29:
--v10->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v10->Tcb, Lock, &a3);
v15 = v10->Tcb.SpecialApcDisable++ == -1;
if( v15 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v10->Tcb.ApcState.ApcListHead[0].Flink != &v10->Tcb.152 )
KiCheckForKernelApcDelivery();
KeLeaveCriticalRegion();
}
}Referenced by:
SmKmStoreHelperCommandProcess
SmKmVirtualLockCtxLockMemory