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