PiDevCfgQueryIncludedDriverConfigurations

NTSTATUS __stdcall PiDevCfgQueryIncludedDriverConfigurations(PI_DEVCFG_DRIVER_NODE *DriverNode){
  PI_DEVCFG_DRIVER_NODE *v1; 
  unsigned int v2; 
  _LIST_ENTRY *p_DriverNodeStack; 
  int DriverConfiguration; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *Flink; 
  WORD *v9; 
  WORD *v10; 
  WORD *v11; 
  WORD *v12; 
  WORD *v13; 
  bool v14; 
  int v15; 
  WORD *v16; 
  int v17; 
  WORD *v18; 
  WORD *v19; 
  __int64 v20; 
  PI_DEVCFG_DRIVER_NODE *v21; 
  PI_DEVCFG_DRIVER_NODE *v22; 
  wchar_t *v23; 
  PI_DEVCFG_DRIVER_NODE *v24; 
  NTSTATUS v25; 
  _PI_DEVCFG_DRIVER_NODE **v26; 
  _PI_DEVCFG_DRIVER_NODE *v27; 
  _PI_DEVCFG_DRIVER_NODE *v28; 
  __int64 v29; 
  _LIST_ENTRY *v30; 
  WORD *v31; 
  PI_DEVCFG_DRIVER_NODE *DriverNodeParent; 
  _LIST_ENTRY DriverNodeStack; 
  _UNICODE_STRING DestinationString; 
  unsigned int ConfigurationScope; 
  _PI_DEVCFG_DRIVER_NODE *DriverNodea; 
  wchar_t *Str2; 

  v1 = DriverNode;
  v2 = 0;
  DriverNodeStack.Flink = &DriverNodeStack;
  p_DriverNodeStack = &DriverNodeStack;
  DestinationString = 0i64;
  DriverNodeStack.Blink = &DriverNodeStack;
  if( *((_QWORD *)v1 + 45) )
  {
    DriverConfiguration = PiDevCfgPushDriverNodeEntry(&DriverNodeStack, v1);
    if( DriverConfiguration < 0 )
      goto LABEL_61;
    do
    {
LABEL_6:
      if( DriverNodeStack.Flink == &DriverNodeStack )
        return DriverConfiguration;
      Blink = DriverNodeStack.Blink;
      if( DriverNodeStack.Blink->Flink != &DriverNodeStack
        || (v7 = DriverNodeStack.Blink->Blink, v7->Flink != DriverNodeStack.Blink) )
      {
LABEL_64:
        __fastfail(3u);
      }
      DriverNodeStack.Blink = DriverNodeStack.Blink->Blink;
      v7->Flink = &DriverNodeStack;
      Flink = Blink[1].Flink;
      DriverNodeParent = (PI_DEVCFG_DRIVER_NODE *)Flink;
      ExFreePoolWithTag(Blink, 0);
      v9 = (WORD *)Flink[22].Blink;
    }
    while( !v9 );
    while( 1 )
    {
      if( !*v9 )
      {
LABEL_58:
        if( DriverConfiguration < 0 )
          goto LABEL_61;
        goto LABEL_6;
      }
      v10 = v9;
      v11 = v9;
      v12 = wcschr(v9, 58);
      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, 46);
        if( v16 )
        {
          *v16 = 0;
          v9 = v16 + 1;
          v17 = v16[1] - 42;
          if( v16[1] == 42 )
            v17 = v16[2];
          if( v17 )
          {
            ConfigurationScope = 0;
            v9 = v16 + 1;
            if( v16[1] )
            {
              do
              {
                v18 = wcschr(v9, 44);
                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 );
              ConfigurationScope = v2;
            }
            v2 = 0;
          }
          else
          {
            ConfigurationScope = -1;
          }
          DriverNodea = 0i64;
          RtlInitUnicodeString(&DestinationString, v13);
          v21 = v1 + 92;
          v22 = (PI_DEVCFG_DRIVER_NODE *)*((_QWORD *)v1 + 46);
          if( v22 != v1 + 92 )
          {
            v23 = Str2;
            do
            {
              DriverNodea = v22;
              if( (unsigned __int8)RtlEqualUnicodeString((PCUNICODE_STRING)(v22 + 22), &DestinationString, 1u) )
              {
                v24 = v22;
                if( !v23 || !wcsicmp(*((const wchar_t **)v22 + 6), v23) )
                  break;
              }
              v22 = *(PI_DEVCFG_DRIVER_NODE **)v22;
              v24 = 0i64;
              DriverNodea = 0i64;
            }
            while( v22 != v21 );
            v1 = DriverNode;
            v13 = v31;
            if( v24 )
            {
              v2 = 0;
              goto LABEL_52;
            }
            v2 = 0;
          }
          v25 = PiDevCfgQueryIncludedDriverNode(DriverNodeParent, Str2, v13, ConfigurationScope, &DriverNodea);
          DriverConfiguration = v25;
          if( v25 < 0 )
          {
            v1[103] = v25;
            goto LABEL_58;
          }
          v26 = (_PI_DEVCFG_DRIVER_NODE **)*((_QWORD *)v21 + 1);
          if( *v26 != v21 )
            goto LABEL_64;
          v27 = DriverNodea;
          v28 = DriverNodea;
          *(_QWORD *)DriverNodea = v21;
          *((_QWORD *)v28 + 1) = v26;
          *v26 = v28;
          *((_QWORD *)v21 + 1) = v28;
          DriverConfiguration = PiDevCfgQueryDriverConfiguration(v28);
          if( DriverConfiguration < 0 )
            goto LABEL_61;
          if( *((_QWORD *)v27 + 37)
            && !*((_QWORD *)v1 + 37)
            && !PnpDuplicateUnicodeString((__int64)(v1 + 72), (__int64)(v27 + 72)) )
          {
            DriverConfiguration = -1073741670;
            goto LABEL_58;
          }
          if( *((_QWORD *)v27 + 39) )
          {
            DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)v1 + 19, 0i64, (const VOID **)v27 + 38, 0);
            if( DriverConfiguration < 0 )
              goto LABEL_61;
          }
          if( *((_QWORD *)v27 + 41) )
          {
            DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)v1 + 20, 0i64, (const VOID **)v27 + 40, 0);
            if( DriverConfiguration < 0 )
              goto LABEL_61;
          }
          DriverConfiguration = PiDevCfgPushDriverNodeEntry(&DriverNodeStack, v27);
          if( DriverConfiguration < 0 )
            goto LABEL_61;
        }
      }
LABEL_52:
      v29 = -1i64;
      do
        ++v29;
      while( v9[v29] );
      v9 += v29 + 1;
    }
  }
  DriverConfiguration = 0;
  while( DriverNodeStack.Flink != &DriverNodeStack )
  {
    if( p_DriverNodeStack->Flink != &DriverNodeStack )
      goto LABEL_64;
    v30 = p_DriverNodeStack->Blink;
    if( v30->Flink != p_DriverNodeStack )
      goto LABEL_64;
    DriverNodeStack.Blink = p_DriverNodeStack->Blink;
    v30->Flink = &DriverNodeStack;
    ExFreePoolWithTag(p_DriverNodeStack, 0);
LABEL_61:
    p_DriverNodeStack = DriverNodeStack.Blink;
  }
  return DriverConfiguration;
}

Referenced by:

PiDevCfgQueryDriverConfiguration