PiDevCfgQueryIncludedDriverConfigurations

INT64 __fastcall PiDevCfgQueryIncludedDriverConfigurations(INT64 a1){
  INT64 v1; 
  unsigned int v2; 
  INT64 *v3; 
  int DriverConfiguration; 
  _QWORD *v6; 
  PVOID *v7; 
  INT64 v8; 
  WCHAR *v9; 
  WCHAR *v10; 
  WCHAR *v11; 
  WCHAR *v12; 
  const WCHAR *v13; 
  bool v14; 
  int v15; 
  WCHAR *v16; 
  int v17; 
  WCHAR *v18; 
  WCHAR *v19; 
  __int64 v20; 
  INT64 v21; 
  INT64 v22; 
  wchar_t *v23; 
  INT64 v24; 
  int v25; 
  INT64 *v26; 
  UNICODE_STRING *v27; 
  INT64 v28; 
  __int64 v29; 
  INT64 **v30; 
  const WCHAR *v31; 
  INT64 v32; 
  INT64 v33; 
  PVOID P; 
  struct _UNICODE_STRING DestinationString; 
  unsigned int v37; 
  INT64 v38; 
  wchar_t *Str2; 
  v1 = a1;
  v2 = 0;
  v33 = (INT64)&v33;
  v3 = &v33;
  DestinationString = 0i64;
  P = &v33;
  if( *(_QWORD *)(v1 + 360) )
  {
    DriverConfiguration = PiDevCfgPushDriverNodeEntry((INT64)&v33, v1);
    if( DriverConfiguration < 0 )
      goto LABEL_61;
    do
    {
LABEL_6:
      if( (INT64 *)v33 == &v33 )
        return(unsigned int)DriverConfiguration;
      v6 = P;
      if( *(INT64 **)P != &v33 || (v7 = (PVOID *)*((_QWORD *)P + 1), *v7 != P) )
LABEL_64:
        __fastfail(3u);
      P = (PVOID)*((_QWORD *)P + 1);
      *v7 = &v33;
      v8 = v6[2];
      v32 = v8;
      ExFreePoolWithTag(v6, 0);
      v9 = *(WCHAR **)(v8 + 360);
    }
    while( !v9 );
    while( 1 )
    {
      if( !*v9 )
      {
LABEL_58:
        if( DriverConfiguration < 0 )
          goto LABEL_61;
        goto LABEL_6;
      }
      v10 = v9;
      v11 = v9;
      v12 = wcschr(v9, 0x3Au);
      if( v12 )
      {
        v13 = v12 + 1;
        *v12 = 0;
        v31 = v12 + 1;
        v9 = v12 + 1;
        v14 = *v11 < 0x2Au;
        if( *v11 != 42 || (v14 = 0, v11[1]) )
          v15 = v14 ? -1 : 1;
        else
          v15 = 0;
        Str2 = (wchar_t *)((unsigned __int64)v10 & -(__int64)(v15 != 0));
        v16 = wcsrchr(v13, 0x2Eu);
        if( v16 )
        {
          *v16 = 0;
          v9 = v16 + 1;
          v17 = v16[1] - 42;
          if( v16[1] == 42 )
            v17 = v16[2];
          if( v17 )
          {
            v37 = 0;
            v9 = v16 + 1;
            if( v16[1] )
            {
              do
              {
                v18 = wcschr(v9, 0x2Cu);
                if( v18 )
                {
                  *v18 = 0;
                  v19 = v18 + 1;
                }
                else
                {
                  v20 = -1i64;
                  do
                    ++v20;
                  while( v9[v20] );
                  v19 = &v9[v20];
                }
                v2 |= PiDevCfgGetDriverConfigurationKeyScope(v9);
                v9 = v19;
              }
              while( *v19 );
              v37 = v2;
            }
            v2 = 0;
          }
          else
          {
            v37 = -1;
          }
          v38 = 0i64;
          RtlInitUnicodeString(&DestinationString, v13, v17);
          v21 = v1 + 368;
          v22 = *(_QWORD *)(v1 + 368);
          if( v22 != v1 + 368 )
          {
            v23 = Str2;
            do
            {
              v38 = v22;
              if( RtlEqualUnicodeString((UNICODE_STRING *)(v22 + 88), &DestinationString, 1u) )
              {
                v24 = v22;
                if( !v23 || !wcsicmp(*(const wchar_t **)(v22 + 48), v23) )
                  break;
              }
              v22 = *(_QWORD *)v22;
              v24 = 0i64;
              v38 = 0i64;
            }
            while( v22 != v21 );
            v1 = a1;
            v13 = v31;
            if( v24 )
            {
              v2 = 0;
              goto LABEL_52;
            }
            v2 = 0;
          }
          v25 = PiDevCfgQueryIncludedDriverNode(v32, Str2, v13, v37, &v38);
          DriverConfiguration = v25;
          if( v25 < 0 )
          {
            *(_DWORD *)(v1 + 412) = v25;
            goto LABEL_58;
          }
          v26 = *(INT64 **)(v21 + 8);
          if( *v26 != v21 )
            goto LABEL_64;
          v27 = (UNICODE_STRING *)v38;
          v28 = v38;
          *(_QWORD *)v38 = v21;
          *(_QWORD *)(v28 + 8) = v26;
          *v26 = v28;
          *(_QWORD *)(v21 + 8) = v28;
          DriverConfiguration = PiDevCfgQueryDriverConfiguration(v28);
          if( DriverConfiguration < 0 )
            goto LABEL_61;
          if( v27[18].Buffer
            && !*(_QWORD *)(v1 + 296)
            && !PnpDuplicateUnicodeString((UNICODE_STRING *)(v1 + 288), v27 + 18) )
          {
            DriverConfiguration = -1073741670;
            goto LABEL_58;
          }
          if( v27[19].Buffer )
          {
            DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)(v1 + 304), 0i64, v27 + 19, 0);
            if( DriverConfiguration < 0 )
              goto LABEL_61;
          }
          if( v27[20].Buffer )
          {
            DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)(v1 + 320), 0i64, v27 + 20, 0);
            if( DriverConfiguration < 0 )
              goto LABEL_61;
          }
          DriverConfiguration = PiDevCfgPushDriverNodeEntry((INT64)&v33, (INT64)v27);
          if( DriverConfiguration < 0 )
            goto LABEL_61;
        }
      }
LABEL_52:
      v29 = -1i64;
      do
        ++v29;
      while( v9[v29] );
      v9 += v29 + 1;
    }
  }
  DriverConfiguration = 0;
  while( (INT64 *)v33 != &v33 )
  {
    if( (INT64 *)*v3 != &v33 )
      goto LABEL_64;
    v30 = (INT64 **)v3[1];
    if( *v30 != v3 )
      goto LABEL_64;
    P = (PVOID)v3[1];
    *v30 = &v33;
    ExFreePoolWithTag(v3, 0);
LABEL_61:
    v3 = (INT64 *)P;
  }
  return(unsigned int)DriverConfiguration;
}

Referenced by:

PiDevCfgQueryDriverConfiguration