SmKmStoreHelperCommandProcess

VOID __stdcall SmKmStoreHelperCommandProcess(
        _SMKM_STORE_HELPER *Helper,
        _SMKM_STORE_HELPER_COMMAND Command,
        _SMKM_STORE_HELPER_PARAMS *Params){
  __int32 v5; 
  __int32 v6; 
  __int32 v7; 
  struct _MDL *v8; 
  UINT64 v9; 
  unsigned int v10; 
  NTSTATUS v11; 
  VOID *v12; 
  VOID *v13; 
  _SMKM_STORE_HELPER_PARAMS v14; 
  VOID *v15; 
  __int32 v16; 
  _MDL *v17; 
  NTSTATUS v18; 
  UINT64 DontFail; 
  UINT64 DontFaila; 
  VOID *ThreadPtr[2]; 
  VOID *BaseAddress; 
  UINT64 RegionSize; 

  BaseAddress = 0i64;
  RegionSize = 0i64;
  v5 = Command - 2;
  if( !v5 )
  {
    RegionSize = *((_QWORD *)Params + 1);
    BaseAddress = MmStoreAllocateVirtualMemory(RegionSize);
    v12 = BaseAddress;
    if( BaseAddress )
    {
      if( *((_QWORD *)Helper + 14) )
      {
        if( (Params[8] & 1) == 0 )
        {
          v18 = SmKmVirtualLockCtxLockMemory(*((VOID **)Helper + 14), BaseAddress, RegionSize);
          v12 = BaseAddress;
          v11 = v18;
          if( v18 < 0 )
          {
            MmStoreFreeVirtualMemory(BaseAddress);
            goto LABEL_12;
          }
        }
      }
      *((_QWORD *)Params + 3) = v12;
      goto LABEL_11;
    }
    goto LABEL_24;
  }
  v6 = v5 - 1;
  if( !v6 )
  {
    v13 = *(VOID **)Params;
    RegionSize = *((_QWORD *)Params + 1);
    v14 = Params[4];
    BaseAddress = v13;
    if( (v14 & 1) == 0 )
    {
      MmStoreFreeVirtualMemory(v13);
      v15 = (VOID *)*((_QWORD *)Helper + 14);
      if( v15 )
        SmKmVirtualLockCtxMemoryUnlocked(v15, RegionSize);
    }
    goto LABEL_11;
  }
  v7 = v6 - 1;
  if( !v7 )
  {
    BaseAddress = *(VOID **)Params;
    RegionSize = *((_QWORD *)Params + 1);
    LODWORD(DontFail) = Params[5] & 1;
    v8 = (struct _MDL *)SmFpAllocate(
                          *((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
                          SmFpResourceLockMdl,
                          Helper,
                          0i64,
                          DontFail);
    if( v8 )
    {
      v9 = (unsigned int)Params[4];
      ThreadPtr[0] = KeGetCurrentThread();
      v10 = SmSetThreadPagePriority(ThreadPtr, v9);
      v11 = SmKmProbeAndLockAddress(BaseAddress, RegionSize, v8, 0);
      if( v11 == -1073741395 && (Params[5] & 1) != 0 )
      {
        LODWORD(DontFaila) = 1;
        v17 = (_MDL *)SmFpAllocate(
                        *((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
                        SmFpResourceReserveMmPages,
                        Helper,
                        0i64,
                        DontFaila);
        v11 = SmKmProbeAndLockAddress(BaseAddress, RegionSize, v8, 1u);
        if( v11 >= 0 )
          v8->Next = v17;
        else
          SmFpFree(*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), SmFpResourceReserveMmPages, Helper, v17);
      }
      if( v10 != Params[4] )
        SmSetThreadPagePriority(ThreadPtr, v10);
      if( v11 >= 0 )
      {
        LODWORD(DontFaila) = Params[5] & 1;
        BaseAddress = SmFpAllocate(
                        *((_SM_FORWARD_PROGRESS_CTX **)Helper + 15),
                        SmFpResourceMapping,
                        Helper,
                        v8,
                        DontFaila);
        if( BaseAddress )
        {
          *((_QWORD *)Params + 3) = v8;
          goto LABEL_11;
        }
        v11 = -1073741670;
        SmKmUnlockMdl(v8, *((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), Helper);
      }
      SmFpFree(*((_SM_FORWARD_PROGRESS_CTX **)Helper + 15), SmFpResourceLockMdl, Helper, v8);
      goto LABEL_12;
    }
LABEL_24:
    v11 = -1073741670;
    goto LABEL_12;
  }
  v16 = v7 - 1;
  if( !v16 )
  {
    v11 = (*(__int64(__fastcall **)(_SMKM_STORE_HELPER *, _QWORD, _QWORD))Params)(
            Helper,
            *((_QWORD *)Params + 1),
            0i64);
    goto LABEL_12;
  }
  if( v16 != 1 )
  {
    v11 = -1073741811;
    goto LABEL_12;
  }
  BaseAddress = *(VOID **)Params;
  RegionSize = *((_QWORD *)Params + 1);
  ZwUnlockVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 1ui64);
LABEL_11:
  v11 = 0;
LABEL_12:
  Params[10] = v11;
}

Referenced by:

SmKmStoreHelperCommandCleanup
SmKmStoreHelperWorker