TtmNotifyDeviceArrival
NTSTATUS __stdcall TtmNotifyDeviceArrival(
_TERMINAL_DEVICE_PROVIDER Provider,
VOID *Token,
_TERMINAL_DEVICE_FUNCTIONS *Functions,
_GUID *ProviderDeviceType,
_UNICODE_STRING *Identity){
unsigned __int32 v5;
_TERMINAL_DEVICE_PROVIDER v8;
_TTMI_SESSION *v9;
VOID **v10;
UINT64 v11;
unsigned int v12;
INT64 v13;
INT64 v14;
unsigned int v15;
_UNICODE_STRING *v16;
NTSTATUS v17;
NTSTATUS v18;
char v19;
UINT64 v20;
VOID **PoolWithTag;
VOID *v22;
NTSTATUS v23;
unsigned int v24;
int v25;
int v26;
int v27;
_TTMI_SESSION **v28;
INT64 v30;
int pcchLength[18];
_TTMI_SESSION *Session;
INT64 v34;
LODWORD(v34) = (_DWORD)ProviderDeviceType;
v5 = -1;
Session = 0i64;
v8 = Provider;
v9 = 0i64;
v10 = 0i64;
if( !Functions )
{
v12 = -1073741811;
v20 = 386i64;
goto LABEL_30;
}
if( !*(_QWORD *)Functions )
{
v11 = 374i64;
LABEL_4:
v12 = -1073741811;
v13 = 0xFFFFFFFFi64;
v14 = 3221225485i64;
LABEL_5:
TtmiLogError((INT8 *)"TtmNotifyDeviceArrival", v11, v13, v14);
v15 = v34;
goto LABEL_36;
}
if( *((_QWORD *)Functions + 3) && *((_QWORD *)Functions + 2) )
{
v11 = 381i64;
goto LABEL_4;
}
v16 = Identity;
if( Identity )
{
v17 = RtlStringCchLengthW(Identity->Buffer, 0x104ui64, (UINT64 *)pcchLength);
v12 = v17;
if( v17 < 0 )
{
v14 = (unsigned int)v17;
v13 = (unsigned int)v17;
v11 = 401i64;
goto LABEL_5;
}
}
v18 = TtmiAcquireCurrentSession(&Session);
v12 = v18;
if( v18 < 0 )
{
TtmiLogError((INT8 *)"TtmNotifyDeviceArrival", 0x19Cui64, (unsigned int)v18, (unsigned int)v18);
v9 = Session;
goto LABEL_31;
}
v9 = Session;
TtmpFindDeviceByToken();
if( v19 )
{
v12 = -1073741768;
v20 = 430i64;
LABEL_30:
TtmiLogError((INT8 *)"TtmNotifyDeviceArrival", v20, 0xFFFFFFFFi64, v12);
goto LABEL_31;
}
v5 = _InterlockedIncrement(v9 + 28);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x268ui64, 1148023892i64);
v10 = PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, 0x268u);
*((_DWORD *)v10 + 4) = Provider;
v10[3] = Token;
*((_DWORD *)v10 + 8) = v5;
v10[5] = *(VOID **)Functions;
v10[6] = (VOID *)*((_QWORD *)Functions + 1);
v10[7] = (VOID *)*((_QWORD *)Functions + 2);
v22 = (VOID *)*((_QWORD *)Functions + 3);
v15 = v34;
v10[8] = v22;
*((_DWORD *)v10 + 18) = v15;
v23 = RtlStringCchCopyW((WCHAR *)v10 + 38, 0x104ui64, v16->Buffer);
v12 = v23;
if( v23 >= 0 )
{
if( *((_DWORD *)v10 + 4) == 2 && (v24 = *((_DWORD *)v10 + 18), v24 <= 0x10) && (v25 = 65814, _bittest(&v25, v24)) )
v26 = 128;
else
v26 = 0;
v27 = *((_DWORD *)v10 + 150);
*((_DWORD *)v10 + 149) = -1;
v9 = Session;
*((_DWORD *)v10 + 150) = v26 | v27 & 0xFFFFFF7F | 1;
v28 = (_TTMI_SESSION **)*((_QWORD *)v9 + 13);
if( *v28 != v9 + 24 )
__fastfail(3u);
v10[1] = v28;
*v10 = v9 + 24;
*v28 = (_TTMI_SESSION *)v10;
*((_QWORD *)v9 + 13) = v10;
++v9[29];
TtmiScheduleSessionWorker((__int64)v9, 1);
v10 = 0i64;
v12 = 0;
}
else
{
TtmiLogError((INT8 *)"TtmNotifyDeviceArrival", 0x1DBui64, (unsigned int)v23, (unsigned int)v23);
v9 = Session;
}
v8 = Provider;
goto LABEL_32;
}
v12 = -1073741670;
TtmiLogError((INT8 *)"TtmNotifyDeviceArrival", 0x1C4ui64, 0xFFFFFFFFi64, 3221225626i64);
v9 = Session;
v8 = Provider;
LABEL_31:
v15 = v34;
LABEL_32:
if( v9 )
{
ExReleaseResourceLite(&TtmpSessionLock);
KeLeaveCriticalRegion();
}
if( v10 )
ExFreePoolWithTag(v10, 0x446D7454u);
LABEL_36:
LODWORD(v30) = v12;
TtmiLogDeviceArrivalNotified((unsigned int)v8, (INT64)Token, v5, v15, v30);
return v12;
}Referenced by:
No references.