SmKmStoreHelperCommandProcess

VOID __fastcall SmKmStoreHelperCommandProcess(INT64 a1, INT64 a2, INT64 a3){
  int v5; 
  int v6; 
  int v7; 
  MDL *v8; 
  MDL *v9; 
  UINT64 v10; 
  unsigned int v11; 
  NTSTATUS v12; 
  void *v13; 
  void *v14; 
  PVOID v15; 
  PVOID v16; 
  int v17; 
  void *v18; 
  int v19; 
  INT64 v20; 
  INT64 v21; 
  int v22; 
  VOID *Context; 
  VOID *Contexta; 
  _MDL *v25; 
  _MDL *v26; 
  PVOID ThreadPtr[2]; 
  PVOID BaseAddress; 
  ULONG_PTR NumberOfBytesToUnlock; 
  BaseAddress = 0i64;
  NumberOfBytesToUnlock = 0i64;
  v5 = a2 - 2;
  if( !v5 )
  {
    NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
    LODWORD(v14) = MmStoreAllocateVirtualMemory(NumberOfBytesToUnlock);
    BaseAddress = v14;
    v15 = v14;
    if( v14 )
    {
      if( *(_QWORD *)(a1 + 112) )
      {
        if( (*(_DWORD *)(a3 + 32) & 1) == 0 )
        {
          v22 = SmKmVirtualLockCtxLockMemory(*(PVOID *)(a1 + 112), v14, NumberOfBytesToUnlock);
          v15 = BaseAddress;
          v12 = v22;
          if( v22 < 0 )
          {
            MmStoreFreeVirtualMemory(BaseAddress);
            goto LABEL_12;
          }
        }
      }
      *(_QWORD *)(a3 + 24) = v15;
      goto LABEL_11;
    }
    goto LABEL_24;
  }
  v6 = v5 - 1;
  if( !v6 )
  {
    v16 = *(PVOID *)a3;
    NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
    v17 = *(_DWORD *)(a3 + 16);
    BaseAddress = v16;
    if( (v17 & 1) == 0 )
    {
      MmStoreFreeVirtualMemory(v16);
      v18 = *(void **)(a1 + 112);
      if( v18 )
        SmKmVirtualLockCtxMemoryUnlocked(v18, NumberOfBytesToUnlock);
    }
    goto LABEL_11;
  }
  v7 = v6 - 1;
  if( !v7 )
  {
    BaseAddress = *(PVOID *)a3;
    NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
    LODWORD(Context) = *(_DWORD *)(a3 + 20) & 1;
    SmFpAllocate(*(_QWORD *)(a1 + 120), 2i64, a1, 0i64, Context, v25, (UINT64)ThreadPtr[0]);
    v9 = v8;
    if( v8 )
    {
      v10 = *(unsigned int *)(a3 + 16);
      ThreadPtr[0] = KeGetCurrentThread();
      v11 = SmSetThreadPagePriority(ThreadPtr, v10);
      v12 = SmKmProbeAndLockAddress(BaseAddress, NumberOfBytesToUnlock, v9, 0);
      if( v12 == -1073741395 && (*(_DWORD *)(a3 + 20) & 1) != 0 )
      {
        LODWORD(Contexta) = 1;
        SmFpAllocate(*(_QWORD *)(a1 + 120), 4i64, a1, 0i64, Contexta, v26, (UINT64)ThreadPtr[0]);
        v21 = v20;
        v12 = SmKmProbeAndLockAddress(BaseAddress, NumberOfBytesToUnlock, v9, 1);
        if( v12 >= 0 )
          v9->Next = (_MDL *)v21;
        else
          SmFpFree(*(_QWORD *)(a1 + 120), 4i64, a1, v21);
      }
      if( v11 != *(_DWORD *)(a3 + 16) )
        SmSetThreadPagePriority(ThreadPtr, v11);
      if( v12 >= 0 )
      {
        LODWORD(Contexta) = *(_DWORD *)(a3 + 20) & 1;
        SmFpAllocate(*(_QWORD *)(a1 + 120), 5i64, a1, (INT64)v9, Contexta, v26, (UINT64)ThreadPtr[0]);
        BaseAddress = v13;
        if( v13 )
        {
          *(_QWORD *)(a3 + 24) = v9;
          goto LABEL_11;
        }
        v12 = -1073741670;
        SmKmUnlockMdl(v9, *(_QWORD *)(a1 + 120), a1);
      }
      SmFpFree(*(_QWORD *)(a1 + 120), 2i64, a1, (INT64)v9);
      goto LABEL_12;
    }
LABEL_24:
    v12 = -1073741670;
    goto LABEL_12;
  }
  v19 = v7 - 1;
  if( !v19 )
  {
    v12 = (*(__int64(__fastcall **)(INT64, _QWORD, _QWORD))a3)(a1, *(_QWORD *)(a3 + 8), 0i64);
    goto LABEL_12;
  }
  if( v19 != 1 )
  {
    v12 = -1073741811;
    goto LABEL_12;
  }
  BaseAddress = *(PVOID *)a3;
  NumberOfBytesToUnlock = *(_QWORD *)(a3 + 8);
  ZwUnlockVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &NumberOfBytesToUnlock, 1ui64);
LABEL_11:
  v12 = 0;
LABEL_12:
  *(_DWORD *)(a3 + 40) = v12;
}

Referenced by:

SmKmStoreHelperCommandCleanup
SmKmStoreHelperWorker