TtmNotifyDeviceArrival

__int64 __fastcall TtmNotifyDeviceArrival(int a1, __int64 a2, _QWORD *a3, int a4, __int64 a5){
  unsigned __int32 v5; 
  unsigned int v8; 
  __int64 v9; 
  void *v10; 
  INT64 v11; 
  unsigned int v12; 
  INT64 v13; 
  INT64 v14; 
  unsigned int v15; 
  __int64 v16; 
  NTSTATUS v17; 
  int v18; 
  INT64 v19; 
  VOID *PoolWithTag; 
  __int64 v21; 
  NTSTATUS v22; 
  unsigned int v23; 
  int v24; 
  int v25; 
  int v26; 
  _QWORD *v27; 
  INT64 a5a; 
  __int64 pcchLength[9]; 
  __int64 a1a; 
  INT64 a4a; 
  LODWORD(a4a) = a4;
  v5 = -1;
  a1a = 0i64;
  v8 = a1;
  v9 = 0i64;
  v10 = 0i64;
  if( !a3 )
  {
    v12 = -1073741811;
    v19 = 386i64;
    goto LABEL_30;
  }
  if( !*a3 )
  {
    v11 = 374i64;
LABEL_4:
    v12 = -1073741811;
    v13 = 0xFFFFFFFFi64;
    v14 = 3221225485i64;
LABEL_5:
    TtmiLogError((PSTR)"TtmNotifyDeviceArrival", v11, v13, v14);
    v15 = a4a;
    goto LABEL_36;
  }
  if( a3[3] && a3[2] )
  {
    v11 = 381i64;
    goto LABEL_4;
  }
  v16 = a5;
  if( a5 )
  {
    v17 = RtlStringCchLengthW(*(STRSAFE_PCNZWCH *)(a5 + 8), 0x104ui64, (SIZE_T *)pcchLength);
    v12 = v17;
    if( v17 < 0 )
    {
      v14 = (unsigned int)v17;
      v13 = (unsigned int)v17;
      v11 = 401i64;
      goto LABEL_5;
    }
  }
  v18 = TtmiAcquireCurrentSession(&a1a);
  v12 = v18;
  if( v18 < 0 )
  {
    TtmiLogError((PSTR)"TtmNotifyDeviceArrival", 412i64, (unsigned int)v18, (unsigned int)v18);
    v9 = a1a;
    goto LABEL_31;
  }
  v9 = a1a;
  if( TtmpFindDeviceByToken(a1a, v8, a2, 0i64) )
  {
    v12 = -1073741768;
    v19 = 430i64;
LABEL_30:
    TtmiLogError((PSTR)"TtmNotifyDeviceArrival", v19, 0xFFFFFFFFi64, v12);
    goto LABEL_31;
  }
  v5 = _InterlockedIncrement((volatile signed __int32 *)(v9 + 112));
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x268ui64, 0x446D7454ui64);
  v10 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    *((_DWORD *)v10 + 4) = a1;
    *((_QWORD *)v10 + 3) = a2;
    *((_DWORD *)v10 + 8) = v5;
    *((_QWORD *)v10 + 5) = *a3;
    *((_QWORD *)v10 + 6) = a3[1];
    *((_QWORD *)v10 + 7) = a3[2];
    v21 = a3[3];
    v15 = a4a;
    *((_QWORD *)v10 + 8) = v21;
    *((_DWORD *)v10 + 18) = v15;
    v22 = RtlStringCchCopyW((PWCHAR)v10 + 38, 0x104ui64, *(PWCHAR *)(v16 + 8));
    v12 = v22;
    if( v22 >= 0 )
    {
      if( *((_DWORD *)v10 + 4) == 2 && (v23 = *((_DWORD *)v10 + 18), v23 <= 0x10) && (v24 = 65814, _bittest(&v24, v23)) )
        v25 = 128;
      else
        v25 = 0;
      v26 = *((_DWORD *)v10 + 150);
      *((_DWORD *)v10 + 149) = -1;
      v9 = a1a;
      *((_DWORD *)v10 + 150) = v25 | v26 & 0xFFFFFF7F | 1;
      v27 = *(_QWORD **)(v9 + 104);
      if( *v27 != v9 + 96 )
        __fastfail(3u);
      *((_QWORD *)v10 + 1) = v27;
      *(_QWORD *)v10 = v9 + 96;
      *v27 = v10;
      *(_QWORD *)(v9 + 104) = v10;
      ++*(_DWORD *)(v9 + 116);
      TtmiScheduleSessionWorker(v9, 1);
      v10 = 0i64;
      v12 = 0;
    }
    else
    {
      TtmiLogError((PSTR)"TtmNotifyDeviceArrival", 475i64, (unsigned int)v22, (unsigned int)v22);
      v9 = a1a;
    }
    v8 = a1;
    goto LABEL_32;
  }
  v12 = -1073741670;
  TtmiLogError((PSTR)"TtmNotifyDeviceArrival", 452i64, 0xFFFFFFFFi64, 3221225626i64);
  v9 = a1a;
  v8 = a1;
LABEL_31:
  v15 = a4a;
LABEL_32:
  if( v9 )
  {
    ExReleaseResourceLite(&TtmpSessionLock);
    KeLeaveCriticalRegion();
  }
  if( v10 )
    ExFreePoolWithTag(v10, 0x446D7454u);
LABEL_36:
  LODWORD(a5a) = v12;
  TtmiLogDeviceArrivalNotified(v8, a2, v5, v15, a5a);
  return v12;
}

Referenced by:

No references.