SmFpAllocate

VOID __fastcall SmFpAllocate(
        INT64 FpContext,
        INT64 ResourceType,
        INT64 a3,
        INT64 a4,
        VOID *Context,
        _MDL *Mdl,
        UINT64 DontFail){
  int v7; 
  void *MdlForLock; 
  unsigned __int64 v12; 
  void *v13; 
  ULONG Tag; 
  v7 = ResourceType;
  if( (int)ResourceType >= 5 )
  {
    if( (*(_BYTE *)(a4 + 10) & 5) == 0 )
    {
      MdlForLock = MmMapLockedPagesSpecifyCache((PMDL)a4, 0, MmCached, 0i64, 0, 0x40000010u);
      goto LABEL_6;
    }
    v12 = *(_QWORD *)(a4 + 24);
LABEL_7:
    if( v12 )
      return;
    goto LABEL_14;
  }
  if( (_DWORD)ResourceType == 2 )
  {
    MdlForLock = SmKmAllocateMdlForLock((unsigned __int64)*(unsigned __int16 *)(FpContext + 92) << 12);
    goto LABEL_6;
  }
  if( (_DWORD)ResourceType == 3 )
  {
    v12 = -(__int64)((unsigned int)SmAcquireReleaseCharges(
                                     (unsigned __int64)*(unsigned __int16 *)(FpContext + 94) << 12,
                                     1ui64,
                                     0i64) != 0) & 0xFFFFFFFFFFFFFFF8ui64;
    goto LABEL_7;
  }
  if( (_DWORD)ResourceType != 4 )
  {
    Tag = 810708339;
    HIBYTE(Tag) = ResourceType + 48;
    MdlForLock = ExAllocatePoolWithTag(
                   NonPagedPoolNx,
                   *(unsigned __int16 *)(FpContext + 2i64 * (int)ResourceType + 88),
                   Tag);
LABEL_6:
    v12 = (unsigned __int64)MdlForLock;
    goto LABEL_7;
  }
LABEL_14:
  if( (_DWORD)Context )
  {
    v13 = (void *)SmpFpWaitForResource(FpContext, (unsigned int)v7, (_ETHREAD *)a3);
    if( v7 >= 5 )
      MmMapLockedPagesWithReservedMapping(v13, 0x6D526D73ui64, (MDL *)a4, MmCached);
  }
}

Referenced by:

SMKM_STORE::SmStMapPhysicalRegion
SMKM_STORE::SmStReadThread
SMKM_STORE_MGR::SmIoCtxPrepareToQueue
SMKM_STORE_MGR::SmPageRead
SMKM_STORE_MGR::SmpPageEvict
SmKmStoreHelperCommandProcess