SmKmVirtualLockCtxLockMemory
NTSTATUS __fastcall SmKmVirtualLockCtxLockMemory(VOID *Lock, VOID *a2, UINT64 a3){
int v4;
_ETHREAD *CurrentThread;
signed __int64 v6;
unsigned __int64 v7;
signed __int64 v8;
NTSTATUS v9;
int v10;
UINT64 v11;
VOID *BaseAddress;
UINT64 RegionSize;
RegionSize = a3;
BaseAddress = a2;
v4 = 0;
while( 1 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)Lock, 0i64);
if( !v4 )
{
v6 = *((_QWORD *)Lock + 1);
v7 = v6 + RegionSize;
while( v7 <= *((_QWORD *)Lock + 2) )
{
v8 = _InterlockedCompareExchange64((volatile signed __int64 *)Lock + 1, v7, v6);
if( v6 == v8 )
{
v4 = 1;
goto LABEL_9;
}
v7 = RegionSize + v8;
v6 = v8;
}
goto LABEL_11;
}
LABEL_9:
v9 = ZwLockVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 1ui64);
v10 = v9;
if( v9 >= 0 )
break;
if( v9 != -1073741663 )
goto LABEL_16;
LABEL_11:
v11 = *((_QWORD *)Lock + 2);
if( _InterlockedCompareExchange64((volatile signed __int64 *)Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegion();
v10 = SmKmVirtualLockContextIncreaseWsMin(Lock, RegionSize, v11);
if( v10 < 0 )
goto LABEL_19;
}
v4 = 0;
v10 = 0;
LABEL_16:
if( _InterlockedCompareExchange64((volatile signed __int64 *)Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)Lock);
KeAbPostRelease(Lock);
KeLeaveCriticalRegion();
LABEL_19:
if( v4 )
SmKmVirtualLockCtxMemoryUnlocked(Lock, RegionSize);
return v10;
}Referenced by:
SmKmStoreHelperCommandProcess