CmDeviceClassesSubkeyCallback

__int64 __fastcall CmDeviceClassesSubkeyCallback(__int64 a1, char *a2, const wchar_t *a3, unsigned int *a4){
  __int64 v5; 
  unsigned __int64 v6; 
  WCHAR *v9; 
  _WORD *PoolWithTag; 
  WCHAR *v11; 
  __int64 v12; 
  unsigned int v13; 
  UINT64 v14; 
  WCHAR *v15; 
  unsigned int v16; 
  unsigned __int8(__fastcall *v17)(__int64, WCHAR *, __int64, _QWORD); 
  unsigned int v18; 
  __int64 v20; 
  WCHAR *v21; 
  __int64 v22; 
  UINT64 dwFlags; 
  UINT64 dwFlagsa; 
  int v25; 
  __int64 v26; 
  HANDLE Handle; 
  NTSTRSAFE_PWSTR ppszDestEnd; 
  size_t pcchRemaining; 
  UNICODE_STRING String2; 
  UNICODE_STRING String1; 
  struct _UNICODE_STRING DestinationString; 
  char v33; 
  Handle = 0i64;
  v5 = *a4;
  v6 = -1i64;
  v25 = 0;
  ppszDestEnd = 0i64;
  pcchRemaining = 0i64;
  v33 = 0;
  v9 = 0i64;
  PoolWithTag = 0i64;
  v11 = 0i64;
  DestinationString = 0i64;
  String1 = 0i64;
  String2 = 0i64;
  if( (_DWORD)v5 == 1 )
  {
    v22 = -1i64;
    do
      ++v22;
    while( a3[v22] );
    if( v22 != 38 || *a3 != 123 )
      return 0i64;
  }
  else if( (unsigned int)(v5 - 2) <= 1 )
  {
    v12 = -1i64;
    do
      ++v12;
    while( a3[v12] );
    if( !v12 || *a3 != 35 )
      return 0i64;
  }
  if( (unsigned int)v5 >= 3 && ((_DWORD)v5 != 3 || !*((_BYTE *)a4 + 1428)) )
    goto LABEL_10;
  v20 = 0i64;
  if( a1 )
    v20 = *(_QWORD *)(a1 + 224);
  if( (int)SysCtxRegOpenKey(v20, a2, a3, 8u, 0x20019u, &Handle) >= 0 )
  {
LABEL_10:
    v13 = *a4;
    if( *a4 < 3 )
    {
      if( v13 == 2 && *((_WORD *)a4 + 506) )
      {
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x190ui64, 0x52504E50ui64);
        if( !PoolWithTag )
          goto LABEL_38;
        LODWORD(v26) = 400;
        if( (int)RegRtlQueryValue(Handle, L"DeviceInstance", &v25, PoolWithTag, (__int64)&v26) < 0 )
          goto LABEL_36;
        if( v25 != 1 )
          goto LABEL_36;
        if( (unsigned int)v26 < 2 )
          goto LABEL_36;
        PoolWithTag[199] = 0;
        if( (int)RtlInitUnicodeStringEx(&String1, PoolWithTag) < 0
          || (int)RtlInitUnicodeStringEx(&String2, (WCHAR *)a4 + 506) < 0
          || !RtlEqualUnicodeString(&String1, &String2, 1u) )
        {
          goto LABEL_36;
        }
      }
      v13 = *a4;
    }
    else if( v13 == 3 )
    {
      do
        ++v6;
      while( a3[v6] );
      if( v6 <= 1 || *a3 != 35 )
        goto LABEL_17;
      v33 = 1;
      v13 = 3;
    }
    if( v13 < 2 )
      goto LABEL_25;
LABEL_17:
    v11 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x3F0ui64, 0x52504E50ui64);
    if( v11 )
    {
      v14 = 504i64;
      if( *((_WORD *)a4 + 2) )
      {
        LODWORD(dwFlags) = 2304;
        if( (int)RtlStringCchCopyExW(v11, 0x1F8ui64, (WCHAR *)a4 + 2, &ppszDestEnd, &pcchRemaining, dwFlags) < 0 )
          goto LABEL_34;
        v15 = ppszDestEnd;
        v14 = pcchRemaining - 1;
        *ppszDestEnd = 0;
      }
      else
      {
        v15 = v11;
      }
      if( v33 == 1 || *a4 == 2 )
      {
        if( RtlStringCchCopyW(v15, v14, (PWCHAR)a3) < 0 )
          goto LABEL_34;
        if( v33 == 1 )
          *v15 = 92;
      }
LABEL_25:
      if( *a4 < 3 )
      {
        v21 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x5B8ui64, 0x52504E50ui64);
        v9 = v21;
        if( v21 )
        {
          memset((INT64)v21, 0i64);
          *(_DWORD *)v9 = *a4 + 1;
          LODWORD(dwFlags) = 2304;
          RtlStringCchCopyExW(v9 + 2, 0x1F8ui64, v11, 0i64, 0i64, dwFlags);
          LODWORD(dwFlagsa) = 2304;
          RtlStringCchCopyExW(v9 + 506, 0xC8ui64, (WCHAR *)a4 + 506, 0i64, 0i64, dwFlagsa);
          *((_QWORD *)v9 + 177) = *((_QWORD *)a4 + 177);
          *((_DWORD *)v9 + 356) = a4[356];
          *((_BYTE *)v9 + 1428) = *((_BYTE *)a4 + 1428);
          *((_QWORD *)v9 + 179) = *((_QWORD *)a4 + 179);
          *((_QWORD *)v9 + 180) = *((_QWORD *)a4 + 180);
          *((_QWORD *)v9 + 181) = *((_QWORD *)a4 + 181);
          *((_DWORD *)v9 + 364) = a4[364];
          *((_DWORD *)v9 + 365) = a4[365];
          PnpCtxRegEnumKeyWithCallback(a1, Handle, (__int64)CmDeviceClassesSubkeyCallback, (__int64)v9);
          *((_QWORD *)a4 + 177) = *((_QWORD *)v9 + 177);
          a4[356] = *((_DWORD *)v9 + 356);
          a4[365] = *((_DWORD *)v9 + 365);
          *((_QWORD *)a4 + 181) = *((_QWORD *)v9 + 181);
          a4[364] = *((_DWORD *)v9 + 364);
LABEL_32:
          if( v9 )
            ExFreePoolWithTag(v9, 0);
        }
      }
      else
      {
        *(_QWORD *)v11 = *(_QWORD *)L"\\\\?\\";
        if( (int)CmValidateDeviceInterfaceName(v5, v11) >= 0
          && (int)RtlInitUnicodeStringEx(&DestinationString, v11) >= 0 )
        {
          v16 = DestinationString.MaximumLength >> 1;
          if( *((_BYTE *)a4 + 1428) )
          {
            CmIsDeviceInterfaceEnabled(a1, v11);
          }
          else
          {
            v17 = (unsigned __int8(__fastcall *)(__int64, WCHAR *, __int64, _QWORD))*((_QWORD *)a4 + 179);
            if( !v17 || v17(a1, v11, 3i64, *((_QWORD *)a4 + 180)) )
            {
              a4[365] += v16;
              v18 = a4[364];
              if( v18 > v16 )
              {
                LODWORD(dwFlags) = 2304;
                RtlStringCchCopyExW(*((WCHAR **)a4 + 181), v18, v11, 0i64, 0i64, dwFlags);
                *((_QWORD *)a4 + 181) += 2i64 * v16;
                a4[364] -= v16;
                goto LABEL_32;
              }
            }
          }
        }
      }
LABEL_34:
      if( v11 )
        ExFreePoolWithTag(v11, 0);
    }
LABEL_36:
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0);
  }
LABEL_38:
  if( Handle )
    ZwClose(Handle);
  return 0i64;
}

Referenced by:

No references.