HalpAllocateCommonBufferThin
INT64 __fastcall HalpAllocateCommonBufferThin(
PVOID BugCheckParameter3,
INT64 *a2,
INT64 *a3,
UINT64 a4,
CHAR a5,
INT64 a6,
UINT64 IdealNode,
INT64 a8,
INT64 a9){
MDL *v9;
UINT64 v12;
PVOID v14;
int v15;
__int64 v16;
MEMORY_CACHING_TYPE CacheType;
unsigned int v18;
LARGE_INTEGER v19;
LARGE_INTEGER v20;
struct _MDL *PagesForMdl;
INT64 v22;
UINT64 *p_a4a;
INT64 *v24;
int v25;
INT64 v26;
INT64 v27;
unsigned int v28;
_QWORD *PoolWithTag;
UINT64 v30;
unsigned __int64 v31;
UINT64 *v33;
unsigned __int64 *v34;
unsigned __int8 v35;
unsigned __int64 v36;
unsigned __int64 v37;
bool v38;
unsigned __int64 v39;
UINT64 Flags;
UINT64 v41;
INT64 v42;
UINT64 a4a;
INT64 v44;
v44 = 0i64;
v9 = 0i64;
v42 = 0i64;
a4a = 0i64;
v12 = (unsigned int)a4;
v14 = 0i64;
v15 = HalpDmaReferenceDomainObject((INT64)BugCheckParameter3);
if( v15 < 0 )
return(unsigned int)v15;
v16 = *((_QWORD *)BugCheckParameter3 + 9);
if( v16 )
*(_BYTE *)(v16 + 516) = 1;
CacheType = MmCached;
if( a6 )
{
CacheType = *(_DWORD *)a6;
if( *(_DWORD *)a6 > 1u )
{
v15 = -1073741811;
LABEL_27:
HalpDmaDereferenceDomainObject(BugCheckParameter3);
if( v14 )
MmUnmapLockedPages(v14, v9);
if( v9 )
MiFreePagesFromMdl(v9, 0i64);
return(unsigned int)v15;
}
}
if( (a5 & 1) != 0 )
{
v18 = 1;
v12 = ((_DWORD)v12 + 0x1FFFFF) & 0xFFE00000;
do
{
if( 1i64 << v18 >= (unsigned __int64)(unsigned int)v12 )
break;
++v18;
}
while( v18 < 0x3F );
}
v19 = *(LARGE_INTEGER *)((char *)BugCheckParameter3 + 24);
v20 = *(LARGE_INTEGER *)((char *)BugCheckParameter3 + 16);
if( (_DWORD)IdealNode == 0x80000000 )
{
PagesForMdl = MmAllocatePagesForMdlEx(0i64, (MEMORY_CACHING_TYPE)v20.LowPart, v19.LowPart);
}
else
{
LODWORD(v41) = 20;
LODWORD(Flags) = IdealNode;
PagesForMdl = MmAllocatePartitionNodePagesForMdlEx(0i64, v20, v19, v12, CacheType, Flags, v41, 0i64);
}
v9 = PagesForMdl;
if( !PagesForMdl || (v14 = MmMapLockedPagesSpecifyCache(PagesForMdl, 0, CacheType, 0i64, 0, 0x40000010u)) == 0i64 )
{
v15 = -1073741670;
goto LABEL_27;
}
p_a4a = 0i64;
v24 = 0i64;
if( a2 )
{
p_a4a = &a4a;
a4a = *a2;
}
if( a3 )
{
v24 = &v44;
v44 = *a3;
}
v25 = HalpDomainLaAllocate((INT64)BugCheckParameter3, v12, v22, p_a4a, (INT64)v24, (INT64)&v42);
v27 = v42;
v15 = v25;
if( v25 < 0
|| (v28 = v9->ByteCount + v9->ByteOffset,
v15 = HalpIommuDomainMapLogical(
*((_QWORD *)BugCheckParameter3 + 5),
v26,
(INT64)&v9[1],
(v28 >> 12) + ((v28 & 0xFFF) != 0),
v42),
v15 < 0) )
{
LABEL_25:
if( v27 )
HalpDomainLaDelete((INT64)BugCheckParameter3, v27);
goto LABEL_27;
}
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x28ui64, 0x206C6148ui64);
v31 = (unsigned __int64)PoolWithTag;
if( !PoolWithTag )
{
v15 = -1073741670;
goto LABEL_25;
}
v33 = (UINT64 *)((char *)BugCheckParameter3 + 96);
PoolWithTag[3] = v9;
PoolWithTag[4] = BugCheckParameter3;
KeAcquireSpinLockRaiseToDpc((UINT64 *)BugCheckParameter3 + 12, v30);
v34 = (unsigned __int64 *)((char *)BugCheckParameter3 + 80);
v36 = v35;
v37 = *v34;
if( (v34[1] & 1) != 0 && v37 )
v37 ^= (unsigned __int64)v34;
v38 = 0;
if( v37 )
{
while( 1 )
{
if( *(_QWORD *)(*(_QWORD *)(v37 + 24) + 24i64) <= (unsigned __int64)v14 )
{
v39 = *(_QWORD *)(v37 + 8);
if( (v34[1] & 1) != 0 )
{
if( !v39 )
goto LABEL_47;
v39 ^= v37;
}
if( !v39 )
{
LABEL_47:
v38 = 1;
break;
}
}
else
{
v39 = *(_QWORD *)v37;
if( (v34[1] & 1) != 0 )
{
if( !v39 )
break;
v39 ^= v37;
}
if( !v39 )
break;
}
v37 = v39;
}
}
RtlRbInsertNodeEx(v34, v37, v38, v31);
KxReleaseSpinLock(v33);
__writecr8(v36);
*(_QWORD *)a8 = v27;
*(_QWORD *)a9 = v14;
return(unsigned int)v15;
}Referenced by:
HalAllocateCommonBufferExThin
HalAllocateCommonBufferWithBoundsThin
HalAllocateDomainCommonBufferThin