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