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.