HalpIommuCreateDevice

NTSTATUS __stdcall HalpIommuCreateDevice(VOID *Src){
  int v1; 
  UINT8 **v2; 
  _BYTE *v3; 
  VOID *v4; 
  _BYTE *v5; 
  UINT8 **v6; 
  _KDEVICE_QUEUE *v7; 
  _HALP_ALLOC_CONTEXT *v8; 
  _LIST_ENTRY *i; 
  __int64 v10; 
  UINT8 *v11; 
  _LIST_ENTRY *v12; 
  NTSTATUS AcpiDeviceMapping; 
  _HALP_ALLOC_CONTEXT *v14; 
  UINT8 *v15; 
  UINT8 *v16; 
  _HALP_ALLOC_CONTEXT *v17; 
  VOID *v18; 
  UINT64 v19; 
  UINT8 v20; 
  int v21; 
  UINT8 v22; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *Flink; 
  _HALP_ALLOC_CONTEXT *v25; 
  UINT8 DmaOperation; 
  __int64 v28; 
  INT64 v29; 
  ULONG SortKey[4]; 
  __int64 v31; 
  int v33; 
  UINT8 **v34; 
  VOID *v35; 

  v34 = v2;
  v33 = v1;
  v4 = 0i64;
  v29 = 0i64;
  v28 = 0i64;
  v31 = 0i64;
  v5 = v3;
  v35 = 0i64;
  v6 = v2;
  v7 = (_KDEVICE_QUEUE *)Src;
  *(_OWORD *)SortKey = 0i64;
  if( v3 )
    *v3 = 0;
  ExAcquirePushLockExclusiveEx(&stru_140C49BA8, 0i64);
  for( i = stru_140C49BB0.BufferList.Flink; i != (_LIST_ENTRY *)&stru_140C49BB0; i = *(_LIST_ENTRY **)v10 )
  {
    if( IidAreIdsStrictlyEqual((INT64 *)i[1].Flink, (INT64)v7) )
    {
      ++*(_DWORD *)(v10 + 32);
      *v6 = *(UINT8 **)(v10 + 24);
      AcpiDeviceMapping = 0;
      goto LABEL_34;
    }
  }
  v11 = HalpMmAllocCtxAlloc(v8, 0x28ui64);
  v12 = (_LIST_ENTRY *)v11;
  if( !v11 )
  {
    AcpiDeviceMapping = -1073741670;
    goto LABEL_34;
  }
  *(_OWORD *)v11 = 0i64;
  *((_OWORD *)v11 + 1) = 0i64;
  *((_QWORD *)v11 + 4) = 0i64;
  AcpiDeviceMapping = HalpIommuCloneDeviceId(v7);
  if( AcpiDeviceMapping < 0 )
    goto LABEL_30;
  v15 = HalpMmAllocCtxAlloc(v14, 0xD8ui64);
  v16 = v15;
  if( !v15 )
  {
    AcpiDeviceMapping = -1073741670;
LABEL_30:
    Flink = v12[1].Flink;
    if( Flink )
      HalpMmAllocCtxFree(v14, Flink);
    HalpMmAllocCtxFree(v14, v12);
    if( v4 )
      HalpMmAllocCtxFree(v25, v4);
    goto LABEL_34;
  }
  v12[1].Blink = (_LIST_ENTRY *)v15;
  memset(v15, 0i64, 0xD8u);
  if( byte_140C49B2C )
  {
    if( *(_DWORD *)&v7->Type == 2 )
    {
      AcpiDeviceMapping = (unsigned int)HalpIommuQueryAcpiDeviceMapping(v7, (ULONG)SortKey);
      if( AcpiDeviceMapping < 0 )
        goto LABEL_29;
      AcpiDeviceMapping = HalpIommuCloneDeviceId(SortKey);
      if( AcpiDeviceMapping < 0 )
        goto LABEL_29;
      v7 = (_KDEVICE_QUEUE *)Src;
      v4 = Src;
      v35 = Src;
    }
    IommupHvRegisterDeviceId();
    AcpiDeviceMapping = v21;
    if( v21 >= 0 )
      goto LABEL_21;
LABEL_29:
    HalpMmAllocCtxFree(v17, v16);
    goto LABEL_30;
  }
  AcpiDeviceMapping = HalpIommuCreateDeviceInternal((__int64)v7, v33, &v28, &v29, v5);
  if( AcpiDeviceMapping < 0 )
    goto LABEL_29;
LABEL_21:
  if( byte_140C49B2C )
  {
    *((_QWORD *)v16 + 3) = 0i64;
  }
  else
  {
    *(_QWORD *)v16 = v28;
    *((_QWORD *)v16 + 1) = v29;
  }
  if( !v4 )
  {
    v4 = v35;
    AcpiDeviceMapping = HalpIommuCloneDeviceId(v7);
    if( AcpiDeviceMapping < 0 )
      goto LABEL_29;
  }
  *((_QWORD *)v16 + 4) = v4;
  HalpIommuCheckDpptException((_MDL *)v7, v18, v19, v20, DmaOperation);
  v16[16] = v22;
  v17 = &stru_140C49BB0;
  *v34 = v16;
  LODWORD(v12[2].Flink) = 1;
  Blink = stru_140C49BB0.BufferList.Blink;
  if( stru_140C49BB0.BufferList.Blink->Flink != (_LIST_ENTRY *)&stru_140C49BB0 )
    __fastfail(3u);
  v12->Flink = (_LIST_ENTRY *)&stru_140C49BB0;
  v12->Blink = Blink;
  Blink->Flink = v12;
  stru_140C49BB0.BufferList.Blink = v12;
  if( AcpiDeviceMapping < 0 )
    goto LABEL_29;
LABEL_34:
  if( (_InterlockedExchangeAdd64(&stru_140C49BA8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C49BA8);
  KeAbPostRelease(&stru_140C49BA8);
  return AcpiDeviceMapping;
}

Referenced by:

HalpDmaAllocateChildAdapterV3
HalpIommuUnblockDevice
IommuDomainAttachDevice