AslpFileVerQueryBlock

__int64 __fastcall AslpFileVerQueryBlock(unsigned __int16 *a1, const wchar_t *a2, unsigned __int16 **a3, _QWORD *a4){
  unsigned __int16 *i; 
  int v7; 
  WCHAR **v8; 
  unsigned int v9; 
  __int64 v10; 
  WCHAR *v11; 
  char *v12; 
  __int16 v13; 
  unsigned __int16 *v14; 
  INT64 v15; 
  WCHAR *v16; 
  unsigned int v17; 
  int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  const CHAR *v23; 
  UINT64 v24; 
  UINT64 v25; 
  INT64 v26; 
  INT64 v27; 
  PVOID P; 
  __int64 v29; 
  i = a1;
  P = 0i64;
  v27 = 0i64;
  v29 = 0i64;
  *a4 = 0i64;
  if( a1[2] )
  {
    v9 = -1073741811;
    AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x79Bui64, "Version block invalid");
    return v9;
  }
  v7 = AslStringDuplicate((WCHAR **)&P, (WCHAR *)a2);
  v9 = v7;
  if( v7 < 0 )
  {
    AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x7A1ui64, "AslStringDuplicate failed [%x]", v7);
  }
  else
  {
    v10 = *i;
    if( (unsigned __int16)v10 > 0x7FFFu )
    {
      v23 = "VersionBlock is too long";
      v24 = 1965i64;
    }
    else
    {
      if( (unsigned __int16)v10 >= 8u )
      {
        v11 = (WCHAR *)P;
        v12 = (char *)i + v10;
        v13 = *(unsigned __int16 *)((char *)i + v10 - 2);
        v14 = (unsigned __int16 *)v12;
        *((_WORD *)v12 - 1) = 0;
LABEL_7:
        v16 = AslpFileStringTokenize(v11, v8);
        if( v16 )
        {
          v17 = (_DWORD)v12 - (_DWORD)i;
          if( (unsigned int)((_DWORD)v12 - (_DWORD)i) >= 8 && *i <= v17 )
          {
            LOBYTE(v18) = AslpFileVerBlockGetValueOffset((INT16)&v29, (UINT8)i, v17, v15, v25, v26, v27);
            if( v18 >= 0 )
            {
              v19 = *i;
              v20 = v29 + ((i[1] + 3i64) & 0xFFFFFFFFFFFFFFFCui64);
              v29 = v20;
              if( v20 <= v19 )
              {
                v14 = (unsigned __int16 *)((char *)i + v19);
                for( i = (unsigned __int16 *)((char *)i + v20);
                      i < v14;
                      i = (unsigned __int16 *)((char *)i + ((*i + 3i64) & 0xFFFFFFFFFFFFFFFCui64)) )
                {
                  v21 = *i;
                  if( (unsigned __int16)v21 <= 8u || v21 > (char *)v14 - (char *)i )
                    break;
                  if( !wcsicmp(v16, i + 3) )
                  {
                    v11 = 0i64;
                    goto LABEL_7;
                  }
                }
              }
            }
          }
          v9 = -1073741275;
        }
        else
        {
          *a3 = i;
          *a4 = (char *)v14 - (char *)i;
          v9 = 0;
        }
        *((_WORD *)v12 - 1) = v13;
        goto LABEL_20;
      }
      v23 = "VersionBlock not long enough";
      v24 = 1970i64;
    }
    v9 = -1073741811;
    AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", v24, v23);
  }
LABEL_20:
  if( P )
    ExFreePoolWithTag(P, 0x74705041u);
  return v9;
}

Referenced by:

AslpFileQueryVersionString