PiDevCfgResolveVariableFormatString
NTSTATUS __stdcall PiDevCfgResolveVariableFormatString(
_PI_DEVCFG_RESOLVE_CONTEXT *ResolveContext,
VOID *VariableKeyHandle,
_PI_DEVCFG_VARIABLE_ENTRY *VariableEntryResult){
__int64 v5;
int RegistryValue;
unsigned __int16 *v7;
NTSTATUS v8;
unsigned int *v9;
unsigned int v10;
WCHAR *v11;
WCHAR *v12;
__int64 v13;
__int64 v14;
VOID **PoolWithTag;
unsigned int i;
NTSTATUS v17;
__int64 v18;
unsigned __int16 v19;
int v20;
unsigned __int16 *v21;
_QWORD *v22;
unsigned __int16 v23;
unsigned int v24;
__int64 v25;
unsigned int v26;
__int64 v27;
NTSTATUS v28;
unsigned int v29;
VOID **v30;
VOID **v31;
unsigned __int16 *v32;
_WORD *v33;
unsigned __int16 v34;
unsigned __int16 v35;
unsigned int v36;
int v37;
__int64 v38;
unsigned int v39;
__int16 *v40;
__int64 v41;
size_t v42;
__int64 v43;
__int64 v44;
int v46;
unsigned int v47;
unsigned int v48;
PVOID v49;
unsigned __int16 *v50;
PVOID P;
_KEY_VALUE_FULL_INFORMATION *Information;
_PI_DEVCFG_VARIABLE_ENTRY *v53;
__int16 pszDest[12];
v53 = VariableEntryResult;
Information = 0i64;
v49 = 0i64;
v48 = 0;
P = 0i64;
LODWORD(v5) = 0;
RegistryValue = IopGetRegistryValue(VariableKeyHandle, (PWCHAR)L"Format", 0i64, &Information);
if( RegistryValue < 0 )
goto LABEL_106;
if( !PnpValidateRegistryString(Information) )
{
RegistryValue = -1073741823;
goto LABEL_106;
}
v7 = (unsigned __int16 *)((char *)Information + Information->DataOffset);
v50 = v7;
v8 = IopGetRegistryValue(VariableKeyHandle, (PWCHAR)L"Variables", 0i64, (_KEY_VALUE_FULL_INFORMATION **)&v49);
v9 = (unsigned int *)v49;
v10 = 0;
v46 = v8;
RegistryValue = v8;
if( v8 >= 0 )
{
if( !PnpValidateRegistryMultiSz(v49) )
{
RegistryValue = -1073741823;
goto LABEL_104;
}
}
else
{
if( v8 != -1073741772 )
goto LABEL_104;
RegistryValue = 0;
v46 = 0;
}
if( v9 )
{
v11 = (WCHAR *)((char *)v9 + v9[2]);
v12 = v11;
if( *v11 != (_WORD)v10 )
{
do
{
v5 = (unsigned int)(v5 + 1);
v13 = -1i64;
do
++v13;
while( v12[v13] != (_WORD)v10 );
v12 += v13 + 1;
}
while( *v12 != (_WORD)v10 );
v48 = v5;
if( (_DWORD)v5 )
{
v14 = 8 * v5;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 1667526736i64);
P = PoolWithTag;
if( !PoolWithTag )
{
RegistryValue = -1073741670;
goto LABEL_104;
}
memset(PoolWithTag, 0i64, v14);
v10 = 0;
for( i = 0; *v11 && i < v48; ++i )
{
v17 = PiDevCfgResolveVariable(ResolveContext, v11, (_PI_DEVCFG_VARIABLE_ENTRY **)P + i);
v10 = 0;
v46 = v17;
RegistryValue = v17;
if( v17 < 0 )
{
if( v17 == -1073741772 )
RegistryValue = -1073741823;
v46 = RegistryValue;
break;
}
v18 = -1i64;
do
++v18;
while( v11[v18] );
v11 += v18 + 1;
}
if( RegistryValue < 0 )
goto LABEL_102;
}
}
}
v19 = *v7;
v20 = v10;
v21 = v7;
if( !*v7 )
goto LABEL_56;
v22 = P;
do
{
++v21;
if( v19 != 37 )
goto LABEL_34;
v23 = *v21;
if( *v21 == 37 )
{
++v21;
LABEL_34:
v20 += 2;
goto LABEL_54;
}
if( (unsigned __int16)(v23 - 48) <= 9u )
{
v24 = v10;
while( v23 && (unsigned __int16)(v23 - 48) <= 9u )
{
++v21;
v24 = v23 + 2 * (5 * v24 - 24);
v23 = *v21;
}
if( v24 < v48 )
{
_mm_lfence();
v25 = v22[v24];
if( v25 )
{
v26 = *(_DWORD *)(v25 + 32);
if( v26 )
{
if( v26 <= 2 )
{
v20 = *(_DWORD *)(v25 + 36) + v20 - 2;
}
else
{
if( v26 != 4 )
{
if( v26 != 7 )
goto LABEL_54;
v27 = -1i64;
do
++v27;
while( *(_WORD *)(*(_QWORD *)(v25 + 40) + 2 * v27) != (_WORD)v10 );
goto LABEL_48;
}
v28 = RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u");
v10 = 0;
if( v28 >= 0 )
{
v27 = -1i64;
do
++v27;
while( pszDest[v27] );
LABEL_48:
v20 += 2 * v27;
}
}
}
}
}
}
LABEL_54:
v19 = *v21;
}
while( *v21 );
v9 = (unsigned int *)v49;
RegistryValue = v46;
LABEL_56:
v29 = v20 + 2;
v47 = v29;
v30 = ExAllocatePoolWithTag(1ui64, v29, 1667526736i64);
v31 = v30;
if( !v30 )
{
RegistryValue = -1073741670;
goto LABEL_102;
}
v32 = v50;
v33 = v30;
v34 = *v50;
if( !*v50 )
goto LABEL_96;
while( 2 )
{
if( v34 == 37 )
{
v50 = ++v32;
v35 = *v32;
if( *v32 == 37 )
{
if( v29 <= 2 )
goto LABEL_93;
*v33 = 37;
LABEL_63:
++v33;
++v32;
v29 -= 2;
LABEL_89:
v34 = *v32;
if( !*v32 )
goto LABEL_95;
continue;
}
if( (unsigned __int16)(v35 - 48) > 9u )
goto LABEL_89;
v36 = 0;
if( v35 )
{
do
{
if( (unsigned __int16)(v35 - 48) > 9u )
break;
++v32;
v37 = v35;
v35 = *v32;
v36 = v37 + 2 * (5 * v36 - 24);
}
while( *v32 );
v50 = v32;
}
if( v36 >= v48 )
goto LABEL_89;
_mm_lfence();
v38 = *((_QWORD *)P + v36);
if( !v38 )
goto LABEL_89;
v39 = *(_DWORD *)(v38 + 32);
if( !v39 )
goto LABEL_83;
if( v39 <= 2 )
{
v40 = *(__int16 **)(v38 + 40);
v42 = *(_DWORD *)(v38 + 36) - 2;
goto LABEL_84;
}
if( v39 == 4 )
{
if( RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u") >= 0 )
{
v40 = pszDest;
v43 = -1i64;
do
++v43;
while( pszDest[v43] );
v32 = v50;
v42 = 2 * v43;
goto LABEL_85;
}
}
else
{
if( v39 == 7 )
{
v40 = *(__int16 **)(v38 + 40);
v41 = -1i64;
do
++v41;
while( v40[v41] );
v42 = 2 * v41;
goto LABEL_84;
}
LABEL_83:
v40 = 0i64;
v42 = 0;
LABEL_84:
if( !v40 )
goto LABEL_89;
LABEL_85:
if( !v42 )
goto LABEL_89;
if( v29 <= v42 )
{
LABEL_93:
v9 = (unsigned int *)v49;
RegistryValue = -1073741823;
goto LABEL_100;
}
memmove(v33, v40, v42);
v29 -= v42;
v33 += (unsigned __int64)v42 >> 1;
}
v32 = v50;
goto LABEL_89;
}
break;
}
if( v29 > 2 )
{
*v33 = v34;
goto LABEL_63;
}
RegistryValue = -1073741823;
LABEL_95:
v9 = (unsigned int *)v49;
LABEL_96:
if( RegistryValue >= 0 )
{
if( v29 == 2 )
{
v44 = (__int64)v53;
*v33 = 0;
*(_QWORD *)(v44 + 40) = v31;
v31 = 0i64;
*(_DWORD *)(v44 + 32) = 1;
*(_DWORD *)(v44 + 36) = v47;
}
else
{
RegistryValue = -1073741823;
}
}
LABEL_100:
if( v31 )
ExFreePoolWithTag(v31, 0);
LABEL_102:
if( P )
ExFreePoolWithTag(P, 0);
LABEL_104:
if( v9 )
ExFreePoolWithTag(v9, 0);
LABEL_106:
if( Information )
ExFreePoolWithTag(Information, 0);
return RegistryValue;
}Referenced by:
No references.