HalpDmaAllocateChildAdapterV2
char *__fastcall HalpDmaAllocateChildAdapterV2(
unsigned int a1,
char a2,
char a3,
char a4,
char a5,
char a6,
char a7,
_DWORD *a8){
char v11;
_DWORD *v12;
__int64 v13;
__int64 *v14;
char *result;
int LocalScatterPool;
int v17;
__int64 Flags;
UINT64 Flagsa;
PVOID Object;
HANDLE Handle;
__int64 v22[4];
__int128 v23;
Object = 0i64;
Handle = 0i64;
v22[0] = 48i64;
v22[3] = 528i64;
v11 = 1;
v22[1] = 0i64;
if( !a3 )
v11 = a2;
v22[2] = 0i64;
v23 = 0i64;
if( (int)ObCreateObjectEx(0, HalpDmaAdapterObjectType, (__int64)v22, 0, Flags, 640, 0, 0, &Object, 0i64) < 0 )
return 0i64;
v12 = Object;
memset((INT64)Object, 0i64);
if( ObReferenceObjectByPointer(v12, 0x20000u, HalpDmaAdapterObjectType, 0) < 0 )
return 0i64;
LODWORD(Flagsa) = 0;
if( ObInsertObjectEx(v12, 0i64, 0x20000ui64, 0i64, Flagsa, 0i64, &Handle) < 0 )
return 0i64;
ZwClose(Handle);
*v12 = 41943041;
*((_QWORD *)v12 + 1) = &HalpDmaOperationsV2;
*((_BYTE *)v12 + 145) = a6;
*((_QWORD *)v12 + 15) = 0i64;
*((_QWORD *)v12 + 16) = 0i64;
*((_BYTE *)v12 + 144) = 0;
*((_QWORD *)v12 + 39) = 0i64;
*((_BYTE *)v12 + 338) = 0;
KeInitializeDeviceQueue((_KDEVICE_QUEUE *)(v12 + 44));
v12[56] = a1;
*((_BYTE *)v12 + 434) = a4;
*((_BYTE *)v12 + 440) = v11;
*((_BYTE *)v12 + 441) = a3;
*((_BYTE *)v12 + 437) = a7;
v12[93] = -1;
v12[94] = -1;
v12[37] = 2;
*((_BYTE *)v12 + 433) = a5 != 0;
if( a1 )
v13 = (1i64 << (v11 != 0 ? 32 : 24)) - 1;
else
v13 = -1i64;
*((_QWORD *)v12 + 17) = v13;
v14 = MasterAdapter24V2;
if( v11 )
v14 = MasterAdapterV2;
*((_QWORD *)v12 + 19) = v14;
if( *((_QWORD *)v12 + 17) < (unsigned __int64)v14[17] )
{
LABEL_12:
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
return 0i64;
}
if( a1 )
{
if( a4 )
LocalScatterPool = HalpDmaAllocateLocalScatterPool((PHYSICAL_ADDRESS *)v12, a1);
else
LocalScatterPool = HalpDmaAllocateLocalContiguousPool((__int64)v12, a1);
if( LocalScatterPool < 0 )
goto LABEL_12;
v17 = v12[56];
*((_BYTE *)v12 + 337) = 0;
}
else
{
v12[56] = 0;
v17 = 0;
*((_BYTE *)v12 + 337) = 1;
}
*a8 = v17;
result = (char *)v12;
*((_QWORD *)v12 + 63) = 0i64;
return result;
}Referenced by:
HalGetAdapterV2