HalpMmAllocCtxAlloc

UINT8 *__stdcall HalpMmAllocCtxAlloc(_HALP_ALLOC_CONTEXT *Context, UINT64 Size){
  __int64 v2; 
  UINT64 v3; 
  UINT64 v4; 
  UINT64 v5; 
  unsigned __int8 v6; 
  VOID **v7; 
  unsigned __int64 v8; 
  unsigned int v9; 
  unsigned int v10; 
  char *v11; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 v14; 
  int v15; 
  unsigned int v16; 
  unsigned int v17; 
  char *v18; 
  unsigned __int64 *v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  int v23; 
  unsigned __int64 v24; 
  unsigned int v25; 
  bool v26; 
  unsigned int v27; 
  unsigned int v28; 
  __int64 v29; 
  VOID **v30; 
  VOID ***v31; 
  __int64 v32; 
  unsigned int v34; 
  bool v35; 
  bool v36; 
  __int64 v37; 
  unsigned int v38; 
  __int64 v39; 
  unsigned __int64 v40; 
  __int64 v41; 
  int v42; 
  unsigned int v43; 
  unsigned __int64 *v44; 
  __int64 v45; 
  __int64 v46; 
  int v47; 
  unsigned __int64 *v48; 
  __int64 v49; 
  unsigned int v50; 
  unsigned __int64 v51; 
  unsigned __int64 v52; 
  int v53; 
  __int64 v54; 
  __int64 v55; 
  __int64 v56; 
  int i; 
  char *v58; 
  unsigned int v59; 

  v2 = 0i64;
  if( !Size )
    KeBugCheckEx(0xACu, 0i64, (PVOID)0xA0A0, "minkernel\\hals\\lib\\mm\\memory.c", (PVOID)0xC04);
  v3 = (Size + 15) & 0xFFFFFFFFFFFFFFF0ui64;
  v4 = v3 + 16;
  if( v3 >= 0x1000 )
    v4 = (Size + 15) & 0xFFFFFFFFFFFFFFF0ui64;
  v5 = v4 >> 4;
  if( v4 >= 0x1000 )
  {
    v4 = (v4 + 4095) & 0xFFFFFFFFFFFFF000ui64;
    v7 = HalpMmAllocCtxAllocBuffer(4096i64, v4);
    if( !v7 )
      return(UINT8 *)v2;
LABEL_29:
    v29 = 0i64;
    LOBYTE(v8) = KeAcquireSpinLockRaiseToDpc(qword_140C4B790);
    goto LABEL_22;
  }
  v6 = KeAcquireSpinLockRaiseToDpc(qword_140C4B790);
  v7 = (VOID **)qword_140C4B780;
  v8 = v6;
  while( 1 )
  {
    if( v7 == &qword_140C4B780 )
    {
      KxReleaseSpinLock(qword_140C4B790);
      __writecr8(v8);
      v7 = HalpMmAllocCtxAllocBuffer(v55, 0x4000ui64);
      if( !v7 )
        return(UINT8 *)v2;
      goto LABEL_29;
    }
    v9 = *((_DWORD *)v7 + 8);
    v11 = (char *)v7[5];
    v10 = *((_DWORD *)v7 + 6);
    v12 = v10 < v9 ? v10 : 0;
    v13 = v9 - 1;
    if( !(_DWORD)v5 )
    {
      v28 = v12 & 0xFFFFFFF8;
      goto LABEL_21;
    }
    v14 = (unsigned __int64)v7[5] & 4;
    v56 = v14;
    v15 = v14 != 0 ? 0x20 : 0;
    for( i = v15; ; v15 = i )
    {
      v16 = v15 + v13;
      v17 = v15 + v12;
      v18 = &v11[-(v14 != 0 ? 4 : 0)];
      v58 = v18;
      if( v13 - v12 + 1 >= (unsigned int)v5 )
        break;
      v27 = -1;
LABEL_33:
      if( !v12 )
        goto LABEL_20;
      v11 = (char *)v7[5];
      v34 = v5 + v10;
      v12 = 0;
      if( (unsigned int)v5 + v10 > v9 )
        v34 = v9;
      v13 = v34 - 1;
    }
    v19 = (unsigned __int64 *)&v18[8 * ((unsigned __int64)v17 >> 6)];
    v20 = ((1i64 << (v17 & 0x3F)) - 1) | *v19;
    v59 = v16 - v5 + 1;
    v21 = (unsigned __int64)v59 >> 6;
    v22 = (unsigned __int64)&v18[8 * v21];
    if( (unsigned int)v5 > 0x7F )
    {
      v40 = v22 + 8;
      if( (v59 & 0x3F) == 0 )
        v40 = (unsigned __int64)&v18[8 * v21];
      if( v20 )
      {
        if( *++v19 )
        {
          v43 = v59;
          goto LABEL_65;
        }
        v36 = !_BitScanReverse64((unsigned __int64 *)&v41, v20);
        if( v36 )
          v42 = 64;
        else
          v42 = 63 - v41;
      }
      else
      {
        v42 = 0;
      }
      v43 = v59;
LABEL_61:
      v27 = ((unsigned int)(((char *)v19 - v18) >> 3) << 6) - v42;
      if( v27 > v43 )
        goto LABEL_31;
      v44 = &v19[(unsigned int)(v5 - v42) >> 6];
      while( ++v19 != v44 )
      {
        if( *v19 )
          goto LABEL_65;
      }
      if( (((_BYTE)v5 - (_BYTE)v42) & 0x3F) != 0 )
      {
        v36 = !_BitScanForward64((unsigned __int64 *)&v46, *v19);
        if( v36 )
          LODWORD(v46) = 64;
        if( (unsigned int)v46 < (((_BYTE)v5 - (_BYTE)v42) & 0x3Fu) )
        {
LABEL_65:
          while( (unsigned __int64)v19 <= v40 )
          {
            if( !*++v19 )
            {
              v36 = !_BitScanReverse64((unsigned __int64 *)&v45, *(v19 - 1));
              if( v36 )
                v42 = 64;
              else
                v42 = 63 - v45;
              goto LABEL_61;
            }
          }
          goto LABEL_31;
        }
      }
    }
    else
    {
      v23 = 64;
      if( (unsigned int)v5 >= 0x40 )
      {
        do
        {
LABEL_40:
          v35 = v20 < 0;
          do
          {
            if( v35 )
            {
              if( (unsigned __int64)++v19 > v22 )
                goto LABEL_31;
              v20 = *v19;
              goto LABEL_40;
            }
            v36 = !_BitScanReverse64((unsigned __int64 *)&v37, v20);
            if( !v36 )
              v23 = 63 - v37;
            v27 = (((unsigned int)(((char *)v19 - v18) >> 3) + 1) << 6) - v23;
            if( v27 > v59 )
              goto LABEL_31;
            v38 = v5 - v23;
            if( (_DWORD)v5 == v23 )
              goto LABEL_18;
            ++v19;
            v23 = 64;
            v20 = *v19;
            if( v38 < 0x40 )
              goto LABEL_50;
            v35 = v20 < 0;
          }
          while( v20 );
          v38 -= 64;
          if( !v38 )
            break;
          v20 = *++v19;
LABEL_50:
          v36 = !_BitScanForward64((unsigned __int64 *)&v39, v20);
          if( v36 )
            LODWORD(v39) = 64;
        }
        while( (unsigned int)v39 < v38 );
      }
      else
      {
        if( (unsigned int)v5 > 1 )
        {
          v47 = 0;
          v48 = (unsigned __int64 *)&v18[8 * ((unsigned __int64)v16 >> 6)];
          while( v20 != -1 )
          {
LABEL_79:
            v36 = !_BitScanForward64((unsigned __int64 *)&v49, v20);
            if( v36 )
              LODWORD(v49) = 64;
            if( v47 + (int)v49 >= (unsigned int)v5 )
            {
              v53 = -v47;
LABEL_86:
              v27 = ((unsigned int)(((char *)v19 - v58) >> 3) << 6) + v53;
              v26 = v27 <= v59;
              goto LABEL_17;
            }
            v50 = v4 >> 4;
            v51 = ~v20;
            while( 1 )
            {
              v51 &= v51 >> (v50 >> 1);
              if( !v51 )
                break;
              v50 -= v50 >> 1;
              if( v50 <= 1 )
              {
                _BitScanForward64(&v52, v51);
                v53 = v52;
                goto LABEL_86;
              }
            }
            if( v19 == v48 )
              goto LABEL_31;
            v36 = !_BitScanReverse64((unsigned __int64 *)&v54, v20);
            if( v36 )
              v47 = 64;
            else
              v47 = 63 - v54;
            v20 = *++v19;
          }
          while( (unsigned __int64)++v19 <= v22 )
          {
            v20 = *v19;
            if( *v19 != -1i64 )
            {
              v47 = 0;
              goto LABEL_79;
            }
          }
LABEL_31:
          v27 = -1;
LABEL_32:
          v10 = *((_DWORD *)v7 + 6);
          v14 = v56;
          v9 = *((_DWORD *)v7 + 8);
          goto LABEL_33;
        }
        while( v20 == -1 )
        {
          if( (unsigned __int64)++v19 > v22 )
            goto LABEL_31;
          v20 = *v19;
        }
        _BitScanForward64(&v24, ~v20);
        v25 = v24 + ((unsigned int)(((char *)v19 - v18) >> 3) << 6);
        v26 = v25 <= v59;
        v27 = v25;
LABEL_17:
        if( !v26 )
          goto LABEL_31;
      }
    }
LABEL_18:
    if( v27 == -1 )
      goto LABEL_32;
    v27 -= i;
LABEL_20:
    v28 = v27;
LABEL_21:
    v29 = v28;
    if( v28 != 0xFFFFFFFFi64 )
      break;
    v7 = (VOID **)*v7;
  }
LABEL_22:
  RtlSetBits((_RTL_BITMAP *)v7 + 2, (unsigned int)v29, (unsigned int)v5);
  *((_DWORD *)v7 + 6) = v5 + v29;
  v30 = (VOID **)*v7;
  v31 = (VOID ***)v7[1];
  if( *((VOID ***)*v7 + 1) != v7
    || *v31 != v7
    || (*v31 = v30, v30[1] = v31, v32 = qword_140C4B780, *(_QWORD **)(qword_140C4B780 + 8i64) != &qword_140C4B780) )
  {
    __fastfail(3u);
  }
  *v7 = (VOID *)qword_140C4B780;
  v7[1] = &qword_140C4B780;
  *(_QWORD *)(v32 + 8) = v7;
  qword_140C4B780 = v7;
  KxReleaseSpinLock(qword_140C4B790);
  __writecr8((unsigned __int8)v8);
  v2 = (__int64)v7[2] + 16 * v29;
  if( v4 >= 0x1000 )
  {
    *((_DWORD *)v7 + 7) = v5;
  }
  else
  {
    *(_QWORD *)v2 = v7;
    *(_DWORD *)(v2 + 8) = v5;
    v2 += 16i64;
  }
  return(UINT8 *)v2;
}

Referenced by:

Amd64AddProfileSource
EmonAddProfileSource
EmonAllocateResources
ExtEnvAllocateMemory
ExtEnvAllocatePhysicalMemory
HalAllocateCommonBufferVector
HalInitializeBios
HalpAcpiAllocateMemory
HalpAcpiPopulateTableCache
HalpAllocatePmcCounterSet
HalpBuildResumeStructures
HalpCmciInitializeErrorPacket
HalpDmaAllocateEmergencyResources
HalpDmaAllocateLocalContiguousPool
HalpDmaAllocateLocalScatterPool
HalpDmaAllocateMapRegisters
HalpDmaAllocateMappingResources
HalpDmaAllocateNewTranslationBuffer
HalpDmaAllocateReservedMapping
HalpDmaAllocateReservedMappingArray
HalpDmaAllocateTranslationBuffer
HalpDmaInitializeControllers
HalpDmaInitializeMasterAdapter
HalpHvInitMcaPcrContext
HalpHvInitMcaStatusMsrCache
HalpInitMemoryCachingRequirementsTable
HalpInterruptSetLineSpecificOverride
HalpIommuAllocateAndZeroPageTable
HalpIommuAllocateDmaDomain
HalpIommuCloneDeviceId
HalpIommuCreateDevice
HalpIommuCreateDmarPageTable
HalpIommuCreateIncreaseAliasTrack
HalpIommuGetDeviceId
HalpIommuGetHardwareDomain
HalpIommuTraceFault
HalpLaAddReservation
HalpLaInitializeState
HalpLapSplitNode
HalpMapCR3Ex
HalpMapNvsArea
HalpMcaInitializePcrContext
HalpMceInitializeErrorPacket
HalpNumaAddRangeProximity
HalpPteReserveResources
HalpRegisterUsbController
HalpTscReserveResources
IommuDomainAttachDevice
IommuEnableDevicePasid
IommuGetLibraryContext
IommuMapDevice
IommupGetSystemContext