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.