PiDevCfgGetMigrationDeviceIdScore

UINT16 __stdcall PiDevCfgGetMigrationDeviceIdScore(PWCHAR SourceDeviceIds, PWCHAR TargetDeviceIds){
  const wchar_t *v2; 
  PWCHAR v3; 
  UINT16 v4; 
  char v5; 
  unsigned __int16 v6; 
  const wchar_t *v7; 
  wchar_t v8; 
  const wchar_t *v9; 
  __int64 v10; 
  UINT16 v11; 
  __int64 v12; 
  const wchar_t *v13; 
  unsigned __int16 v14; 
  __int64 v15; 
  __int64 v16; 
  WCHAR *v17; 
  bool v18; 
  __int64 v19; 
  const wchar_t *v20; 
  v2 = TargetDeviceIds;
  v3 = SourceDeviceIds;
  v4 = 0;
  v5 = 0;
  if( !SourceDeviceIds )
    return -1;
  if( !TargetDeviceIds )
    return -1;
  v6 = 0x4000;
  v7 = TargetDeviceIds;
  if( !*TargetDeviceIds )
    return -1;
  do
  {
    v8 = *v3;
    v9 = v3;
    if( *v3 )
    {
      while( wcsicmp(v9, v7) )
      {
        v10 = -1i64;
        do
          ++v10;
        while( v9[v10] );
        v9 += v10 + 1;
        if( !*v9 )
        {
          v8 = 0;
          goto LABEL_11;
        }
      }
      v8 = *v9;
      v5 = 1;
    }
LABEL_11:
    v11 = v4 | v6;
    if( v8 )
      v11 = v4;
    v4 = v11;
    v12 = -1i64;
    do
      ++v12;
    while( v7[v12] );
    v13 = &v7[v12];
    v14 = v6 >> 1;
    v7 = v13 + 1;
    if( v6 <= 2u )
      v14 = v6;
    v6 = v14;
  }
  while( *v7 );
  if( !v5 )
    return -1;
  if( wcsicmp(v3, v2) )
    v4 |= 0x8000u;
  v15 = -1i64;
  do
    ++v15;
  while( v3[v15] );
  while( 1 )
  {
    v18 = v3[v15 + 1] == 0;
    v16 = -1i64;
    if( v18 )
      break;
    do
      ++v16;
    while( v3[v16] );
    v17 = &v3[v16];
    v15 = -1i64;
    v3 = v17 + 1;
    do
      ++v15;
    while( v3[v15] );
  }
  do
    ++v16;
  while( v2[v16] );
  while( v2[v16 + 1] )
  {
    v19 = -1i64;
    do
      ++v19;
    while( v2[v19] );
    v20 = &v2[v19];
    v16 = -1i64;
    v2 = v20 + 1;
    do
      ++v16;
    while( v2[v16] );
  }
  if( wcsicmp(v3, v2) )
    v4 |= 1u;
  return v4;
}

Referenced by:

PiDevCfgFindDeviceMigrationNode