PiDevCfgResolveVariableExpression

NTSTATUS __stdcall PiDevCfgResolveVariableExpression(
        _PI_DEVCFG_RESOLVE_CONTEXT *ResolveContext,
        VOID *VariableKeyHandle,
        _PI_DEVCFG_VARIABLE_ENTRY *VariableEntryResult){
  _PI_DEVCFG_VARIABLE_ENTRY *v3; 
  __int64 v4; 
  unsigned int v5; 
  NTSTATUS RegistryValue; 
  _KEY_VALUE_FULL_INFORMATION *v7; 
  int v8; 
  _PI_DEVCFG_VARIABLE_ENTRY *v9; 
  _PI_DEVCFG_VARIABLE_ENTRY *v10; 
  __int64 v11; 
  _PI_DEVCFG_VARIABLE_ENTRY **v12; 
  __int16 v13; 
  __int64 v14; 
  VOID **v15; 
  __int64 *v16; 
  wchar_t **v17; 
  unsigned int v18; 
  NTSTATUS v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  __int16 v25; 
  VOID **v26; 
  int v27; 
  int v28; 
  unsigned int v29; 
  _WORD *v30; 
  int v31; 
  int v32; 
  bool v33; 
  __int64 v34; 
  int v35; 
  int v36; 
  int v37; 
  int v38; 
  VOID **PoolWithTag; 
  __int64 v40; 
  unsigned __int16 v41; 
  _WORD *v42; 
  int v43; 
  int v44; 
  int v45; 
  char v46; 
  bool v47; 
  unsigned int v48; 
  int v49; 
  WCHAR v50; 
  UINT64 v51; 
  WCHAR *v52; 
  WCHAR *v53; 
  int v54; 
  int v55; 
  int v56; 
  int v57; 
  int v58; 
  int v59; 
  __int64 v60; 
  size_t v61; 
  unsigned __int16 v62; 
  unsigned __int64 v63; 
  VOID **v64; 
  VOID **v65; 
  NTSTATUS v66; 
  _BOOL8 v67; 
  int v68; 
  int v69; 
  int v70; 
  int v71; 
  NTSTATUS v72; 
  unsigned int v73; 
  NTSTATUS v74; 
  NTSTATUS v75; 
  NTSTATUS v76; 
  int v77; 
  _WORD *v78; 
  size_t v79; 
  int v80; 
  __int64 v81; 
  VOID **v82; 
  unsigned __int64 v83; 
  _BYTE *v84; 
  const VOID *v85; 
  WCHAR *v86; 
  VOID **v87; 
  __int64 v88; 
  UINT64 v89; 
  VOID **v90; 
  int v91; 
  unsigned int v92; 
  unsigned int v93; 
  int v94; 
  int v95; 
  int v96; 
  int v97; 
  int v98; 
  int v99; 
  int v100; 
  int v101; 
  int v102; 
  unsigned int v103; 
  int v104; 
  int v105; 
  int v106; 
  int v107; 
  int v108; 
  int v109; 
  int v110; 
  _BOOL8 v111; 
  const VOID *v112; 
  UINT64 v113; 
  int v114; 
  NTSTATUS v115; 
  VOID **v116; 
  int v117; 
  unsigned __int64 v118; 
  const VOID *v119; 
  const VOID *v120; 
  size_t v121; 
  VOID **v122; 
  VOID **v123; 
  bool v124; 
  unsigned __int16 v125; 
  int v126; 
  unsigned __int16 v127; 
  wchar_t *v128; 
  unsigned __int16 v129; 
  int v130; 
  int v131; 
  int v132; 
  int v133; 
  int v134; 
  int v135; 
  int v136; 
  int v137; 
  VOID **v138; 
  unsigned int v139; 
  bool v140; 
  _BYTE *v141; 
  int v142; 
  VOID **v144; 
  __int64 v145; 
  __int128 *v146; 
  _QWORD *v147; 
  void *v148; 
  __int64 v149; 
  unsigned int v150; 
  __int128 *v151; 
  __int64 v152; 
  _QWORD *v153; 
  void *v154; 
  PVOID v155; 
  PVOID **v156; 
  __int64 v157; 
  PVOID *v158; 
  VOID **v160; 
  VOID **v161; 
  __int16 v162; 
  unsigned int v163; 
  unsigned __int16 v164; 
  unsigned int v165; 
  _PI_DEVCFG_VARIABLE_ENTRY *VariableEntryResulta; 
  int v167; 
  unsigned int v168; 
  _PI_DEVCFG_VARIABLE_ENTRY *v169; 
  PVOID P; 
  _KEY_VALUE_FULL_INFORMATION *Information; 
  _UNICODE_STRING String2; 
  _UNICODE_STRING String1; 
  __int64 v174; 
  _PI_DEVCFG_RESOLVE_CONTEXT *ResolveContexta; 
  __int128 v176; 
  __int64 v177; 

  v169 = VariableEntryResult;
  ResolveContexta = ResolveContext;
  v174 = 0i64;
  v177 = 0i64;
  v3 = VariableEntryResult;
  Information = 0i64;
  LODWORD(v4) = 0;
  v165 = 0;
  v5 = 0;
  v176 = 0i64;
  RegistryValue = IopGetRegistryValue(VariableKeyHandle, (PWCHAR)L"Tokens", 0i64, &Information);
  v7 = Information;
  v8 = RegistryValue;
  if( RegistryValue < 0 )
    goto LABEL_368;
  if( !PnpValidateRegistryMultiSz(Information) )
    goto LABEL_367;
  v9 = (_PI_DEVCFG_VARIABLE_ENTRY *)((char *)v7 + v7->DataOffset);
  VariableEntryResulta = v9;
  v10 = v9;
  if( !*(_WORD *)v9 )
    goto LABEL_367;
  do
  {
    ++v5;
    v11 = -1i64;
    do
      ++v11;
    while( *((_WORD *)v10 + v11) );
    v10 = (_PI_DEVCFG_VARIABLE_ENTRY *)((char *)v10 + 2 * v11 + 2);
  }
  while( *(_WORD *)v10 );
  v168 = v5;
  if( !v5 )
  {
LABEL_367:
    v8 = -1073741823;
    goto LABEL_368;
  }
  P = ExAllocatePoolWithTag(1ui64, 8i64 * v5, 1667526736i64);
  v12 = (_PI_DEVCFG_VARIABLE_ENTRY **)P;
  if( !P )
  {
    v8 = -1073741670;
    goto LABEL_368;
  }
  v13 = *(_WORD *)v9;
  if( !*(_WORD *)v9 )
    goto LABEL_355;
  v14 = v176;
  v15 = 0i64;
  while( 1 )
  {
    v16 = 0i64;
    if( v13 )
    {
      if( *((_WORD *)v9 + 1) && *((_WORD *)v9 + 2) )
        goto LABEL_18;
      v17 = &off_140988550;
      v18 = 1;
      while( *v9 != *(_DWORD *)*v17 )
      {
        ++v18;
        v17 += 3;
        if( v18 >= 0x1B )
          goto LABEL_18;
      }
      v16 = &qword_140988530[3 * v18];
    }
    if( v16 )
      break;
LABEL_18:
    if( (unsigned int)v4 >= v5 )
    {
      v8 = -1073741571;
      goto LABEL_354;
    }
    VariableEntryResulta = 0i64;
    v19 = PiDevCfgResolveVariable(ResolveContexta, (WCHAR *)v9, &VariableEntryResulta);
    v8 = v19;
    if( v19 < 0 )
    {
      if( v19 == -1073741772 )
        v8 = -1073741823;
      goto LABEL_354;
    }
    v12[(unsigned int)v4] = VariableEntryResulta;
LABEL_331:
    LODWORD(v4) = v4 + 1;
    v165 = v4;
    v149 = -1i64;
    do
      ++v149;
    while( *((_WORD *)v9 + v149) );
    v9 = (_PI_DEVCFG_VARIABLE_ENTRY *)((char *)v9 + 2 * v149 + 2);
    VariableEntryResulta = v9;
    v13 = *(_WORD *)v9;
    if( !*(_WORD *)v9 )
    {
      v165 = v4;
LABEL_354:
      v3 = v169;
LABEL_355:
      if( v8 < 0 )
        goto LABEL_358;
      if( (_DWORD)v4 != 1 )
      {
        v8 = -1073741823;
        goto LABEL_358;
      }
      v8 = PiDevCfgCopyVariableData(v3, *v12);
      v150 = 0;
      goto LABEL_343;
    }
  }
  v20 = *((_DWORD *)v16 + 4);
  v21 = 0i64;
  v163 = 0;
  if( v20 )
  {
    v163 = 0;
    while( (_DWORD)v4 )
    {
      v4 = (unsigned int)(v4 - 1);
      v165 = v4;
      *((_QWORD *)&v176 + v21) = v12[v4];
      v21 = (unsigned int)(v21 + 1);
      v163 = v21;
      if( (unsigned int)v21 >= v20 )
        goto LABEL_27;
    }
    v8 = -1073741823;
LABEL_27:
    v22 = v177;
    v14 = v176;
    v174 = v177;
  }
  else
  {
    v22 = v174;
  }
  if( v8 < 0 )
    goto LABEL_342;
  v167 = 0;
  v160 = 0i64;
  LODWORD(v23) = 0;
  LOWORD(v24) = 0;
  v162 = 0;
  v25 = 0;
  v164 = 0;
  v26 = 0i64;
  if( (_DWORD)v21 == 1 )
  {
    v27 = *(_DWORD *)v16;
    v28 = *(_DWORD *)v16 - 22;
    if( v28 )
    {
      v14 = v176;
      if( v28 != 1 )
      {
        v29 = *(_DWORD *)(v176 + 32);
        if( !v29 )
          goto LABEL_40;
        if( v29 > 2 )
        {
          if( v29 == 4 )
          {
            v35 = **(_DWORD **)(v176 + 40);
            v36 = v27 - 11;
            if( !v36 )
            {
              LODWORD(v23) = ~v35;
              goto LABEL_41;
            }
            v37 = v36 - 1;
            if( v37 )
            {
              v38 = v37 - 13;
              if( !v38 )
              {
                LODWORD(v23) = **(_DWORD **)(v176 + 40);
                goto LABEL_41;
              }
              if( v38 == 1 )
              {
                v164 = 20;
                v162 = 22;
                LOWORD(v24) = 22;
                PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x16ui64, 1667526736i64);
                v15 = PoolWithTag;
                if( PoolWithTag )
                {
                  v8 = RtlStringCchPrintfW((WCHAR *)PoolWithTag, 0xBui64, (WCHAR *)L"%u");
                  if( v8 < 0 )
                  {
                    ExFreePoolWithTag(v15, 0);
                    v15 = 0i64;
                  }
                  else
                  {
                    v40 = -1i64;
                    do
                      ++v40;
                    while( *((_WORD *)v15 + v40) );
                    v41 = 2 * v40;
                    v24 = (unsigned __int16)(v41 + 2);
                    v164 = v41;
                    v162 = v41 + 2;
                  }
                  goto LABEL_42;
                }
                goto LABEL_335;
              }
LABEL_40:
              v26 = (VOID **)qword_1409837A8;
              goto LABEL_41;
            }
            v33 = v35 == 0;
          }
          else
          {
            if( v29 != 7 )
              goto LABEL_40;
            v30 = *(_WORD **)(v176 + 40);
            v31 = v27 - 11;
            if( !v31 )
            {
              while( *v30 )
              {
                LODWORD(v23) = v23 + 1;
                v34 = -1i64;
                do
                  ++v34;
                while( v30[v34] );
                v30 += v34 + 1;
              }
              goto LABEL_41;
            }
            if( v31 != 1 )
              goto LABEL_40;
            v33 = *v30 == 0;
          }
LABEL_51:
          LODWORD(v23) = v33;
          goto LABEL_41;
        }
        v42 = *(_WORD **)(v176 + 40);
        v43 = v27 - 11;
        if( !v43 )
        {
          v23 = -1i64;
          do
            ++v23;
          while( v42[v23] );
          goto LABEL_41;
        }
        v44 = v43 - 1;
        if( !v44 )
        {
          v33 = *v42 == 0;
          goto LABEL_51;
        }
        v45 = v44 - 13;
        if( v45 )
        {
          v15 = 0i64;
          if( v45 != 1 )
          {
            v26 = (VOID **)qword_1409837A8;
LABEL_75:
            v14 = v176;
            goto LABEL_43;
          }
LABEL_76:
          v26 = (VOID **)v14;
          goto LABEL_75;
        }
        v46 = PnpStringToDwordValue(*(_QWORD *)(v176 + 40), &v167);
        v14 = v176;
        if( v46 )
          LODWORD(v23) = v167;
        else
          LODWORD(v23) = 0;
        v15 = 0i64;
        goto LABEL_43;
      }
      if( *(_DWORD *)(v176 + 32) )
        goto LABEL_43;
LABEL_89:
      LODWORD(v23) = 1;
      goto LABEL_43;
    }
    v47 = *(_DWORD *)(v14 + 32) == 0;
LABEL_88:
    if( v47 )
      goto LABEL_43;
    goto LABEL_89;
  }
  if( (_DWORD)v21 != 2 )
  {
    if( (_DWORD)v21 != 3 )
      goto LABEL_43;
    v139 = *(_DWORD *)(v22 + 32);
    if( v139 )
    {
      if( v139 <= 2 )
      {
        v140 = *(_DWORD *)(v22 + 36) >= 2u;
      }
      else
      {
        switch( v139 )
        {
          case 3u:
            v141 = *(_BYTE **)(v22 + 40);
            v142 = *(_DWORD *)(v22 + 36);
            if( !v142 )
            {
LABEL_315:
              v26 = (VOID **)v14;
              goto LABEL_43;
            }
            while( !*v141++ )
            {
              if( !--v142 )
                goto LABEL_315;
            }
LABEL_316:
            v26 = (VOID **)*((_QWORD *)&v176 + 1);
            goto LABEL_43;
          case 4u:
            v140 = **(_DWORD **)(v22 + 40) != 0;
            break;
          case 7u:
            v140 = *(_DWORD *)(v22 + 36) > 4u;
            break;
          default:
            goto LABEL_316;
        }
      }
    }
    else
    {
      v140 = 0;
    }
    if( !v140 )
      goto LABEL_315;
    goto LABEL_316;
  }
  v48 = *(_DWORD *)(*((_QWORD *)&v176 + 1) + 32i64);
  if( !v48 )
  {
LABEL_298:
    v26 = (VOID **)qword_1409837A8;
    goto LABEL_43;
  }
  if( v48 <= 2 )
  {
    v116 = (VOID **)v176;
    v117 = *(_DWORD *)(v176 + 32);
    if( (unsigned int)(v117 - 1) <= 1 )
    {
      v124 = *(_DWORD *)(*((_QWORD *)&v176 + 1) + 36i64) <= 0xFFFEu;
      String1 = 0i64;
      String2 = 0i64;
      if( v124 && *(_DWORD *)(v176 + 36) <= 0xFFFEu )
      {
        v125 = *(_WORD *)(*((_QWORD *)&v176 + 1) + 36i64);
        v126 = *(_DWORD *)v16;
        v127 = v125 - 2;
        v128 = *(wchar_t **)(*((_QWORD *)&v176 + 1) + 40i64);
        v23 = *(_QWORD *)(v176 + 40);
        String2.MaximumLength = *(_WORD *)(v176 + 36);
        v129 = String2.MaximumLength - 2;
        String1.Buffer = v128;
        String1.MaximumLength = v125;
        String1.Length = v125 - 2;
        String2.Buffer = (wchar_t *)v23;
        String2.Length = String2.MaximumLength - 2;
        v130 = v126 - 1;
        if( v130 )
        {
          v131 = v130 - 12;
          if( !v131 )
          {
            if( v127 >= 2u && v129 >= 2u )
              goto LABEL_107;
            goto LABEL_287;
          }
          v132 = v131 - 1;
          if( !v132 )
          {
            if( v127 >= 2u || v129 >= 2u )
              goto LABEL_107;
            goto LABEL_287;
          }
          v133 = v132 - 1;
          if( !v133 )
          {
            v66 = RtlCompareUnicodeString(&String1, &String2, 1u);
            goto LABEL_138;
          }
          v134 = v133 - 1;
          if( !v134 )
          {
            v67 = RtlCompareUnicodeString(&String1, &String2, 1u) != 0;
            goto LABEL_139;
          }
          v135 = v134 - 1;
          if( !v135 )
          {
            v73 = RtlCompareUnicodeString(&String1, &String2, 1u);
            goto LABEL_149;
          }
          v136 = v135 - 1;
          if( v136 )
          {
            v137 = v136 - 1;
            if( v137 )
            {
              if( v137 != 1 )
                goto LABEL_146;
              v72 = RtlCompareUnicodeString(&String1, &String2, 1u);
LABEL_148:
              v73 = ~v72;
LABEL_149:
              v59 = v73 >> 31;
              goto LABEL_108;
            }
            v74 = RtlCompareUnicodeString(&String1, &String2, 1u);
LABEL_151:
            v67 = v74 <= 0;
            goto LABEL_139;
          }
          v75 = RtlCompareUnicodeString(&String1, &String2, 1u);
LABEL_153:
          v67 = v75 > 0;
          goto LABEL_139;
        }
        if( *v128 )
        {
          if( *(_WORD *)v23 )
          {
            if( v127 + (unsigned int)v129 < 0xFFFE )
            {
              v164 = v127 + v129;
              v162 = v129 + v125;
              v138 = ExAllocatePoolWithTag(1ui64, (unsigned __int16)(v129 + v125), 1667526736i64);
              v15 = v138;
              if( v138 )
              {
                memmove(v138, v128, v127);
                memmove((char *)v15 + 2 * ((unsigned __int64)v127 >> 1), (const VOID *)v23, v129 + 2);
                LODWORD(v23) = 0;
                goto LABEL_109;
              }
              goto LABEL_335;
            }
            goto LABEL_337;
          }
          v26 = (VOID **)*((_QWORD *)&v176 + 1);
        }
        else
        {
          v26 = (VOID **)v176;
        }
LABEL_180:
        LODWORD(v23) = 0;
        v15 = 0i64;
        goto LABEL_110;
      }
LABEL_339:
      v8 = -2147483643;
      goto LABEL_336;
    }
    if( v117 != 7 )
      goto LABEL_160;
    v118 = *(unsigned int *)(*((_QWORD *)&v176 + 1) + 36i64);
    v119 = *(const VOID **)(*((_QWORD *)&v176 + 1) + 40i64);
    v120 = *(const VOID **)(v176 + 40);
    v121 = *(_DWORD *)(v176 + 36);
    if( (unsigned int)v118 > 0xFFFE || v121 > 0xFFFE )
      goto LABEL_339;
    if( *(_DWORD *)v16 != 1 )
    {
      if( *(_DWORD *)v16 == 8 )
      {
        if( PnpMultiSzContainsString(*(WCHAR **)(v176 + 40), *(const WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64), 2u) )
          v26 = (VOID **)*((_QWORD *)&v176 + 1);
        else
          v26 = 0i64;
        goto LABEL_267;
      }
      if( *(_DWORD *)v16 != 9 )
      {
        v26 = (VOID **)qword_1409837A8;
        goto LABEL_267;
      }
      if( PnpMultiSzContainsString(*(WCHAR **)(v176 + 40), *(const WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64), 2u) )
      {
        v26 = v116;
        goto LABEL_267;
      }
    }
    if( v121 + (unsigned int)v118 > 0xFFFE )
    {
LABEL_337:
      v8 = -2147483643;
LABEL_338:
      v150 = v163;
      goto LABEL_344;
    }
    v164 = v121 + v118;
    v122 = ExAllocatePoolWithTag(1ui64, (unsigned __int16)(v121 + v118), 1667526736i64);
    v160 = v122;
    v123 = v122;
    if( !v122 )
    {
      v8 = -1073741670;
      goto LABEL_338;
    }
    memmove(v122, v119, v118);
    memmove((char *)v123 + 2 * (v118 >> 1), v120, v121);
    v26 = 0i64;
LABEL_267:
    LOWORD(v24) = v164;
    goto LABEL_136;
  }
  if( v48 == 3 )
  {
    if( *(_DWORD *)(v176 + 32) != 3 )
      goto LABEL_160;
    v112 = *(const VOID **)(*((_QWORD *)&v176 + 1) + 40i64);
    v113 = *(unsigned int *)(*((_QWORD *)&v176 + 1) + 36i64);
    v114 = *(_DWORD *)(v176 + 36);
    if( *(_DWORD *)v16 == 15 )
    {
      if( (_DWORD)v113 != v114 )
        goto LABEL_42;
      v115 = memcmp(v112, *(const VOID **)(v176 + 40), v113);
      v14 = v176;
      if( v115 )
        goto LABEL_43;
      goto LABEL_250;
    }
    if( *(_DWORD *)v16 != 16 )
    {
LABEL_160:
      v26 = (VOID **)qword_1409837A8;
      goto LABEL_42;
    }
    if( (_DWORD)v113 != v114 || (v33 = memcmp(v112, *(const VOID **)(v176 + 40), v113) == 0, LODWORD(v111) = 0, !v33) )
      LODWORD(v111) = 1;
LABEL_231:
    LODWORD(v23) = v111;
    goto LABEL_42;
  }
  if( v48 == 4 )
  {
    if( *(_DWORD *)(v176 + 32) != 4 )
      goto LABEL_160;
    v91 = *(_DWORD *)v16;
    v92 = **(_DWORD **)(*((_QWORD *)&v176 + 1) + 40i64);
    v93 = **(_DWORD **)(v176 + 40);
    if( *(int *)v16 <= 10 )
    {
      if( v91 == 10 )
      {
        v102 = v92 ^ v93;
        goto LABEL_208;
      }
      v94 = v91 - 1;
      if( !v94 )
      {
        LODWORD(v23) = v93 + v92;
        goto LABEL_42;
      }
      v95 = v94 - 1;
      if( !v95 )
      {
        v103 = v92 - v93;
LABEL_211:
        LODWORD(v23) = v103;
LABEL_42:
        v14 = v176;
        goto LABEL_43;
      }
      v96 = v95 - 1;
      if( !v96 )
      {
        v102 = v92 * v93;
        goto LABEL_208;
      }
      v97 = v96 - 1;
      if( v97 )
      {
        v98 = v97 - 1;
        if( v98 )
        {
          v99 = v98 - 1;
          if( !v99 )
          {
            v103 = v92 << v93;
            goto LABEL_211;
          }
          v100 = v99 - 1;
          if( !v100 )
          {
            v103 = v92 >> v93;
            goto LABEL_211;
          }
          v101 = v100 - 1;
          if( v101 )
          {
            if( v101 != 1 )
              goto LABEL_160;
            v102 = v92 | v93;
          }
          else
          {
            v102 = v92 & v93;
          }
LABEL_208:
          LODWORD(v23) = v102;
          goto LABEL_42;
        }
        v14 = v176;
        if( v93 )
        {
          LODWORD(v23) = v92 % v93;
          goto LABEL_43;
        }
      }
      else
      {
        v14 = v176;
        if( v93 )
        {
          LODWORD(v23) = v92 / v93;
          goto LABEL_43;
        }
      }
      v8 = -1073741676;
      goto LABEL_43;
    }
    v104 = v91 - 13;
    if( !v104 )
    {
      if( !v92 )
        goto LABEL_42;
      v14 = v176;
      v47 = v93 == 0;
      goto LABEL_88;
    }
    v105 = v104 - 1;
    if( v105 )
    {
      v106 = v105 - 1;
      if( v106 )
      {
        v107 = v106 - 1;
        if( v107 )
        {
          v108 = v107 - 1;
          if( v108 )
          {
            v109 = v108 - 1;
            if( v109 )
            {
              v110 = v109 - 1;
              if( v110 )
              {
                if( v110 != 1 )
                  goto LABEL_160;
                v111 = v92 >= v93;
              }
              else
              {
                v111 = v92 <= v93;
              }
            }
            else
            {
              v111 = v92 > v93;
            }
          }
          else
          {
            LODWORD(v111) = v92 < v93;
          }
        }
        else
        {
          v111 = v92 != v93;
        }
      }
      else
      {
        LODWORD(v111) = v92 == v93;
      }
    }
    else
    {
      LODWORD(v111) = 0;
      if( v92 || v93 )
        LODWORD(v111) = 1;
    }
    goto LABEL_231;
  }
  if( v48 != 7 )
    goto LABEL_298;
  v14 = v176;
  v49 = *(_DWORD *)(v176 + 32);
  if( v49 != 7 )
  {
    if( (unsigned int)(v49 - 1) > 1 )
    {
      if( v49 == 4 )
      {
        v77 = **(_DWORD **)(v176 + 40);
        if( *(_DWORD *)v16 == 24 )
        {
          v78 = *(_WORD **)(*((_QWORD *)&v176 + 1) + 40i64);
          v79 = 0;
          v80 = 0;
          while( *v78 )
          {
            v81 = -1i64;
            do
              ++v81;
            while( v78[v81] );
            v79 = 2 * v81 + 2;
            if( v80 == v77 )
              goto LABEL_168;
            ++v80;
            v78 += (unsigned __int64)v79 >> 1;
          }
          if( v80 == v77 )
          {
LABEL_168:
            if( *v78 && v79 > 2 )
            {
              v164 = v79 - 16;
              v162 = v79;
              v82 = ExAllocatePoolWithTag(1ui64, (unsigned __int16)v79, 1667526736i64);
              v15 = v82;
              if( v82 )
              {
                memmove(v82, v78, v79);
                goto LABEL_110;
              }
              goto LABEL_335;
            }
          }
          v26 = (VOID **)qword_1409837A8;
          goto LABEL_110;
        }
      }
      goto LABEL_160;
    }
    v83 = *(unsigned int *)(*((_QWORD *)&v176 + 1) + 36i64);
    v84 = *(_BYTE **)(*((_QWORD *)&v176 + 1) + 40i64);
    v85 = *(const VOID **)(v176 + 40);
    v23 = *(unsigned int *)(v176 + 36);
    if( (unsigned int)v83 <= 0xFFFE && (unsigned int)v23 <= 0xFFFE )
    {
      if( *(_DWORD *)v16 != 1 )
      {
        if( *(_DWORD *)v16 == 2 )
        {
          v86 = PnpMultiSzContainsString(*(WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64), *(const WCHAR **)(v176 + 40), 2u);
          if( v86 )
          {
            v164 = v83 - v23;
            v87 = ExAllocatePoolWithTag(1ui64, (unsigned __int16)(v83 - v23), 1667526736i64);
            v15 = v87;
            if( !v87 )
              goto LABEL_335;
            v88 = ((char *)v86 - v84) >> 1;
            if( v88 > 0 )
              memmove(v87, v84, ((char *)v86 - v84) >> 1);
            memmove((char *)v15 + v88, (char *)v86 + v23, v83 - v23 - v88);
            v26 = 0i64;
            v25 = v83 - v23;
          }
          else
          {
            v26 = (VOID **)*((_QWORD *)&v176 + 1);
            v15 = 0i64;
          }
          LODWORD(v23) = 0;
          LOWORD(v24) = v25;
          v162 = v25;
          goto LABEL_42;
        }
        if( *(_DWORD *)v16 == 8 )
        {
          LODWORD(v23) = 0;
          v15 = 0i64;
          LOWORD(v24) = 0;
          if( !PnpMultiSzContainsString(*(WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64), *(const WCHAR **)(v176 + 40), 2u) )
          {
            v26 = 0i64;
            goto LABEL_75;
          }
          goto LABEL_76;
        }
        if( *(_DWORD *)v16 != 9 )
        {
          v26 = (VOID **)qword_1409837A8;
          goto LABEL_180;
        }
        if( PnpMultiSzContainsString(*(WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64), *(const WCHAR **)(v176 + 40), 2u) )
        {
          v26 = (VOID **)*((_QWORD *)&v176 + 1);
          goto LABEL_180;
        }
      }
      if( (unsigned int)(v23 + v83) <= 0xFFFE )
      {
        v89 = (unsigned __int16)(v23 + v83);
        v164 = v23 + v83;
        v162 = v23 + v83;
        v90 = ExAllocatePoolWithTag(1ui64, v89, 1667526736i64);
        v161 = v90;
        if( v90 )
        {
          memmove(v90, v84, v83 - 2);
          memmove((char *)v161 + 2 * (v83 >> 1) - 2, v85, v23);
          v15 = v161;
          LODWORD(v23) = 0;
          v26 = 0i64;
          *((_WORD *)v161 + (v89 >> 1) - 1) = 0;
          goto LABEL_110;
        }
        goto LABEL_335;
      }
    }
    goto LABEL_339;
  }
  v50 = v176;
  v51 = *(unsigned int *)(*((_QWORD *)&v176 + 1) + 36i64);
  v52 = *(WCHAR **)(*((_QWORD *)&v176 + 1) + 40i64);
  v53 = *(WCHAR **)(v176 + 40);
  v24 = *(unsigned int *)(v176 + 36);
  if( (unsigned int)v51 > 0xFFFE || (unsigned int)v24 > 0xFFFE )
    goto LABEL_339;
  v54 = *(_DWORD *)v16;
  if( *(int *)v16 > 15 )
  {
    v68 = v54 - 16;
    if( v68 )
    {
      v69 = v68 - 1;
      if( !v69 )
      {
        v73 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
        goto LABEL_149;
      }
      v70 = v69 - 1;
      if( v70 )
      {
        v71 = v70 - 1;
        if( v71 )
        {
          if( v71 != 1 )
            goto LABEL_146;
          v72 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
          goto LABEL_148;
        }
        v74 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
        goto LABEL_151;
      }
      v75 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
      goto LABEL_153;
    }
    v76 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
    v14 = v176;
    LOWORD(v24) = 0;
    v26 = 0i64;
    if( !v76 )
    {
      LODWORD(v23) = 0;
LABEL_43:
      if( v8 < 0 )
        goto LABEL_342;
      if( !v26 )
      {
        v26 = ExAllocatePoolWithTag(1ui64, 0x30ui64, 1667526736i64);
        if( !v26 )
          goto LABEL_341;
        *((_DWORD *)v26 + 4) = 0;
        v26[3] = 0i64;
        if( v15 )
        {
          v32 = 7;
          LODWORD(v24) = (unsigned __int16)v24;
          if( v164 != v162 )
            v32 = 1;
        }
        else
        {
          v32 = 4;
          LODWORD(v24) = 4;
          v144 = ExAllocatePoolWithTag(1ui64, 4ui64, 1667526736i64);
          v15 = v144;
          if( !v144 )
          {
LABEL_341:
            v8 = -1073741670;
LABEL_342:
            v150 = v163;
LABEL_343:
            if( v150 )
              goto LABEL_344;
            goto LABEL_358;
          }
          *(_DWORD *)v144 = v23;
        }
        *((_DWORD *)v26 + 8) = v32;
        *((_DWORD *)v26 + 9) = v24;
        v26[5] = v15;
      }
      LODWORD(v4) = v165;
      v15 = 0i64;
      v12 = (_PI_DEVCFG_VARIABLE_ENTRY **)P;
      *((_QWORD *)P + v165) = v26;
      if( v163 )
      {
        v145 = v163;
        v146 = &v176;
        do
        {
          v147 = *(_QWORD **)v146;
          if( !*(_QWORD *)(*(_QWORD *)v146 + 24i64) )
          {
            v148 = (void *)v147[5];
            if( v148 )
              ExFreePoolWithTag(v148, 0);
            ExFreePoolWithTag(v147, 0);
          }
          v146 = (__int128 *)((char *)v146 + 8);
          --v145;
        }
        while( v145 );
        LODWORD(v4) = v165;
        v12 = (_PI_DEVCFG_VARIABLE_ENTRY **)P;
      }
      v5 = v168;
      v9 = VariableEntryResulta;
      goto LABEL_331;
    }
LABEL_250:
    LODWORD(v23) = 1;
    goto LABEL_43;
  }
  if( v54 == 15 )
  {
    v66 = RtlCompareUnicodeStrings(v52, v51 >> 1, v53, v24 >> 1, 1u);
LABEL_138:
    LODWORD(v67) = v66 == 0;
LABEL_139:
    LODWORD(v23) = v67;
LABEL_140:
    v26 = 0i64;
    goto LABEL_110;
  }
  v55 = v54 - 1;
  if( !v55 )
    goto LABEL_128;
  v56 = v55 - 7;
  if( !v56 )
  {
    if( *v52 )
    {
      while( 1 )
      {
        v60 = -1i64;
        do
          ++v60;
        while( v52[v60] );
        v61 = 2 * v60 + 2;
        if( PnpMultiSzContainsString(v53, v52, v50) )
        {
          if( !v15 )
          {
            v62 = 0;
            v164 = 0;
            v160 = ExAllocatePoolWithTag(1ui64, v51, 1667526736i64);
            v15 = v160;
            if( !v160 )
            {
              v8 = -1073741670;
LABEL_125:
              LODWORD(v23) = 0;
              v14 = v176;
              if( v15 )
              {
                LOWORD(v24) = v62 + 2;
                v164 = v24;
                v162 = v62 + 2;
                v26 = 0i64;
                *((_WORD *)v15 + ((unsigned __int64)(unsigned __int16)v24 >> 1) - 1) = 0;
                v15 = v160;
                goto LABEL_43;
              }
              v26 = 0i64;
              v15 = v160;
LABEL_111:
              LOWORD(v24) = v162;
              goto LABEL_43;
            }
          }
          v63 = v61;
          memmove((char *)v15 + v164, v52, v61);
          v164 += v61;
        }
        else
        {
          v63 = v61;
        }
        v52 += v63 >> 1;
        if( !*v52 )
        {
          v62 = v164;
          goto LABEL_125;
        }
      }
    }
    LODWORD(v23) = 0;
    goto LABEL_140;
  }
  v57 = v56 - 1;
  if( v57 )
  {
    v58 = v57 - 4;
    if( !v58 )
    {
      if( (unsigned int)v51 > 2 )
        goto LABEL_113;
      goto LABEL_287;
    }
    if( v58 == 1 )
    {
      if( (unsigned int)v51 > 2 )
        goto LABEL_107;
LABEL_113:
      if( (unsigned int)v24 > 2 )
      {
LABEL_107:
        v59 = 1;
        goto LABEL_108;
      }
LABEL_287:
      v59 = 0;
LABEL_108:
      LODWORD(v23) = v59;
LABEL_109:
      v26 = 0i64;
LABEL_110:
      v14 = v176;
      goto LABEL_111;
    }
LABEL_146:
    LODWORD(v23) = 0;
    v26 = (VOID **)qword_1409837A8;
    goto LABEL_110;
  }
LABEL_128:
  if( !*v52 )
  {
    v26 = (VOID **)v176;
    goto LABEL_135;
  }
  if( !*v53 )
  {
    v26 = (VOID **)*((_QWORD *)&v176 + 1);
    goto LABEL_135;
  }
  if( (unsigned __int64)(unsigned int)(v24 + v51) - 2 > 0xFFFE )
    goto LABEL_337;
  v164 = v24 + v51 - 2;
  v64 = ExAllocatePoolWithTag(1ui64, v164, 1667526736i64);
  v160 = v64;
  v65 = v64;
  if( v64 )
  {
    memmove(v64, v52, v51 - 2);
    memmove((char *)v65 + 2 * (v51 >> 1) - 2, v53, v24);
    v26 = 0i64;
    v25 = v164;
LABEL_135:
    LOWORD(v24) = v25;
LABEL_136:
    LODWORD(v23) = 0;
    v162 = v24;
LABEL_41:
    v15 = v160;
    goto LABEL_42;
  }
LABEL_335:
  v8 = -1073741670;
LABEL_336:
  v150 = v163;
LABEL_344:
  v151 = &v176;
  v152 = v150;
  do
  {
    v153 = *(_QWORD **)v151;
    if( !*(_QWORD *)(*(_QWORD *)v151 + 24i64) )
    {
      v154 = (void *)v153[5];
      if( v154 )
        ExFreePoolWithTag(v154, 0);
      ExFreePoolWithTag(v153, 0);
    }
    v151 = (__int128 *)((char *)v151 + 8);
    --v152;
  }
  while( v152 );
LABEL_358:
  v155 = P;
  if( v165 )
  {
    v156 = (PVOID **)P;
    v157 = v165;
    do
    {
      v158 = *v156;
      if( !(*v156)[3] )
      {
        if( v158[5] )
        {
          ExFreePoolWithTag(v158[5], 0);
          v158 = *v156;
        }
        ExFreePoolWithTag(v158, 0);
      }
      ++v156;
      --v157;
    }
    while( v157 );
  }
  ExFreePoolWithTag(v155, 0);
  v7 = Information;
LABEL_368:
  if( v7 )
    ExFreePoolWithTag(v7, 0);
  return v8;
}

Referenced by:

No references.