AslEnvVarQuery

NTSTATUS __stdcall AslEnvVarQuery(
        PWCHAR Environment,
        PWCHAR Name,
        UINT64 NameLength,
        PWCHAR Value,
        UINT64 ValueLength,
        UINT64 *ReturnLength){
  WCHAR *v6; 
  NTSTATUS v7; 
  WCHAR *NtSystemRoot; 
  UINT64 v12; 
  UINT64 v14; 
  WCHAR *v15; 
  PWCHAR i; 
  UINT16 *v17; 
  UINT16 v18; 
  __int16 v19; 
  int v20; 
  PWCHAR v21; 
  __int64 v22; 
  UINT8 *v23; 
  unsigned __int64 v24; 
  v6 = &Name[NameLength];
  v7 = 0;
  if( NameLength < 0xA || wcsnicmp(Name, L"systemroot", 0xAui64) )
  {
    if( Environment )
    {
      while( *Environment )
      {
        v15 = Environment;
        for( i = Name; i < v6; ++i )
        {
          if( !*Environment )
            break;
          NLS_UPCASE(*Environment);
          v18 = NLS_UPCASE(*v17);
          if( v19 != v18 )
            break;
          ++Environment;
        }
        if( i == v6 && *Environment == 61 )
        {
          v20 = 1;
LABEL_21:
          v21 = Environment;
          if( *Environment )
          {
            v22 = 0i64;
            do
            {
              if( (__int64)(v22 & 0xFFFFFFFFFFFFFFFEui64) >= 65534 )
                break;
              ++Environment;
              v22 += 2i64;
            }
            while( *Environment );
          }
          if( v20 )
          {
            v23 = (UINT8 *)(v21 + 1);
            v24 = ((char *)Environment - (char *)v23) >> 1;
            if( v24 < ValueLength )
            {
              memmove((UINT8 *)Value, v23, 2 * v24);
              Value[v24] = 0;
            }
            else
            {
              if( Value && ValueLength )
                *Value = 0;
              v7 = -1073741789;
              ++v24;
            }
            *ReturnLength = v24;
            return v7;
          }
        }
        else
        {
          v20 = 0;
          while( *Environment )
          {
            if( *Environment == 61 && Environment != v15 )
              goto LABEL_21;
            ++Environment;
          }
        }
        ++Environment;
      }
    }
    return -1073741568;
  }
  else
  {
    NtSystemRoot = RtlGetNtSystemRoot();
    v12 = -1i64;
    do
      ++v12;
    while( NtSystemRoot[v12] );
    if( v12 < ValueLength )
    {
      *ReturnLength = v12;
      v14 = v12;
      memmove((UINT8 *)Value, (UINT8 *)NtSystemRoot, v14 * 2);
      Value[v14] = 0;
    }
    else
    {
      if( Value && ValueLength )
        *Value = 0;
      v7 = -1073741789;
      *ReturnLength = v12 + 1;
    }
  }
  return v7;
}

Referenced by:

AslEnvExpandStrings