HalpEnumerateEnvironmentVariablesWithFilter
__int64 __fastcall HalpEnumerateEnvironmentVariablesWithFilter(
int a1,
unsigned __int8 (__fastcall *a2)(__int128 *, __int16 *, _QWORD),
__int64 a3,
_DWORD *a4){
unsigned int v4;
int v5;
unsigned __int64 v6;
_DWORD *v7;
unsigned int v8;
bool v9;
unsigned int v10;
__int64 v11;
unsigned __int64 v12;
unsigned int v13;
unsigned int v14;
bool v15;
unsigned int v16;
__int64 v17;
__int64 v18;
__int64 v19;
__int64 v20;
char v22;
__int64 v23;
int v24;
size_t Size[2];
int v26;
int v27;
_GROUP_AFFINITY Affinity;
unsigned __int8(__fastcall *v29)(__int128 *, __int16 *, _QWORD);
__int64 v30;
_DWORD *v31;
__int128 v32;
_GROUP_AFFINITY PreviousAffinity;
__int16 Src[256];
v29 = a2;
v31 = a4;
v30 = a3;
v26 = a1;
Affinity = 0i64;
v23 = 0i64;
v32 = 0i64;
PreviousAffinity = 0i64;
if( !byte_140C49D08
|| !HalEfiRuntimeServicesTable
|| !HalEfiRuntimeServicesTable[4]
|| !HalEfiRuntimeServicesTable[3] )
{
return 3221225474i64;
}
if( (unsigned int)(a1 - 1) > 1 || (a3 & 0xFFFFFFFFFFFFFFFCui64) != a3 )
return 3221225485i64;
v4 = *a4;
Src[0] = 0;
v5 = 20;
v6 = a3;
if( a1 != 1 )
v5 = 32;
v7 = 0i64;
v27 = v5;
v8 = 0;
v9 = v4 != 0;
if( KeGetCurrentIrql() >= 2u )
{
v22 = 0;
}
else
{
v22 = 1;
v10 = KiProcessorIndexToNumberMappingTable[KeGetPcr()->Prcb.Number];
Affinity.Reserved[1] = 0;
Affinity.Reserved[2] = 0;
*(_DWORD *)&Affinity.Group = (unsigned __int16)(v10 >> 6);
Affinity.Mask = 1i64 << (v10 & 0x3F);
KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
}
while( 1 )
{
*(_QWORD *)Size = 512i64;
HalpEfiStartRuntimeCode(0x10ui64);
v11 = ((__int64(__fastcall *)(size_t *, __int16 *, __int128 *))HalEfiRuntimeServicesTable[4])(Size, Src, &v32);
_InterlockedAnd((volatile signed __int32 *)&KeGetPcr()->HalReserved[8], 0xFFFFFFEF);
if( v11 )
break;
if( !v29 || v29(&v32, Src, 0i64) )
{
v12 = (v6 + 3) & 0xFFFFFFFFFFFFFFFCui64;
if( v12 != v6 )
{
v13 = v12 - v6;
v6 = (v6 + 3) & 0xFFFFFFFFFFFFFFFCui64;
if( v4 >= v13 )
{
v4 -= v13;
}
else
{
v9 = 0;
v4 = 0;
v8 = -1073741789;
}
}
v14 = Size[0] + v5;
if( v26 != 1 )
v14 = (v14 + 3) & 0xFFFFFFFC;
v15 = 0;
if( v4 < v14 )
v8 = -1073741789;
v16 = 0;
if( v4 >= v14 )
v16 = v4 - v14;
if( v4 >= v14 )
v15 = v9;
v9 = v15;
if( v26 != 1 )
{
if( v15 )
{
*(_OWORD *)(v6 + 16) = v32;
memmove((VOID *)(v6 + 32), Src, Size[0]);
v23 = v16;
*(_DWORD *)(v6 + 4) = ((v6 + Size[0] + 35) & 0xFFFFFFFC) - v6;
}
else
{
v23 = 0i64;
}
v24 = v6;
HalpEfiStartRuntimeCode(8ui64);
v20 = ((__int64(__fastcall *)(__int16 *, __int128 *, __int64, __int64 *, __int64))HalEfiRuntimeServicesTable[3])(
Src,
&v32,
v19,
&v23,
v18);
_InterlockedAnd((volatile signed __int32 *)&KeGetPcr()->HalReserved[8], 0xFFFFFFF7);
if( v20 )
{
if( v20 == 0x8000000000000005ui64 )
{
v4 = 0;
v9 = 0;
v8 = -1073741789;
}
else
{
v8 = -1073741823;
v4 = v16;
LABEL_44:
if( v20 )
goto LABEL_49;
}
}
else
{
v4 = v16;
if( v9 )
{
*(_DWORD *)(v6 + 8) = v23;
v4 = v16 - v23;
if( v7 )
*v7 = v24 - (_DWORD)v7;
v7 = (_DWORD *)v6;
goto LABEL_44;
}
}
v17 = v23 + v14;
goto LABEL_46;
}
if( v15 )
{
*(_OWORD *)(v6 + 4) = v32;
memmove((VOID *)(v6 + 20), Src, Size[0]);
if( v7 )
*v7 = v6 - (_DWORD)v7;
v7 = (_DWORD *)v6;
}
v4 = v16;
v17 = v14;
LABEL_46:
v5 = v27;
v6 += v17;
}
}
if( v11 != 0x800000000000000Eui64 )
v8 = -1073741823;
LABEL_49:
if( v22 )
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
if( v7 )
*v7 = 0;
*v31 = v6 - v30;
return v8;
}Referenced by:
HalEnumerateEnvironmentVariablesEx