HalpIommuUnblockDevice

NTSTATUS __stdcall HalpIommuUnblockDevice(PVOID Src){
  _QWORD *v1; 
  UINT64 v2; 
  UINT8 v3; 
  int IncreaseAliasTrack; 
  char v5; 
  char v6; 
  _QWORD *v7; 
  ULONG *v8; 
  INT64 v9; 
  char v10; 
  _KDEVICE_QUEUE *v11; 
  int AcpiDeviceMapping; 
  ULONG *v14; 
  NTSTATUS Device; 
  NTSTATUS v16; 
  _ETHREAD *CurrentThread; 
  unsigned int SessionId; 
  unsigned __int8 v19; 
  int v20; 
  bool v21; 
  __int64 v22; 
  _KLOCK_ENTRY *v23; 
  int v24; 
  unsigned int v25; 
  __int64 v26; 
  UINT8 v27; 
  __int64 v28; 
  __int128 v29; 
  __int64 v30; 
  ULONG SortKey[4]; 
  __int64 v32; 
  UINT64 a3; 

  IncreaseAliasTrack = 0;
  v30 = 0i64;
  v29 = 0i64;
  v32 = 0i64;
  *(_OWORD *)SortKey = 0i64;
  v5 = 0;
  *v1 = 0i64;
  v6 = 0;
  v7 = v1;
  v8 = (ULONG *)Src;
  HalpIommuCheckDpptException((_MDL *)Src, v1, v2, v3, v27);
  if( v10 || HalpIommuCheckExceptionList(v9) )
    return 0;
  if( byte_140C49B2C && !byte_140C49B2E )
    return -1073741637;
  if( *(_DWORD *)&v11->Type == 2 )
  {
    AcpiDeviceMapping = (unsigned int)HalpIommuQueryAcpiDeviceMapping(v11, (ULONG)SortKey);
    v14 = SortKey;
    if( AcpiDeviceMapping < 0 )
      v14 = v8;
    v8 = v14;
  }
  Device = HalpIommuCreateDevice(v8);
  if( Device >= 0 )
  {
    v5 = 1;
    if( *v8 == 1 && ((unsigned int)HalpIommuGetAcpiDeviceMapCount((INT64)v8) > 1 || (v8[1] & 1) != 0) )
    {
      ExAcquirePushLockExclusiveEx(&qword_140C49BA0, 0i64);
      v6 = 1;
      IncreaseAliasTrack = HalpIommuCreateIncreaseAliasTrack(v8);
      if( IncreaseAliasTrack < 0 || MEMORY[0x18] > 1 )
        goto LABEL_23;
    }
    if( byte_140C49B2C )
    {
      *(_QWORD *)&v29 = 4i64;
      v30 = 0i64;
      v28 = 0i64;
      *((_QWORD *)&v29 + 1) = MEMORY[0x18];
      v16 = ((__int64(__fastcall *)(__int128 *, __int64 *))qword_140C4A2B8)(&v29, &v28);
    }
    else
    {
      v16 = HalpIommuJoinDmaDomain(0i64, ::SortKey);
    }
    IncreaseAliasTrack = v16;
    if( v6 )
    {
LABEL_23:
      if( (_InterlockedExchangeAdd64(&qword_140C49BA0._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(&qword_140C49BA0);
      LODWORD(a3) = 0;
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( MiGetSystemRegionType((UINT64)&qword_140C49BA0) == 1 )
        SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
      else
        SessionId = -1;
      --CurrentThread->Tcb.SpecialApcDisable;
      v19 = ++CurrentThread->Tcb.AbAllocationRegionCount;
      v20 = ((char)CurrentThread->Tcb.AbEntrySummary | (char)CurrentThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
      while( 1 )
      {
        v21 = !_BitScanReverse((unsigned int *)&v22, v20);
        if( v21 )
          break;
        v23 = &CurrentThread->Tcb.LockEntries[v22];
        v20 &= ~(1 << v22);
        if( (v23->AcquiredByte & 1) != 0
          && (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
          && (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)&qword_140C49BA0 & 0x7FFFFFFFFFFFFFFCi64)
          && v23->LockState.SessionId == SessionId )
        {
          v23->AcquiredByte &= ~1u;
          if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
          {
            if( v23 )
            {
              v23->CrossThreadReleasableAndBusyByte |= 2u;
              if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
                KiAbEntryRemoveFromTree(v23);
              v24 = v23->BoostBitmap.AllFields & 0x1FFFF;
              v25 = v23->BoostBitmap.AllFields & 0xFFFE0000;
              v23->ThreadLocalFlags &= ~1u;
              LODWORD(a3) = v24;
              v23->BoostBitmap.AllFields = v25;
              v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
              v26 = v23 - CurrentThread->Tcb.LockEntries;
              if( v19 == 1 )
                CurrentThread->Tcb.AbEntrySummary |= 1 << v26;
              else
                _InterlockedOr8((volatile signed __int8 *)&CurrentThread->Tcb.AbOrphanedEntrySummary, 1 << v26);
              goto LABEL_40;
            }
            break;
          }
        }
      }
      if( (*(&CurrentThread->Tcb.MiscFlags + 1) & 0x10000) == 0 )
        KeBugCheckEx(0x162u, CurrentThread, &qword_140C49BA0, (PVOID)SessionId, 0i64);
LABEL_40:
      --CurrentThread->Tcb.AbAllocationRegionCount;
      KiAbThreadRemoveBoosts(&CurrentThread->Tcb, &qword_140C49BA0, &a3);
      v21 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
      if( v21
        && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
      {
        KiCheckForKernelApcDelivery();
      }
    }
  }
  else if( Device != -1073741275 )
  {
    IncreaseAliasTrack = Device;
  }
  if( IncreaseAliasTrack >= 0 )
  {
    *v7 = 0i64;
  }
  else if( v5 )
  {
    HalpIommuDeleteDevice(0i64);
  }
  return IncreaseAliasTrack;
}

Referenced by:

No references.