PiDevCfgQueryDeviceMigrationNode

NTSTATUS __stdcall PiDevCfgQueryDeviceMigrationNode(
        PI_DEVCFG_MIGRATION_CONTEXT *MigrationContext,
        WCHAR *DeviceInstanceId,
        PI_DEVCFG_MIGRATION_NODE **MigrationNodeResult){
  unsigned int v3; 
  VOID *v5; 
  __int64 v6; 
  int v7; 
  VOID **PoolWithTag; 
  VOID **v9; 
  __m128i v10; 
  __m128i v11; 
  __m128i si128; 
  __m128i v13; 
  __m128i v14; 
  _KEXCEPTION_FRAME *v15; 
  int v16; 
  _QWORD *v17; 
  _WORD *v18; 
  _UNICODE_STRING *v19; 
  VOID *Handle; 
  _UNICODE_STRING GuidString; 
  PI_DEVCFG_MIGRATION_NODE **v23; 
  __int64 v24[70]; 

  v3 = 0;
  v23 = MigrationNodeResult;
  Handle = 0i64;
  v5 = (VOID *)*((_QWORD *)MigrationContext + 1);
  *(_QWORD *)&GuidString.Length = 0i64;
  GuidString.Buffer = 0i64;
  if( *(&stru_140CF2E80 + 607) )
    v6 = *(_QWORD *)(*(&stru_140CF2E80 + 607) + 224i64);
  else
    v6 = 0i64;
  v7 = SysCtxRegOpenKey(v6, v5, DeviceInstanceId, 0, 0x20019u, &Handle);
  if( v7 >= 0 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0xC0ui64, 1667526736i64);
    v9 = PoolWithTag;
    v10 = _mm_unpacklo_epi64((__m128i)(unsigned __int64)PoolWithTag, (__m128i)(unsigned __int64)PoolWithTag);
    if( !PoolWithTag )
    {
      v7 = -1073741670;
      goto LABEL_32;
    }
    memset(PoolWithTag, 0i64, 0xB8u);
    v9[23] = (VOID *)-1i64;
    if( !RtlCreateUnicodeString((INT64)(v9 + 3), (INT8 *)DeviceInstanceId) )
    {
      v7 = -1073741670;
LABEL_31:
      PiDevCfgFreeDeviceMigrationNode((_PI_DEVCFG_MIGRATION_NODE *)v9);
      goto LABEL_32;
    }
    v9[5] = Handle;
    Handle = 0i64;
    memset(v24, 0i64, sizeof(v24));
    v11 = _mm_loadu_si128((const __m128i *)&PiDevCfgSystemRoot + 1);
    si128 = _mm_load_si128((const __m128i *)&_xmm);
    v13 = _mm_load_si128((const __m128i *)&_xmm);
    v24[2] = v11.m128i_i64[0];
    v24[9] = _mm_srli_si128(v11, 8).m128i_u64[0];
    LODWORD(v24[4]) = _mm_cvtsi128_si32(si128);
    v24[16] = (__int64)L"ClassGuid";
    v24[17] = (__int64)&GuidString;
    v24[23] = (__int64)L"Capabilities";
    v24[24] = (__int64)(v9 + 12);
    v24[30] = (__int64)L"BusDeviceDesc";
    v24[37] = (__int64)L"LocationInfo";
    v24[44] = (__int64)L"LocationPaths";
    v24[45] = (__int64)(v9 + 17);
    v24[51] = (__int64)L"DriverInfName";
    v14 = _mm_add_epi64(
            _mm_slli_epi64(
              _mm_add_epi64(_mm_unpacklo_epi32(_mm_load_si128((const __m128i *)&_xmm), (__m128i)0i64), (__m128i)_xmm),
              4u),
            v10);
    v24[58] = (__int64)L"Present";
    v24[3] = v14.m128i_i64[0];
    LODWORD(v24[1]) = _mm_cvtsi128_si32(v13);
    LODWORD(v24[18]) = 0x1000000;
    LODWORD(v24[15]) = 288;
    LODWORD(v24[25]) = 0x4000000;
    LODWORD(v24[22]) = 288;
    LODWORD(v24[32]) = 0x1000000;
    LODWORD(v24[29]) = 288;
    LODWORD(v24[39]) = 0x1000000;
    LODWORD(v24[36]) = 288;
    LODWORD(v24[53]) = 0x1000000;
    v15 = (_KEXCEPTION_FRAME *)v9[5];
    LODWORD(v24[50]) = 288;
    LODWORD(v24[60]) = 0x4000000;
    LODWORD(v24[57]) = 288;
    v24[59] = (__int64)(v9 + 22);
    LODWORD(v24[11]) = _mm_cvtsi128_si32(_mm_srli_si128(si128, 4));
    v24[10] = _mm_srli_si128(v14, 8).m128i_u64[0];
    LODWORD(v24[8]) = _mm_cvtsi128_si32(_mm_srli_si128(v13, 4));
    v24[31] = (__int64)(v9 + 13);
    v24[38] = (__int64)(v9 + 15);
    LODWORD(v24[46]) = 117440512;
    LODWORD(v24[43]) = 304;
    v24[52] = (__int64)(v9 + 20);
    LOBYTE(v16) = RtlpQueryRegistryValues((_KTRAP_FRAME *)0xC0000000i64, v15);
    v7 = v16;
    if( v16 < 0 )
      goto LABEL_31;
    if( !GuidString.Buffer || RtlGUIDFromString(&GuidString, (_GUID *)v9 + 5) < 0 )
    {
      v7 = -1073741772;
      goto LABEL_31;
    }
    v17 = v9 + 7;
    do
    {
      if( *((_WORD *)v17 - 4) <= 2u && *v17 )
        RtlFreeAnsiString((_UNICODE_STRING *)&v9[2 * v3 + 6]);
      ++v3;
      v17 += 2;
    }
    while( v3 < 2 );
    if( !*((_WORD *)v9 + 52) && v9[14] )
      RtlFreeAnsiString((_UNICODE_STRING *)(v9 + 13));
    if( !*((_WORD *)v9 + 60) && v9[16] )
      RtlFreeAnsiString((_UNICODE_STRING *)(v9 + 15));
    v18 = v9[18];
    if( v18 && !PnpValidateMultiSzData(v18, *((unsigned __int16 *)v9 + 68)) )
      RtlFreeAnsiString(v19);
    if( !*((_WORD *)v9 + 80) && v9[21] )
      RtlFreeAnsiString((_UNICODE_STRING *)v9 + 10);
    *v23 = (PI_DEVCFG_MIGRATION_NODE *)v9;
  }
LABEL_32:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  RtlFreeAnsiString(&GuidString);
  return v7;
}

Referenced by:

PiDevCfgFindDeviceMigrationNode
PiDevCfgMigrateDevice