HalAllocateCommonBufferVector
NTSTATUS __stdcall HalAllocateCommonBufferVector(
INT64 a1,
UINT64 a2,
UINT64 a3,
_MEMORY_CACHING_TYPE a4,
UINT64 a5,
INT64 a6,
UINT64 a7,
INT64 a8,
INT64 *a9){
UINT64 v9;
_MDL *v10;
UINT8 *v11;
INT64 v12;
UINT64 v13;
INT64 v14;
unsigned __int8 CurrentIrql;
_HALP_ALLOC_CONTEXT *v17;
UINT8 *v18;
UINT8 *v19;
__int64 v20;
__int64 v21;
__int64 v22;
_HALP_ALLOC_CONTEXT *v23;
UINT8 *v24;
unsigned __int64 v25;
_LARGE_INTEGER v26;
int v27;
__int64 v28;
_MEMORY_CACHING_TYPE v29;
_MDL *PartitionNodePagesForMdl;
char *v31;
INT64 v32;
char *v33;
UINT8 *v34;
char *v35;
__int64 v36;
PDUMPWRITER_FILL_HEADERS *v37;
INT64 v38;
unsigned __int64 v39;
INT64 *v40;
_QWORD *v41;
__int64 v42;
_MDL *v43;
_MDL *Next;
unsigned __int8 v45;
UINT8 **v46;
unsigned __int64 v47;
__int64 v48;
_HALP_ALLOC_CONTEXT *v49;
UINT64 v50;
PVOID BugCheckParameter4;
UINT64 IdealNode;
UINT64 IdealNodea;
UINT64 Flags;
UINT8 *Memory;
INT64 v56;
INT64 v57;
PDUMPWRITER_FILL_HEADERS *v58;
UINT64 v60;
INT64 v61;
_MEMORY_CACHING_TYPE CacheType;
CacheType = a4;
v61 = a3;
v60 = a2;
v9 = a3;
v10 = 0i64;
v57 = 0i64;
v11 = 0i64;
v12 = 0i64;
v13 = a2;
v14 = a1;
CurrentIrql = KeGetCurrentIrql();
if( CurrentIrql > 2u )
KeBugCheckEx(0x1DCu, (PVOID)1, (PVOID)CurrentIrql, 0i64, 0i64);
if( (_DWORD)a6 )
return -1073741811;
v56 = *(_QWORD *)(a1 + 504);
if( HalpDmaReferenceDomainObject(v56, a2, (INT64 *)a3, a4) < 0 )
return -1073741670;
v18 = HalpMmAllocCtxAlloc(v17, 0x48ui64);
v19 = v18;
if( !v18 )
{
v33 = 0i64;
goto LABEL_42;
}
memset(v18, 0i64, 0x48u);
v20 = (unsigned int)a7;
v21 = (unsigned int)a7;
*((_QWORD *)v19 + 4) = v56;
v22 = 16 * v21;
v24 = HalpMmAllocCtxAlloc(v23, v22);
Memory = v24;
v11 = v24;
if( !v24 )
goto LABEL_40;
memset(v24, 0i64, v22);
*((_QWORD *)v19 + 8) = v11;
v25 = (a8 + 4095) & 0xFFFFFFFFFFFFF000ui64;
if( *(_DWORD *)(v56 + 64) != 2 )
{
v27 = 36;
v28 = 0i64;
while( 1i64 << v28 < v25 )
{
if( (unsigned __int64)++v28 >= 0x40 )
goto LABEL_15;
}
v25 = 1i64 << v28;
LABEL_15:
if( 1i64 << v28 == v25 )
{
v26.QuadPart = v25;
goto LABEL_17;
}
v11 = Memory;
LABEL_40:
v33 = 0i64;
goto LABEL_31;
}
v26.QuadPart = 0i64;
v27 = 20;
v13 = 0i64;
v9 = -1i64;
LABEL_17:
LODWORD(Flags) = v27;
*((_DWORD *)v19 + 6) = a7;
LODWORD(IdealNode) = a5;
v29 = CacheType;
v58 = (PDUMPWRITER_FILL_HEADERS *)(v25 * v20);
*((_QWORD *)v19 + 2) = v25;
PartitionNodePagesForMdl = MmAllocatePartitionNodePagesForMdlEx(
(_LARGE_INTEGER)v13,
(_LARGE_INTEGER)v9,
v26,
v25 * v20,
v29,
IdealNode,
Flags,
0i64);
v10 = PartitionNodePagesForMdl;
if( !PartitionNodePagesForMdl )
{
v33 = 0i64;
goto LABEL_30;
}
LODWORD(IdealNodea) = 1073741840;
LODWORD(BugCheckParameter4) = 0;
v31 = (char *)MmMapLockedPagesSpecifyCache(
PartitionNodePagesForMdl,
0,
CacheType,
0i64,
(UINT64)BugCheckParameter4,
IdealNodea);
v33 = v31;
if( !v31 )
goto LABEL_30;
*((_QWORD *)v19 + 5) = v10;
*((_QWORD *)v19 + 6) = v31;
if( v20 )
{
v34 = Memory;
v35 = v33;
v36 = v20;
do
{
*(_QWORD *)v34 = v35;
v35 += v25;
v34 += 16;
--v36;
}
while( v36 );
}
if( *(_DWORD *)(v56 + 64) != 2 )
{
if( v20 )
{
v41 = Memory + 8;
v42 = 8 * (v25 >> 12);
v43 = v10 + 1;
do
{
Next = v43->Next;
v43 = (_MDL *)((char *)v43 + v42);
*v41 = (_QWORD)Next << 12;
v41 += 2;
--v20;
}
while( v20 );
}
goto LABEL_35;
}
v37 = v58;
if( HalpDomainLaAllocate(v56, v58, v32, &v60, (INT64)&v61, (INT64)&v57) < 0 )
{
v12 = v57;
goto LABEL_30;
}
v39 = (unsigned __int64)v37 + 4095;
v12 = v57;
if( HalpIommuDomainMapLogical(*(_QWORD *)(v56 + 40), v38, (INT64)&v10[1], v39 >> 12, v57) < 0 )
{
LABEL_30:
v11 = Memory;
LABEL_31:
v14 = a1;
LABEL_42:
HalpDmaDereferenceDomainObject((PVOID)v56);
if( v19 )
HalpMmAllocCtxFree(v49, v19);
if( v11 )
HalpMmAllocCtxFree(v49, v11);
if( v10 )
{
if( v33 )
MmUnmapLockedPages(v33, v10);
MiFreePagesFromMdl(v10, 0i64, v50);
ExFreePoolWithTag(v10, 0);
}
if( v12 )
HalpDomainLaDelete(*(_QWORD *)(v14 + 504), v12);
return -1073741670;
}
if( v20 )
{
v40 = (INT64 *)(Memory + 8);
do
{
*v40 = v12;
v12 += v25;
v40 += 2;
--v20;
}
while( v20 );
}
LABEL_35:
v45 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v56 + 120));
v46 = (UINT8 **)(v56 + 104);
v47 = v45;
v48 = *(_QWORD *)(v56 + 104);
if( *(_QWORD *)(v48 + 8) != v56 + 104 )
__fastfail(3u);
*((_QWORD *)v19 + 1) = v46;
*(_QWORD *)v19 = v48;
*(_QWORD *)(v48 + 8) = v19;
*v46 = v19;
KxReleaseSpinLock((UINT64 *)(v56 + 120));
__writecr8(v47);
*a9 = (INT64)v19;
return 0;
}Referenced by:
No references.