SmFpPreAllocate

NTSTATUS __fastcall SmFpPreAllocate(INT64 *SpinLock, UINT64 *a2, UINT64 a3){
  __int64 v4; 
  UINT64 *v6; 
  int v7; 
  unsigned int v8; 
  __int64 v9; 
  VOID **PoolWithTag; 
  VOID **v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  void *MdlForLock; 
  unsigned int v15; 
  unsigned __int8 v16; 
  __int128 v17; 
  _SM_FORWARD_PROGRESS_CTX v18; 
  unsigned __int64 v19; 
  __int128 v20; 
  NTSTATUS v21; 
  _SM_FORWARD_PROGRESS_CTX FpContext[28]; 

  v4 = (unsigned int)a3;
  memset(FpContext, 0i64, sizeof(FpContext));
  FpContext[3] = 0;
  *(_QWORD *)&FpContext[6] = &FpContext[4];
  v6 = (UINT64 *)((char *)a2 + 4 * v4);
  LOWORD(FpContext[2]) = 1;
  *(_QWORD *)&FpContext[4] = &FpContext[4];
  BYTE2(FpContext[2]) = 6;
  while( 1 )
  {
    if( a2 >= v6 )
    {
      v16 = ExAcquireSpinLockExclusive(SpinLock);
      v17 = *(_OWORD *)&FpContext[12];
      v18 = FpContext[24];
      SpinLock[11] = *(_QWORD *)&FpContext[22];
      *((_OWORD *)SpinLock + 2) = *(_OWORD *)&FpContext[8];
      v19 = v16;
      v20 = *(_OWORD *)&FpContext[16];
      *((_OWORD *)SpinLock + 3) = v17;
      *((_DWORD *)SpinLock + 24) = v18;
      *((_OWORD *)SpinLock + 4) = v20;
      ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
      __writecr8(v19);
      return 0;
    }
    v7 = *(_DWORD *)a2;
    v8 = 0;
    v9 = *(_DWORD *)a2 & 0xF;
    *((_WORD *)&FpContext[22] + v9) = *(_DWORD *)a2 >> 4;
    if( (v7 & 0xFF00000) != 0 )
      break;
LABEL_11:
    a2 = (UINT64 *)((char *)a2 + 4);
  }
  while( 1 )
  {
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x10ui64, 1883663731i64);
    v11 = PoolWithTag;
    if( !PoolWithTag )
      break;
    *(_OWORD *)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(0x200ui64, (unsigned __int16)(v12 >> 4), 1883663731i64);
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 = *(VOID **)&FpContext[2 * v9 + 8];
    v15 = (unsigned __int8)(*(_DWORD *)a2 >> 20);
    *(_QWORD *)&FpContext[2 * v9 + 8] = v11;
    if( v8 >= v15 )
      goto LABEL_11;
  }
  SmFpCleanup(FpContext);
  v21 = -1073741670;
  if( v11 )
    ExFreePoolWithTag(v11, 0);
  return v21;
}

Referenced by:

SMKM_STORE::SmStStart
SMKM_STORE_MGR::SmStorePrepare
SmFirstTimeInit