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