HalpDmaAllocateChildAdapterV3
char *__fastcall HalpDmaAllocateChildAdapterV3(
unsigned int a1,
int a2,
unsigned int a3,
char a4,
char a5,
char a6,
char a7,
int a8,
__int64 a9,
int a10,
_DEVICE_OBJECT *a11,
_DWORD *a12){
INT64 *v12;
_DWORD *v13;
int SecurityPolicy;
int v15;
unsigned int v16;
_DEVICE_OBJECT *v17;
int v18;
__int64 v19;
__int64 *v20;
unsigned __int64 v21;
int LocalScatterPool;
int v24;
__int64 v25;
int v26;
INT64 *AdapterByDeviceId;
char v28;
INT64 v29;
void *v30;
int Device;
char v32;
__int64 v33;
UINT64 v34;
__int16 v35;
PVOID Object;
HANDLE Handle;
__int64 v38[4];
__int128 v39;
INTERFACE result[2];
unsigned int(__fastcall *v41)(void *, _DEVICE_OBJECT *, __int64, _DEVICE_OBJECT **);
v38[0] = 48i64;
Handle = 0i64;
v38[3] = 528i64;
v12 = 0i64;
v35 = 0;
v13 = 0i64;
Object = 0i64;
memset((INT64)result, 0i64);
SecurityPolicy = HalpIommuGetSecurityPolicy();
v38[1] = 0i64;
v15 = 640;
v38[2] = 0i64;
v16 = 0;
v39 = 0i64;
if( !a5 )
{
v16 = 6 * (a8 + 1);
v15 = v16 * 4 + 640;
}
v17 = a11;
v18 = a10;
if( a11 || !a10 || SecurityPolicy != 1 )
{
a11 = 0i64;
if( v17 && a10 )
{
if( HalpDmaGetIommuInterface(v17, result) < 0 )
{
if( SecurityPolicy == 1 )
return(char *)v13;
}
else
{
HIBYTE(v35) = 1;
if( v41(result[0].Context, 0i64, 0i64, &a11) == -1073741789 && a11 )
{
v15 += (int)a11;
}
else
{
if( SecurityPolicy == 1 )
goto LABEL_27;
a11 = 0i64;
}
}
}
if( (int)ObCreateObjectEx(0, HalpDmaAdapterObjectType, (__int64)v38, 0, v33, v15, 0, 0, &Object, 0i64) < 0 )
goto LABEL_25;
v13 = Object;
memset((INT64)Object, 0i64);
if( ObReferenceObjectByPointer(v13, 0x20000u, HalpDmaAdapterObjectType, 0) < 0 )
goto LABEL_25;
LODWORD(v34) = 0;
if( ObInsertObjectEx(v13, 0i64, 0x20000ui64, 0i64, v34, 0i64, &Handle) < 0 )
goto LABEL_25;
ZwClose(Handle);
v19 = 0i64;
*((_QWORD *)v13 + 1) = &HalpDmaOperationsV3;
v20 = MasterAdapter24V3;
*((_BYTE *)v13 + 145) = a6;
*v13 = 41943041;
if( a3 >= 0x20 )
v20 = MasterAdapterV3;
*((_QWORD *)v13 + 15) = 0i64;
*((_QWORD *)v13 + 16) = 0i64;
*((_BYTE *)v13 + 144) = 0;
*((_QWORD *)v13 + 19) = v20;
if( a3 < 0x40 )
v21 = (1i64 << a3) - 1;
else
v21 = -1i64;
*((_QWORD *)v13 + 17) = v21;
if( v21 < v20[17] )
{
LABEL_24:
HalPutDmaAdapter((PADAPTER_OBJECT)v13);
LABEL_25:
v13 = 0i64;
goto LABEL_26;
}
*((_QWORD *)v13 + 39) = 0i64;
*((_BYTE *)v13 + 338) = 0;
*((_QWORD *)v13 + 24) = v13 + 46;
*((_QWORD *)v13 + 23) = v13 + 46;
*((_QWORD *)v13 + 22) = 0i64;
*((_BYTE *)v13 + 216) = 0;
v13[56] = a1;
*((_BYTE *)v13 + 434) = a4;
*((_BYTE *)v13 + 437) = a7;
*((_QWORD *)v13 + 56) = a9;
*((_BYTE *)v13 + 433) = a5;
v13[94] = -1;
v13[110] = a3;
v13[155] = v16 * 4;
v13[37] = 3;
v13[154] = 0;
*((_QWORD *)v13 + 70) = 0i64;
*((_QWORD *)v13 + 72) = v13 + 142;
*((_QWORD *)v13 + 71) = v13 + 142;
*((_BYTE *)v13 + 584) = 0;
v13[152] = 0;
*((_QWORD *)v13 + 61) = IoFreeAdapterChannelV3Passive;
*((_QWORD *)v13 + 62) = v13;
*((_QWORD *)v13 + 59) = 0i64;
if( a1 )
{
if( a4 )
LocalScatterPool = HalpDmaAllocateLocalScatterPool((PHYSICAL_ADDRESS *)v13, a1);
else
LocalScatterPool = HalpDmaAllocateLocalContiguousPool((__int64)v13, a1);
v19 = 0i64;
if( LocalScatterPool < 0 )
goto LABEL_24;
v24 = v13[56];
*((_BYTE *)v13 + 337) = 0;
}
else
{
v13[56] = 0;
v24 = 0;
*((_BYTE *)v13 + 337) = 1;
}
*a12 = v24;
v13[61] = a2;
v13[128] = 0;
*((_QWORD *)v13 + 65) = v17;
if( a11 && HIBYTE(v35) )
{
v25 = (__int64)&v13[v16 + 160];
*((_QWORD *)v13 + 66) = v25;
v26 = v41(result[0].Context, a11, v25, 0i64);
v19 = 0i64;
if( v26 >= 0 )
{
AdapterByDeviceId = HalpDmaFindAdapterByDeviceId(*((_QWORD *)v13 + 66));
v19 = 0i64;
v12 = AdapterByDeviceId;
if( AdapterByDeviceId )
{
if( (_DEVICE_OBJECT *)AdapterByDeviceId[65] != v17 )
{
ExAcquirePushLockExclusiveEx((UINT64)(AdapterByDeviceId + 39), 0i64);
LOBYTE(v35) = 1;
}
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
v19 = 0i64;
}
if( a10 == 2 )
{
v28 = ((__int64(__fastcall *)(_QWORD, _QWORD))off_140C00A38[0])(*((_QWORD *)v13 + 66), 0i64);
v19 = 0i64;
if( v28 )
goto LABEL_52;
v18 = 0;
}
}
else
{
*((_QWORD *)v13 + 66) = 0i64;
if( SecurityPolicy == 1 )
goto LABEL_61;
}
}
if( !v18 )
{
LABEL_56:
*((_QWORD *)v13 + 63) = v19;
if( (int)HalJoinDmaDomain((__int64)v13, -1i64) >= 0
|| SecurityPolicy != 1 && v13[128] && (v13[128] = 0, (int)HalJoinDmaDomain((__int64)v13, -1i64) >= 0) )
{
v32 = v35;
if( v12 )
*((_BYTE *)v12 + 338) = v35;
*(_QWORD *)(*((_QWORD *)v13 + 63) + 72i64) = v13;
goto LABEL_67;
}
HalpIommuDeleteDevice((UINT64 *)v13 + 67);
LABEL_61:
HalPutDmaAdapter((PADAPTER_OBJECT)v13);
v32 = v35;
v13 = 0i64;
Object = 0i64;
LABEL_67:
if( v32 )
{
if( (_InterlockedExchangeAdd64(v12 + 39, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v12 + 39);
KeAbPostRelease(v12 + 39);
v13 = Object;
}
LABEL_26:
if( !HIBYTE(v35) )
{
LABEL_28:
if( v13 && HalpDmaIsThinApiCapable((INT64)v13) )
*((_QWORD *)v13 + 1) = &HalpDmaOperationsThin;
return(char *)v13;
}
LABEL_27:
result[0].InterfaceDereference(result[0].Context);
goto LABEL_28;
}
LABEL_52:
v29 = *((_QWORD *)v13 + 66);
if( v29 && !HalpIommuCheckExceptionList(v29) )
{
Device = HalpIommuCreateDevice(v30);
v19 = 0i64;
if( Device < 0 )
{
if( SecurityPolicy == 1 )
goto LABEL_61;
}
else
{
v13[128] = v18;
}
}
goto LABEL_56;
}
return(char *)v13;
}Referenced by:
HalGetAdapterV3