IommuEnableDevicePasid

NTSTATUS __stdcall IommuEnableDevicePasid(INT64 *a1, INT64 a2){
  INT64 v2; 
  INT64 v4; 
  UINT8 *v5; 
  __int64 v6; 
  UINT8 *v7; 
  _HALP_ALLOC_CONTEXT *v8; 
  UINT8 *v9; 
  _HALP_ALLOC_CONTEXT *v10; 
  UINT8 *v11; 
  NTSTATUS v12; 
  _HALP_ALLOC_CONTEXT *v13; 
  UINT8 *v14; 
  _HALP_ALLOC_CONTEXT *v15; 
  __int64 v16; 
  UINT8 *v17; 
  bool v18; 
  UINT8 *v19; 
  UINT8 *v20; 
  UINT8 *v21; 
  _HALP_ALLOC_CONTEXT *v22; 
  VOID *v23; 
  UINT8 *v24; 
  __int64 v25; 
  char *v26; 
  _QWORD *v27; 
  __int64 v28; 
  UINT8 *v29; 
  int v30; 
  char *v31; 
  __int64 v32; 
  __int64 v33; 
  _QWORD *v34; 
  __int64 v35; 
  unsigned __int8 CurrentIrql; 
  UINT64 *v37; 
  UINT8 **v38; 
  UINT8 *v39; 
  __int64 v40; 
  __int64 v41; 
  UINT8 *v42; 
  UINT8 *v43; 
  UINT8 **v44; 
  __int64 v45; 
  INT64 v46; 
  UINT8 *v47; 
  __int64 v48; 
  _QWORD *v49; 
  VOID *v50; 
  unsigned __int8 v52; 
  INT64 v53; 

  v2 = a1[1];
  v4 = *a1;
  v5 = 0i64;
  v6 = *(_QWORD *)(a2 + 24);
  v53 = v2;
  v7 = 0i64;
  v52 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 518);
  v9 = HalpMmAllocCtxAlloc(v8, 0x28ui64);
  v11 = v9;
  if( !v9 )
    goto LABEL_2;
  *((_QWORD *)v9 + 2) = *(_QWORD *)(a2 + 24);
  *((_QWORD *)v9 + 4) = v9 + 24;
  *((_QWORD *)v9 + 3) = v9 + 24;
  v14 = HalpMmAllocCtxAlloc(v10, 0x3048ui64);
  v5 = v14;
  if( !v14 )
    goto LABEL_2;
  memset(v14, 0i64, 0x3048u);
  if( byte_140C49B2C )
  {
    v16 = v6 + 24;
    v17 = HalpMmAllocCtxAlloc(v15, (unsigned int)(*(_DWORD *)(v6 + 44) << 9));
    *((_QWORD *)v5 + 1544) = v17;
    if( !v17 )
      goto LABEL_2;
  }
  else
  {
    v16 = v6 + 384;
  }
  *((_QWORD *)v5 + 5) = a2;
  v5[32] = 0;
  *((_QWORD *)v5 + 6) = v2;
  v18 = byte_140C49B2C == 0;
  *((_DWORD *)v5 + 15) = *(_DWORD *)(v16 + 16);
  if( !v18 )
  {
    v12 = ((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A250)(*(_QWORD *)(a2 + 40), *(unsigned int *)(v2 + 16));
    if( v12 < 0 )
      goto LABEL_3;
    goto LABEL_34;
  }
  v19 = (UINT8 *)(v6 + 368);
  v20 = *(UINT8 **)(v6 + 368);
  if( v20 != (UINT8 *)(v6 + 368) )
  {
    v15 = (_HALP_ALLOC_CONTEXT *)*(unsigned int *)(v4 + 16);
    do
    {
      v7 = v20;
      if( *((_DWORD *)v20 + 4) == (_DWORD)v15 )
        break;
      v20 = *(UINT8 **)v20;
    }
    while( v20 != v19 );
  }
  v21 = *(UINT8 **)(a2 + 64);
  if( v21 && v21 != v7 )
  {
    v12 = -1073741823;
LABEL_16:
    v7 = 0i64;
    goto LABEL_3;
  }
  if( v7 && *((_DWORD *)v7 + 4) == *(_DWORD *)(v4 + 16) )
  {
    v2 = v53;
    v12 = (*(__int64(__fastcall **)(_QWORD, UINT8 *, _QWORD))(v6 + 216))(
            *(_QWORD *)(v6 + 16),
            v7,
            *(unsigned int *)(v53 + 16));
    if( v12 < 0 )
      goto LABEL_16;
    v23 = (VOID *)*((_QWORD *)v7 + 7);
    if( v23 )
    {
      v24 = (UINT8 *)*((_QWORD *)v7 + 3);
      if( v24 != v7 + 24 )
      {
        do
        {
          (*(void(__fastcall **)(_QWORD, _QWORD, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), *((_QWORD *)v24 - 4), v7);
          v24 = *(UINT8 **)v24;
        }
        while( v24 != v7 + 24 );
        v23 = (VOID *)*((_QWORD *)v7 + 7);
      }
      HalpMmAllocCtxFree(v22, v23);
      *((_QWORD *)v7 + 7) = 0i64;
      v2 = v53;
    }
    if( !*(_QWORD *)(a2 + 64) )
    {
      v25 = *(_QWORD *)(a2 + 40);
      *(_QWORD *)(a2 + 64) = v7;
      (*(void(__fastcall **)(_QWORD, __int64, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), v25, v7);
      v26 = (char *)(v7 + 24);
      v27 = (_QWORD *)(a2 + 72);
      v28 = *(_QWORD *)v26;
      if( *(char **)(*(_QWORD *)v26 + 8i64) != v26 )
        goto LABEL_44;
      *v27 = v28;
      *(_QWORD *)(a2 + 80) = v26;
      *(_QWORD *)(v28 + 8) = v27;
      *(_QWORD *)v26 = v27;
    }
    goto LABEL_34;
  }
  v29 = HalpMmAllocCtxAlloc(v15, 0x40ui64);
  v7 = v29;
  if( v29 )
  {
    memset(v29, 0i64, 0x40u);
    v30 = *(_DWORD *)(v4 + 16);
    v31 = (char *)(v7 + 24);
    *((_DWORD *)v7 + 4) = v30;
    *((_QWORD *)v7 + 4) = v7 + 24;
    *((_QWORD *)v7 + 3) = v7 + 24;
    *((_QWORD *)v7 + 5) = 0i64;
    *((_QWORD *)v7 + 7) = 0i64;
    v12 = (*(__int64(__fastcall **)(_QWORD, UINT8 *, _QWORD))(v6 + 216))(
            *(_QWORD *)(v6 + 16),
            v7,
            *(unsigned int *)(v53 + 16));
    if( v12 < 0 )
      goto LABEL_3;
    v32 = *(_QWORD *)(a2 + 40);
    *(_QWORD *)(a2 + 64) = v7;
    (*(void(__fastcall **)(_QWORD, __int64, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), v32, v7);
    v33 = *(_QWORD *)v31;
    v34 = (_QWORD *)(a2 + 72);
    if( *(char **)(*(_QWORD *)v31 + 8i64) != v31 )
      goto LABEL_44;
    *v34 = v33;
    *(_QWORD *)(a2 + 80) = v31;
    *(_QWORD *)(v33 + 8) = v34;
    *(_QWORD *)v31 = v34;
    v35 = *(_QWORD *)v19;
    if( *(UINT8 **)(*(_QWORD *)v19 + 8i64) != v19 )
      goto LABEL_44;
    *((_QWORD *)v7 + 1) = v19;
    *(_QWORD *)v7 = v35;
    *(_QWORD *)(v35 + 8) = v7;
    *(_QWORD *)v19 = v7;
    v2 = v53;
LABEL_34:
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    KxAcquireSpinLock((UINT64 *)(v2 + 24));
    v37 = (UINT64 *)(a2 + 16);
    KxAcquireSpinLock((UINT64 *)(a2 + 16));
    ++*(_DWORD *)(a2 + 32);
    v38 = (UINT8 **)(v53 + 40);
    v39 = *(UINT8 **)(v53 + 40);
    if( v39 == (UINT8 *)(v53 + 40) )
      goto LABEL_39;
    v40 = *(_QWORD *)(a2 + 24);
    do
    {
      v41 = *((_QWORD *)v39 + 2);
      v42 = v39;
      if( v41 == v40 )
        goto LABEL_41;
      v39 = *(UINT8 **)v39;
    }
    while( v39 != (UINT8 *)v38 );
    if( v41 != v40 )
    {
LABEL_39:
      v43 = *v38;
      if( *((UINT8 ***)*v38 + 1) != v38 )
        goto LABEL_44;
      *(_QWORD *)v11 = v43;
      v42 = v11;
      *((_QWORD *)v11 + 1) = v38;
      *((_QWORD *)v43 + 1) = v11;
      *v38 = v11;
      v11 = 0i64;
    }
LABEL_41:
    v44 = (UINT8 **)(v42 + 24);
    v45 = *((_QWORD *)v42 + 3);
    if( *(UINT8 **)(v45 + 8) == v42 + 24 )
    {
      *((_QWORD *)v5 + 1) = v44;
      v46 = a2 + 88;
      *(_QWORD *)v5 = v45;
      *(_QWORD *)(v45 + 8) = v5;
      *v44 = v5;
      v47 = v5;
      v48 = *(_QWORD *)v46;
      v5 = 0i64;
      v49 = v47 + 16;
      if( *(_QWORD *)(*(_QWORD *)v46 + 8i64) == v46 )
      {
        *v49 = v48;
        v49[1] = v46;
        *(_QWORD *)(v48 + 8) = v49;
        *(_QWORD *)v46 = v49;
        KxReleaseSpinLock(v37);
        KxReleaseSpinLock((UINT64 *)(v2 + 24));
        __writecr8(CurrentIrql);
        v7 = 0i64;
        goto LABEL_3;
      }
    }
LABEL_44:
    __fastfail(3u);
  }
LABEL_2:
  v12 = -1073741670;
LABEL_3:
  KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 518);
  __writecr8(v52);
  if( v11 )
    HalpMmAllocCtxFree(v13, v11);
  if( v5 )
  {
    v50 = (VOID *)*((_QWORD *)v5 + 1544);
    if( v50 )
      HalpMmAllocCtxFree(v13, v50);
    HalpMmAllocCtxFree(v13, v5);
  }
  if( v7 )
    HalpMmAllocCtxFree(v13, v7);
  return v12;
}

Referenced by:

No references.