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.