SmFpPreAllocate

INT64 __fastcall SmFpPreAllocate(volatile INT64 *SpinLock, UINT64 *a2, UINT64 a3){
  __int64 v4; 
  UINT64 *v6; 
  int v7; 
  unsigned int v8; 
  __int64 v9; 
  _OWORD *PoolWithTag; 
  _QWORD *v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  void *MdlForLock; 
  unsigned int v15; 
  KIRQL v16; 
  __int128 v17; 
  int v18; 
  unsigned __int64 v19; 
  __int128 v20; 
  unsigned int v21; 
  INT64 result; 
  __int16 v24; 
  char v25; 
  int v26; 
  __int64 v27[2]; 
  __int128 v28[3]; 
  __int64 v29; 
  int v30; 
  v4 = (unsigned int)a3;
  memset((INT64)&result, 0i64);
  v26 = 0;
  v27[1] = (__int64)v27;
  v6 = (UINT64 *)((char *)a2 + 4 * v4);
  v24 = 1;
  v27[0] = (__int64)v27;
  v25 = 6;
  while( 1 )
  {
    if( a2 >= v6 )
    {
      v16 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SpinLock);
      v17 = v28[1];
      v18 = v30;
      *((_QWORD *)SpinLock + 11) = v29;
      *((_OWORD *)SpinLock + 2) = v28[0];
      v19 = v16;
      v20 = v28[2];
      *((_OWORD *)SpinLock + 3) = v17;
      *((_DWORD *)SpinLock + 24) = v18;
      *((_OWORD *)SpinLock + 4) = v20;
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
      __writecr8(v19);
      return 0;
    }
    v7 = *(_DWORD *)a2;
    v8 = 0;
    v9 = *(_DWORD *)a2 & 0xF;
    *((_WORD *)&v29 + v9) = *(_DWORD *)a2 >> 4;
    if( (v7 & 0xFF00000) != 0 )
      break;
LABEL_11:
    a2 = (UINT64 *)((char *)a2 + 4);
  }
  while( 1 )
  {
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x10ui64, 0x70466D73ui64);
    v11 = PoolWithTag;
    if( !PoolWithTag )
      break;
    *PoolWithTag = 0i64;
    v12 = *(unsigned int *)a2;
    v13 = *(_DWORD *)a2 & 0xF;
    if( v13 == 2 )
    {
      MdlForLock = SmKmAllocateMdlForLock((unsigned __int64)(unsigned __int16)(v12 >> 4) << 12);
      goto LABEL_9;
    }
    if( v13 != 3 )
    {
      if( v13 >= 5 )
        MdlForLock = MmAllocateMappingAddress((unsigned __int16)((unsigned int)v12 >> 4) << 12, 0x6D526D73ui64);
      else
        MdlForLock = ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned __int16)(v12 >> 4), 0x70466D73ui64);
LABEL_9:
      if( !MdlForLock )
        break;
      goto LABEL_10;
    }
    if( !(unsigned int)SmAcquireReleaseCharges((unsigned __int64)(unsigned __int16)(v12 >> 4) << 12, 1ui64, 0i64) )
      break;
    MdlForLock = (void *)(8i64 * (v8 + 1));
LABEL_10:
    v11[1] = MdlForLock;
    ++v8;
    *v11 = *((_QWORD *)v28 + v9);
    v15 = (unsigned __int8)(*(_DWORD *)a2 >> 20);
    *((_QWORD *)v28 + v9) = v11;
    if( v8 >= v15 )
      goto LABEL_11;
  }
  SmFpCleanup((INT64)&result);
  v21 = -1073741670;
  if( v11 )
    ExFreePoolWithTag(v11, 0);
  return v21;
}

Referenced by:

SMKM_STORE::SmStStart
SMKM_STORE_MGR::SmStorePrepare
SmFirstTimeInit