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