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