Чтение/запись устаревших файлов Thumbs.db?

#c# #c #windows #windows-10 #disassembly

Вопрос:

Для быстрого просмотра моего виртуального сетевого диска через Dokany библиотеку мне нужна возможность записи/чтения Thumbs.db файлов. Как я вижу сейчас Thumbs.db , это просто формат сериализации для изображений ключа/значения (например, ключ-это имя файла, а значение-набор предварительных просмотров разного размера) и больше ничего не содержит.

Существует ли простой способ сериализации/десериализации этих файлов? Например, я могу создавать предварительные просмотры разных размеров в своем облаке , когда загружаю в него новый файл, и могу сериализовать их на лету (или кэшировать самостоятельно), когда explorer.exe захочу прочитать Thumbs.db , но как их сериализовать? Есть какая-нибудь библиотека или достаточный сериализатор для .NET50 ?

Обновление 1

Удалось извлечь файлы с Thumbs.db помощью этого кода и библиотеки из nuget OpenMcdf :

         var cf = new CompoundFile(filePath);
        if (Directory.Exists(outputFolder))
            Directory.Delete(outputFolder, true);
        cf.RootStorage.VisitEntries(x =>
        {
            if (x.IsStream)
            {
                var stream = (CFStream)x;
                var data = stream.GetData();
                var offset = BitConverter.ToInt32(data, 0);
                var someInt = BitConverter.ToInt32(data, 4);//type?
                var imageSize = BitConverter.ToInt32(data, 8);
                var someInt3 = BitConverter.ToInt32(data, 12);//???
                var jpgData = data.AsSpan(offset).ToArray();
                var headerData = data.AsSpan(0, offset).ToArray();

                Directory.CreateDirectory(outputFolder);
                File.WriteAllBytes(Path.Combine(outputFolder, x.Name   ".jpeg"), jpgData);
                File.WriteAllBytes(Path.Combine(outputFolder, x.Name   ".bin"), headerData);
            }
        }, true);
 

Но теперь столкнулся с проблемой — x.Name это хэш исходного имени файла в папке, поэтому мне нужно как-то получить эту хэш-функцию для создания моего собственного Thumbs.db. Есть какие-нибудь мысли? Кто-то, кто хорошо разбирается в разборке, может помочь?
Вероятно, он содержится в thumbcache.dll папке «В Windows», но я недостаточно разбираюсь в разборке, чтобы извлечь эту функцию.

Комментарии:

1. Thumbs.db это формат составного файла OLE , и я видел библиотеку для этого, плавающую в Интернете во время моих путешествий. Кроме того, где-то здесь должны быть дубликаты

2. Ух ты! Уже пытался проанализировать с помощью одной из библиотек nuget и увидеть некоторые результаты. Спасибо за совет.

3. @TheGeneral Мне удалось извлечь записи из этого, но я не смог интерпретировать потоковые данные. Какая-нибудь помощь?

4. К сожалению, я ничего такого раньше не пробовал.

5. Удалось извлечь файлы, но теперь я столкнулся с новой проблемой — не удается создать хэш файла. Windows, вероятно, использует его для идентификации файла в файле Thumbs.db, и оно совпадает с исходным именем файла. Т. е. имя файла -> хэш файла ->> поиск хэша файла в Thumbs.db