Имеют древовидную структуру следующего характера:
Код: Выделить всё
"корневой_узел"
{
"потомок_1"
{
"параметр" "значение"
"параметр" "значение"
"параметр" "значение"
;....
}
"потомок_2"
{
"потомок_2_1"
{
;....
}
}
}
На данный момент известно 2 файла данного типа: appinfo.vdf и packageinfo.vdf, а так же все файлы в каталоге "appcache\stats". Оба файла отличаются только заголовком, структура же у обоих файлов схожа.
Первая часть заголовка у обоих файлов идентична, поэтому она вынесена в отдельную структуру (по ней можно судить о типе файла):
Код: Выделить всё
TVDFHeader = record
Sign: uint32;
Version: uint32;
end;
- Sign - является идентификатором типа файла и может принимать следующие значения:
- $06564424 - "$DVx06" - appinfo.vdf;]
- $06565525 - "%UVx06" - packageinfo.vdf;
- Version - предположительно, версия файла. Всегда имеет значение 0x00000001.
packageinfo.vdf имеет дополнительный заголовок:
Код: Выделить всё
TVDFPKGHeader = packed record
unk1: uint32;
Hash: array[0..19] of byte;
unk2: uint16;
end;
- unk1 - всегда имеет значение 0x00000000;
- Hash - предположительно, хеш (чего - не спрашивайте, пока не знаю, так как до этого файла пока не дошел на практике);
- unk2 - всегда имеет значение 0x0000.
В общем случае имеется один корневой узел с потомками (как и для текстового формата). Каждый узел предваряется 1 ьайтом, указывающим тип узла:
Код: Выделить всё
// Data type
enum types_t
{
TYPE_NONE = 0,
TYPE_STRING,
TYPE_INT,
TYPE_FLOAT,
TYPE_PTR,
TYPE_WSTRING,
TYPE_COLOR,
TYPE_UINT64,
TYPE_NUMTYPES,
};
Узел описывается классом TVDFNode:
Поскольку в appinfo.vdf хранится информация о приложениях (а так же некоторая информация о файлах кэша), то он имеет вид последовательного набора записей, каждая их которых представляет собой древовидную структуру с заголовком. Каждая запись имеет следующий заголовок:
Код: Выделить всё
TVDFAppHeader = record
AppID: uint32;
DataSize: uint32;
end;
- AppID - из названия понятно, что является Application ID;
- DataSize - хранит размер области данных данной записи.
Код: Выделить всё
TVDFAppInfo = record
AppType: uint32;
unk2: uint32;
LastChangeNumber: uint32;
end;
- AppType - определяет тип записи:
- 0x00000000 - файл кэша;
- 0x00000002 - приложение
- unk2 - неизвестно;
- LastChangeNumber - вероятно, определяет, в какой модификации файла данная запись была изменена в последний раз (я так и не разобрался, откуда брать текущую версию :( ).
- 0x0002 - информация о приложении;
- 0x0003 - дополнительные сведения (у файлов кэша содержит только одну запись - "cddbfingerprint");
- 0x0004 - информация о запуске (сигнатуры файлов для их проверки перед запуском или после загрузки/распаковки, параметры запуска приложения под различными ОС);
- 0x0006 - сведения для установки (замена InstallScript.vdf в папке игры; содержит записи реестра и список приложений с параметрами запуска, необходимые для установки игры);
- 0x0007 - список файлов кэша;
- 0x000a - некоторая служебная информация (известно о следующих полях - "savefiles", "testonly", "quota", "maxnumfiles", "appidRedirect", "ignoreexternalfiles", "hidecloudui");
- 0x000e - значения для использования в MacOS
После заголовка следует древовидный набор записей, описанный выше.
У packageinfo.vdf тело начинается с записи "appids" (хранит какие-то значения - 4-х байтовые числа - для всех файлов кэша). Все записи в данном файле имеют описанную выше древовидную структуру.
Все файлы в данном каталоге не содержат никаких заголовков и являются типичными VDF-файлами бинарного типа.
UserGameStats_[UserID]_[AppID].bin - содержат записи пользователя по его достижениям для конкретного приложения.
UserGameStatsSchema_[AppID].bin - содержат описание достижений для приложения (название достижения на различных языках, имя иконки для отображения).
Добавлено спустя 2 минуты 14 секунд:
Статья на данный момент описывает только общие положение и будет дополняться и исправляться по мере дальнейшего изучения формата файлов (которое длится менее 8-и часов :crazy: ).