AslpFileMakeStringVersionAttributes

__int64 __fastcall AslpFileMakeStringVersionAttributes(__int64 a1, unsigned __int16 *a2){
  _DWORD *v4; 
  __int64 v5; 
  int v6; 
  unsigned __int16 *i; 
  unsigned __int64 v8; 
  const CHAR *v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  unsigned __int16 *v12; 
  int v13; 
  WCHAR **v14; 
  __int64 v15; 
  WCHAR *v16; 
  char *v17; 
  __int16 v18; 
  unsigned __int16 *v19; 
  INT64 v20; 
  int v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  INT64 v25; 
  unsigned __int16 *v26; 
  unsigned int v27; 
  int v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  int v32; 
  wchar_t *v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  const CHAR *v37; 
  UINT64 v38; 
  __int64 v40; 
  __int64 v41; 
  NTSTRSAFE_PCWSTR pszSrc; 
  INT16 v43[4]; 
  WCHAR *Duplicate[2]; 
  wchar_t *Str1; 
  INT16 v46[4]; 
  wchar_t *String; 
  __int64 v48[2]; 
  __int16 v50; 
  int v51; 
  String = 0i64;
  v48[0] = 0i64;
  *(_QWORD *)v46 = 0i64;
  if( !a2 )
  {
    v4 = (_DWORD *)(a1 + 184);
    v5 = 8i64;
    do
    {
      *v4 |= 2u;
      v4 += 8;
      --v5;
    }
    while( v5 );
    *(_DWORD *)(a1 + 792) |= 2u;
    return 0;
  }
  i = a2;
  Duplicate[0] = 0i64;
  v8 = 0i64;
  Duplicate[1] = 0i64;
  *(_QWORD *)v43 = 0i64;
  if( a2[2] )
  {
    v9 = "Version block invalid";
    v10 = 1947i64;
  }
  else
  {
    v13 = AslStringDuplicate(Duplicate, (WCHAR *)L"\\VarFileInfo\\Translation");
    v6 = v13;
    if( v13 < 0 )
    {
      AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x7A1ui64, "AslStringDuplicate failed [%x]", v13);
      goto LABEL_8;
    }
    v15 = *a2;
    if( (unsigned __int16)v15 <= 0x7FFFu )
    {
      if( (unsigned __int16)v15 >= 8u )
      {
        v16 = Duplicate[0];
        v17 = (char *)a2 + v15;
        v18 = *(unsigned __int16 *)((char *)a2 + v15 - 2);
        v19 = (unsigned __int16 *)v17;
        v50 = v18;
        *((_WORD *)v17 - 1) = 0;
LABEL_16:
        Str1 = AslpFileStringTokenize(v16, v14);
        if( Str1 )
        {
          v11 = (unsigned int)((_DWORD)v17 - (_DWORD)i);
          if( (unsigned int)v11 >= 8 && *i <= (unsigned int)v11 )
          {
            LOBYTE(v21) = AslpFileVerBlockGetValueOffset(
                            (INT16)v43,
                            (UINT8)i,
                            (_BYTE)v17 - (_BYTE)i,
                            v20,
                            v40,
                            (INT64)pszSrc,
                            *(INT64 *)v43);
            if( v21 >= 0 )
            {
              v22 = *i;
              v23 = *(_QWORD *)v43 + ((i[1] + 3i64) & 0xFFFFFFFFFFFFFFFCui64);
              *(_QWORD *)v43 = v23;
              if( v23 <= v22 )
              {
                v19 = (unsigned __int16 *)((char *)i + v22);
                for( i = (unsigned __int16 *)((char *)i + v23);
                      i < v19;
                      i = (unsigned __int16 *)((char *)i + ((*i + 3i64) & 0xFFFFFFFFFFFFFFFCui64)) )
                {
                  v24 = *i;
                  if( (unsigned __int16)v24 <= 8u )
                    break;
                  v11 = (char *)v19 - (char *)i;
                  if( v24 > (char *)v19 - (char *)i )
                    break;
                  if( !wcsicmp(Str1, i + 3) )
                  {
                    v16 = 0i64;
                    goto LABEL_16;
                  }
                }
              }
            }
          }
          v6 = -1073741275;
          *((_WORD *)v17 - 1) = v50;
          v12 = 0i64;
        }
        else
        {
          v8 = (char *)v19 - (char *)i;
          *((_WORD *)v17 - 1) = v50;
          v12 = i;
          v6 = 0;
        }
        goto LABEL_30;
      }
      v9 = "VersionBlock not long enough";
      v10 = 1970i64;
    }
    else
    {
      v9 = "VersionBlock is too long";
      v10 = 1965i64;
    }
  }
  v6 = -1073741811;
  AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", v10, v9);
LABEL_8:
  v12 = 0i64;
LABEL_30:
  AslFree((PVOID)v11);
  if( v6 == -1073741275 )
  {
    v26 = 0i64;
    v27 = 0;
  }
  else
  {
    if( v6 < 0 )
    {
      LODWORD(v40) = v6;
      AslLogCallPrintf(
        1ui64,
        "AslpFileMakeStringVersionAttributes",
        0x6B9ui64,
        "AslpFileVerQueryBlock failed [%x]",
        v40);
      return(unsigned int)v6;
    }
    v26 = 0i64;
    v27 = 0;
    LOBYTE(v28) = AslpFileVerBlockGetValueOffset((INT16)v46, (UINT8)v12, v8, v25, v40, (INT64)pszSrc, *(INT64 *)v43);
    if( v28 >= 0 && v8 > *(_QWORD *)v46 )
    {
      v26 = (unsigned __int16 *)((char *)v12 + *(_QWORD *)v46);
      v27 = v8 - *(_DWORD *)v46;
    }
  }
  v29 = 0i64;
  v30 = (unsigned __int64)v27 >> 2;
  do
  {
    v31 = *(int *)&byte_140008AE0[v29];
    v51 = *(_DWORD *)&byte_140008AE0[v29];
    v32 = AslpFileQueryVersionString(&String, v48, a2, v26, v30, *(NTSTRSAFE_PCWSTR *)&byte_140008AE0[v29 + 8]);
    v6 = v32;
    if( v32 < 0 )
    {
      if( v32 == -1073741275 )
      {
        *(_DWORD *)(32 * v31 + a1 + 24) |= 2u;
        goto LABEL_45;
      }
      v37 = "AslpFileQueryVersionString failed [%x]";
      v38 = 1776i64;
LABEL_53:
      LODWORD(v41) = v32;
      AslLogCallPrintf(1ui64, "AslpFileMakeStringVersionAttributes", v38, v37, v41);
      return(unsigned int)v6;
    }
    v33 = String;
    v32 = AslStringXmlSanitize(String);
    v6 = v32;
    if( v32 < 0 )
    {
      v37 = "AslStringXmlSanitize failed [%x]";
      v38 = 1763i64;
      goto LABEL_53;
    }
    v34 = 32i64 * v51;
    v35 = -1i64;
    *(_DWORD *)(v34 + a1) = 4;
    do
      ++v35;
    while( v33[v35] );
    *(_DWORD *)(v34 + a1 + 24) |= 1u;
    *(_QWORD *)(v34 + a1 + 8) = v35;
    *(_QWORD *)(v34 + a1 + 16) = v33;
LABEL_45:
    v29 += 16i64;
  }
  while( v29 < 0x80 );
  if( v26 && v30 == 1 )
  {
    *(_DWORD *)(a1 + 768) = 2;
    *(_QWORD *)(a1 + 776) = 4i64;
    v36 = *v26;
    *(_DWORD *)(a1 + 792) |= 1u;
    *(_QWORD *)(a1 + 784) = v36;
  }
  else
  {
    *(_DWORD *)(a1 + 792) |= 2u;
  }
  return 0;
}

Referenced by:

AslpFileGetVersionAttributes