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