PiDevCfgFindDeviceMigrationNode

NTSTATUS __stdcall PiDevCfgFindDeviceMigrationNode(
        PI_DEVCFG_MIGRATION_CONTEXT *MigrationContext,
        PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
        VOID *MigrationNodesKeyHandle,
        UINT64 DefaultMatchFlags,
        PI_DEVCFG_MIGRATION_NODE **MigrationNodeResult){
  unsigned int v5; 
  _PI_DEVCFG_MIGRATION_NODE v7; 
  _PI_DEVCFG_MIGRATION_NODE **v8; 
  int v9; 
  unsigned int v10; 
  _KEY_VALUE_FULL_INFORMATION *v11; 
  _UNICODE_STRING *v12; 
  UINT64 i; 
  WCHAR v14; 
  NTSTATUS v15; 
  _PI_DEVCFG_MIGRATION_NODE *v16; 
  _PI_DEVCFG_MIGRATION_NODE **v17; 
  __int64 v18; 
  const wchar_t *v19; 
  int v20; 
  const WCHAR **v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 *v24; 
  int *v25; 
  INT64 v26; 
  INT64 v27; 
  __int16 v28; 
  _PI_DEVCFG_MIGRATION_NODE *v29; 
  bool v30; 
  bool v31; 
  const WCHAR *v32; 
  __int64 v33; 
  __int64 v34; 
  int v35; 
  PI_DEVCFG_QUERY_PROPERTY_PARAM *v36; 
  __int64 v37; 
  WCHAR *v38; 
  PI_DEVCFG_QUERY_PROPERTY_PARAM *v39; 
  __int64 v40; 
  WCHAR *v41; 
  _PI_DEVCFG_MIGRATION_CONTEXT *v42; 
  __int64 v43; 
  WCHAR *v44; 
  WCHAR *v45; 
  _UNICODE_STRING *p_UnicodeString; 
  __int64 v47; 
  unsigned __int64 v48; 
  bool v49; 
  _PI_DEVCFG_MIGRATION_NODE **v50; 
  _PI_DEVCFG_MIGRATION_NODE *v51; 
  _PI_DEVCFG_MIGRATION_NODE **v52; 
  unsigned int *v53; 
  _PI_DEVCFG_MIGRATION_NODE *v54; 
  _PI_DEVCFG_MIGRATION_NODE ***v55; 
  _PI_DEVCFG_MIGRATION_NODE *v56; 
  __int64 v57; 
  UINT64 *ResultLength; 
  INT64 v60; 
  INT64 v61; 
  UINT64 *v62; 
  INT64 v63; 
  _PI_DEVCFG_MIGRATION_NODE *v64; 
  _PI_DEVCFG_MIGRATION_NODE *v65; 
  _KEY_VALUE_FULL_INFORMATION *Information; 
  int v67; 
  int v68; 
  int v69; 
  unsigned int v70; 
  int Data; 
  _PI_DEVCFG_MIGRATION_CONTEXT *MigrationContexta; 
  _PI_DEVCFG_MIGRATION_NODE *v73; 
  _UNICODE_STRING String2; 
  _UNICODE_STRING DestinationString; 
  _UNICODE_STRING UnicodeString; 
  PI_DEVCFG_DEVICE_CONTEXT *v77; 
  _UNICODE_STRING v78; 
  _UNICODE_STRING DriverPackageId; 
  VOID *KeyHandle; 
  _UNICODE_STRING ValueName; 
  INT64 v82[10]; 
  PI_DEVCFG_MIGRATION_NODE **v83; 
  _GUID Guid; 
  __int128 KeyInformation; 
  __int128 v86; 
  __int64 v87; 

  v5 = 0;
  MigrationContexta = MigrationContext;
  v63 = (unsigned int)DefaultMatchFlags;
  v83 = MigrationNodeResult;
  v77 = DeviceContext;
  v87 = 0i64;
  KeyHandle = MigrationNodesKeyHandle;
  v65 = (_PI_DEVCFG_MIGRATION_NODE *)&v64;
  v73 = 0i64;
  v64 = (_PI_DEVCFG_MIGRATION_NODE *)&v64;
  v7 = DefaultMatchFlags;
  HIDWORD(v62) = 0;
  v68 = 0;
  v8 = 0i64;
  v67 = 0;
  KeyInformation = 0i64;
  *(_QWORD *)&String2.Length = 0i64;
  v86 = 0i64;
  String2.Buffer = 0i64;
  Guid = 0i64;
  *(_QWORD *)&DestinationString.Length = 0i64;
  DestinationString.Buffer = 0i64;
  *(_QWORD *)&DriverPackageId.Length = 0i64;
  DriverPackageId.Buffer = 0i64;
  *(_QWORD *)&v78.Length = 0i64;
  v78.Buffer = 0i64;
  *(_QWORD *)&UnicodeString.Length = 0i64;
  UnicodeString.Buffer = 0i64;
  ValueName = 0i64;
  Data = 0;
  v9 = NtQueryKey(
         MigrationNodesKeyHandle,
         KeyCachedInformation,
         &KeyInformation,
         0x28ui64,
         (UINT64 *)((char *)&v63 + 4));
  if( v9 >= 0 )
  {
    if( !DWORD1(v86) )
      goto LABEL_145;
    v10 = HIDWORD(v86) + 2 * (DWORD2(v86) + 13);
    v69 = v10;
    Information = (_KEY_VALUE_FULL_INFORMATION *)ExAllocatePoolWithTag(1ui64, v10, 1667526736i64);
    v11 = Information;
    if( !Information )
    {
LABEL_4:
      v9 = -1073741670;
      goto LABEL_146;
    }
    v12 = (_UNICODE_STRING *)*((_QWORD *)MigrationContext + 5);
    if( !v12 || (v9 = RtlGUIDFromString(v12, &Guid), v9 >= 0) )
    {
      for( i = 0i64; ; i = v5 )
      {
        LODWORD(ResultLength) = v10;
        v70 = v5;
        LODWORD(v62) = ZwEnumerateValueKey(
                         KeyHandle,
                         i,
                         KeyValueFullInformation,
                         v11,
                         (UINT64)ResultLength,
                         (UINT64 *)((char *)&v63 + 4));
        v9 = (int)v62;
        if( (_DWORD)v62 == -2147483622 )
        {
          v9 = 0;
          LODWORD(v62) = 0;
LABEL_117:
          ExFreePoolWithTag(v11, 0);
          if( v9 < 0 )
            break;
          v50 = (_PI_DEVCFG_MIGRATION_NODE **)v64;
          if( v64 == (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
            goto LABEL_145;
LABEL_119:
          v51 = v50[23];
          if( v51 != (_PI_DEVCFG_MIGRATION_NODE *)-1i64 )
          {
            if( !v8 || v8[23] > v51 )
              goto LABEL_127;
            if( v8[23] != v51 )
              goto LABEL_128;
            if( BYTE6(qword_140C50A2C) && *((_DWORD *)v50 + 44) && !*((_DWORD *)v8 + 44) )
            {
LABEL_127:
              v8 = v50;
            }
            else
            {
              *((_DWORD *)v8 + 4) |= 2u;
              *((_DWORD *)v50 + 4) |= 2u;
            }
          }
LABEL_128:
          v50 = (_PI_DEVCFG_MIGRATION_NODE **)*v50;
          if( v50 == &v64 )
          {
            if( v8 )
            {
              if( ((_DWORD)v8[2] & 2) != 0 )
              {
                v52 = (_PI_DEVCFG_MIGRATION_NODE **)v64;
                Data = 1;
                if( v64 != (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
                {
                  do
                  {
                    if( ((_DWORD)v52[2] & 2) != 0 && v52[23] == v8[23] )
                    {
                      *(_DWORD *)&ValueName.Length = 1310738;
                      ValueName.Buffer = (wchar_t *)L"Duplicate";
                      LODWORD(v60) = 4;
                      ZwSetValueKey(v52[5], &ValueName, 0i64, 4ui64, &Data, v60);
                    }
                    v52 = (_PI_DEVCFG_MIGRATION_NODE **)*v52;
                  }
                  while( v52 != &v64 );
                  v9 = (int)v62;
                }
              }
              else if( IopGetRegistryValue(v8[5], (PWCHAR)L"Duplicate", 0i64, &Information) >= 0 )
              {
                if( PnpValidateRegistryDword((__int64)Information) && *(unsigned int *)((char *)v53 + v53[2]) )
                  *((_DWORD *)v8 + 4) |= 2u;
                ExFreePoolWithTag(v53, 0);
              }
              v54 = *v8;
              if( *((_PI_DEVCFG_MIGRATION_NODE ***)*v8 + 1) == v8 )
              {
                v55 = (_PI_DEVCFG_MIGRATION_NODE ***)v8[1];
                if( *v55 == v8 )
                {
                  *v55 = (_PI_DEVCFG_MIGRATION_NODE **)v54;
                  *((_QWORD *)v54 + 1) = v55;
                  *v83 = (PI_DEVCFG_MIGRATION_NODE *)v8;
                  break;
                }
              }
LABEL_150:
              __fastfail(3u);
            }
LABEL_145:
            v9 = -1073741275;
            break;
          }
          goto LABEL_119;
        }
        if( (_DWORD)v62 == -2147483643 )
        {
          ExFreePoolWithTag(v11, 0);
          v10 = HIDWORD(v63) + 2;
          v69 = HIDWORD(v63) + 2;
          Information = (_KEY_VALUE_FULL_INFORMATION *)ExAllocatePoolWithTag(
                                                         1ui64,
                                                         (unsigned int)(HIDWORD(v63) + 2),
                                                         1667526736i64);
          v11 = Information;
          if( !Information )
            goto LABEL_4;
          --v5;
          goto LABEL_18;
        }
        if( (int)v62 < 0 )
          goto LABEL_117;
        if( PnpValidateRegistryDword((__int64)v11) )
          v7 = *(ULONG *)((char *)&v11->TitleIndex + v11->DataOffset);
        v11->Name[(unsigned __int64)v11->NameLength >> 1] = v14;
        if( CmIsRootEnumeratedDevice(v11->Name) )
          goto LABEL_17;
        v15 = PiDevCfgQueryDeviceMigrationNode(MigrationContexta, v11->Name, &v73);
        LODWORD(v62) = v15;
        v9 = v15;
        if( v15 == -1073741772 )
        {
          v73 = 0i64;
          PiDevCfgClearDeviceMigrationNode(MigrationContexta, v11->Name);
LABEL_17:
          v7 = v63;
          goto LABEL_18;
        }
        if( v15 < 0 )
          goto LABEL_117;
        v16 = v73;
        v73[45] = v7;
        v17 = (_PI_DEVCFG_MIGRATION_NODE **)v65;
        if( *(_PI_DEVCFG_MIGRATION_NODE ***)v65 != &v64 )
          goto LABEL_150;
        v18 = (__int64)v77;
        *(_QWORD *)v16 = &v64;
        *((_QWORD *)v16 + 1) = v17;
        *v17 = v16;
        v19 = *(const wchar_t **)(v18 + 8);
        v65 = v16;
        v20 = 0;
        if( !wcsicmp(*((const wchar_t **)v16 + 4), v19) )
          v20 = 0x10000000;
        if( (v16[45] & 0x10000000) != 0 && (v20 & 0x10000000) == 0 )
          v16[4] |= 1u;
        v21 = (const WCHAR **)(v16 + 14);
        v22 = v18 - (_QWORD)v16;
        v23 = 2i64;
        v24 = &qword_140983868;
        v25 = &v68;
        do
        {
          PiDevCfgGetMigrationDeviceIdScore(*v21, *(const WCHAR **)((char *)v21 + v22 - 24));
          *(_WORD *)v25 = v28;
          if( v28 != -1 )
            v20 |= *(_DWORD *)v24;
          v21 += 2;
          v25 = (int *)((char *)v25 + 2);
          v24 = (__int64 *)((char *)v24 + 4);
          --v23;
        }
        while( v23 );
        v29 = v73;
        if( (v73[45] & 0x10000) != 0 )
        {
          if( (v20 & 0x10000) == 0 )
            goto LABEL_36;
          v30 = (v20 & 0x11000) == 0;
          v31 = (v73[45] & 0x1000) != 0;
        }
        else
        {
          v30 = (v73[45] & 0x1000) != 0;
          v31 = (v20 & 0x1000) == 0;
        }
        if( v30 && v31 )
LABEL_36:
          v73[4] |= 1u;
        v32 = (const WCHAR *)*((_QWORD *)v29 + 18);
        v33 = (__int64)v77;
        if( v32 && *((_QWORD *)v77 + 8) )
        {
          while( 1 )
          {
            if( !*v32 )
              goto LABEL_47;
            if( PnpMultiSzContainsString(*(WCHAR **)(v33 + 64), v32, v26) )
              break;
            v34 = -1i64;
            do
              ++v34;
            while( v32[v34] );
            v32 += v34 + 1;
          }
          v20 |= 0x200u;
          *((_QWORD *)v29 + 19) = v32;
        }
LABEL_47:
        if( (v29[45] & 0x200) != 0 && (v20 & 0x200) == 0 )
          v29[4] |= 1u;
        v35 = HIDWORD(v62);
        if( *((_QWORD *)v29 + 16) )
        {
          if( (WORD2(v62) & 0x100) == 0 )
          {
            memset(v82, 0i64, sizeof(v82));
            v36 = *(PI_DEVCFG_QUERY_PROPERTY_PARAM **)(v33 + 16);
            v37 = *(_QWORD *)(v33 + 8);
            v82[0] = (INT64)&DEVPKEY_Device_LocationInfo;
            v82[2] = (INT64)&DestinationString;
            LODWORD(v60) = 1;
            LODWORD(v82[1]) = 18;
            HIDWORD(v82[3]) = 6;
            LODWORD(v62) = PiDevCfgQueryObjectProperties(v38, v37, (VOID *)1, v36, (UINT64)v82, v60);
            v9 = (int)v62;
            if( (int)v62 < 0 )
              goto LABEL_116;
            if( SLODWORD(v82[4]) < 0 )
              RtlInitUnicodeString(&DestinationString, 0i64);
            v35 = HIDWORD(v62) | 0x100;
            HIDWORD(v62) |= 0x100u;
          }
          if( DestinationString.Buffer
            && !RtlCompareUnicodeString((const _UNICODE_STRING *)(v29 + 30), &DestinationString, 1u) )
          {
            v20 |= 0x100u;
          }
        }
        if( (v20 & 0x300) == 0 && (v29[45] & 0x100) != 0 )
          v29[4] |= 1u;
        if( (v35 & 0x30) == 0 )
        {
          memset(v82, 0i64, sizeof(v82));
          v39 = *(PI_DEVCFG_QUERY_PROPERTY_PARAM **)(v33 + 16);
          v40 = *(_QWORD *)(v33 + 8);
          v82[0] = (INT64)&DEVPKEY_Device_Capabilities;
          v82[2] = (INT64)&v67;
          v82[5] = (INT64)&DEVPKEY_Device_BusReportedDeviceDesc;
          v82[7] = (INT64)&String2;
          LODWORD(v60) = 2;
          LODWORD(v82[1]) = 7;
          LODWORD(v82[3]) = 4;
          LODWORD(v82[6]) = 18;
          HIDWORD(v82[8]) = 6;
          LODWORD(v62) = PiDevCfgQueryObjectProperties(v41, v40, (VOID *)1, v39, (UINT64)v82, v60);
          v9 = (int)v62;
          if( (int)v62 < 0 )
            goto LABEL_116;
          if( SLODWORD(v82[9]) < 0 )
            RtlInitUnicodeString(&String2, 0i64);
          v35 |= 0x30u;
          HIDWORD(v62) = v35;
        }
        if( (((unsigned __int8)v67 ^ *((_BYTE *)v29 + 96)) & 0x10) != 0 )
        {
          if( (v29[45] & 0x10) != 0 || (v67 & 0x10) != 0 )
            v29[4] |= 1u;
        }
        else
        {
          v20 |= 0x10u;
        }
        if( *((_QWORD *)v29 + 14) )
        {
          if( !String2.Buffer || RtlCompareUnicodeString((const _UNICODE_STRING *)(v29 + 26), &String2, 1u) )
            goto LABEL_76;
LABEL_75:
          v20 |= 0x20u;
          goto LABEL_76;
        }
        if( !String2.Buffer )
          goto LABEL_75;
LABEL_76:
        if( (v29[45] & 0x20) != 0 && (v20 & 0x20) == 0 )
          v29[4] |= 1u;
        if( *((_QWORD *)v29 + 21) )
        {
          if( (v35 & 2) == 0 )
          {
            v42 = MigrationContexta;
            v43 = *((_QWORD *)MigrationContexta + 6);
            if( v43 )
            {
              v44 = *(WCHAR **)(v43 + 8);
              if( v44 )
              {
                if( PiDevCfgGetDriverPackageId(v44, &DriverPackageId, v26, v27, (INT64)ResultLength, v60, v62, v63) >= 0 )
                {
                  memset(v82, 0i64, sizeof(v82));
                  v82[0] = (INT64)&DEVPKEY_DriverPackage_OriginalInfName;
                  LODWORD(v61) = 1;
                  v82[2] = (INT64)&UnicodeString;
                  LODWORD(v82[1]) = 18;
                  HIDWORD(v82[3]) = 6;
                  LODWORD(v62) = PiDevCfgQueryObjectProperties(
                                   v45,
                                   (PNP_OBJECT_TYPE)DriverPackageId.Buffer,
                                   (VOID *)8,
                                   0i64,
                                   (UINT64)v82,
                                   v61);
                  v9 = (int)v62;
                  if( (int)v62 < 0 )
                  {
LABEL_116:
                    v11 = Information;
                    goto LABEL_117;
                  }
                  if( SLODWORD(v82[4]) < 0 )
                    RtlInitUnicodeString(&UnicodeString, 0i64);
                  v42 = MigrationContexta;
                }
                p_UnicodeString = &UnicodeString;
                if( !UnicodeString.Buffer )
                  p_UnicodeString = (_UNICODE_STRING *)*((_QWORD *)v42 + 6);
                v78 = *p_UnicodeString;
              }
            }
            HIDWORD(v62) = v35 | 2;
          }
          if( v78.Buffer && !RtlCompareUnicodeString((const _UNICODE_STRING *)v29 + 10, &v78, 1u) )
            v20 |= 2u;
        }
        if( (v29[45] & 2) != 0 && (v20 & 2) == 0 )
          v29[4] |= 1u;
        v47 = *((_QWORD *)v29 + 10) - *(_QWORD *)&Guid.Data1;
        if( !v47 )
          v47 = *((_QWORD *)v29 + 11) - *(_QWORD *)Guid.Data4;
        if( v47 )
        {
          if( (v29[45] & 1) != 0 )
            v29[4] |= 1u;
        }
        else
        {
          v20 |= 1u;
        }
        v48 = (HIWORD(v68) | ((unsigned __int64)(unsigned __int16)v68 << 16)) << 16;
        *((_QWORD *)v29 + 23) = v48;
        if( (v20 & 0x10000000) == 0 )
        {
          v48 |= 0xF000000000000000ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        if( (v20 & 0x200) == 0 )
        {
          v48 |= 0xF000ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        if( (v20 & 0x100) == 0 )
        {
          v48 |= 0x100ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        if( (v20 & 0x20) == 0 )
        {
          v48 |= 0x20ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        if( (v20 & 0x10) == 0 )
        {
          v48 |= 0x10ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        if( (v20 & 2) == 0 )
        {
          v48 |= 2ui64;
          *((_QWORD *)v29 + 23) = v48;
        }
        v11 = Information;
        v49 = (v20 & 1) == 0;
        v7 = v63;
        v10 = v69;
        v5 = v70;
        if( v49 )
          *((_QWORD *)v29 + 23) = v48 | 1;
LABEL_18:
        ++v5;
      }
    }
  }
LABEL_146:
  while( 1 )
  {
    v56 = v64;
    if( v64 == (_PI_DEVCFG_MIGRATION_NODE *)&v64 )
      break;
    if( *((_PI_DEVCFG_MIGRATION_NODE ***)v64 + 1) != &v64 )
      goto LABEL_150;
    v57 = *(_QWORD *)v64;
    if( *(_PI_DEVCFG_MIGRATION_NODE **)(*(_QWORD *)v64 + 8i64) != v64 )
      goto LABEL_150;
    v64 = *(_PI_DEVCFG_MIGRATION_NODE **)v64;
    *(_QWORD *)(v57 + 8) = &v64;
    PiDevCfgFreeDeviceMigrationNode(v56);
  }
  RtlFreeAnsiString(&String2);
  RtlFreeAnsiString(&DestinationString);
  RtlFreeAnsiString(&DriverPackageId);
  RtlFreeAnsiString(&UnicodeString);
  return v9;
}

Referenced by:

PiDevCfgMigrateDevice