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