Universal Steam Extractor

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#196 Сообщение 13.09.2010, 16:05

Желательно ещё ItemHash(Item: ulong): integer; - искать файл по хешу

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#197 Сообщение 14.09.2010, 16:51

MOZGIII
Ты имел в виду по хешу имени файла? Если да, то хеш для него вычисляется хитрой функцией только для имени (без пути к нему), из-за чего возникает множество коллизий, так что поиск файла по хешу его имени неэффективен, т.к. для многих файлов хеш может совпадать.
Если по хешу содержимого, то я не понял суть, т.к. такого не может быть (ибо у каждого файла их может быть много, по 1 на каждый кусочек).
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#198 Сообщение 14.09.2010, 19:37

andreil
Я имел ввиду по хешу содержимого.
Можно ли как-нибуть иначе чем перерассчитывая хеша всего файла идентифицровать файл по содержимому? Например хешем строки, состоящей их конкатезации хешей (как строк) всех его сегментов?

Напимер так:

Код: Выделить всё

hash_func( string(seg1.hash) + string(seg2.hash) + ... + string(segN.hash) )
И также вопрос: придефрагментации кусочки переразбиваются? Реально ли организовать p2p обмен кусочков gcf одной и той же версии (но у одного пира файл, допустим, дефрагментирован, а у другого - нет), идентифицируя их по хешам. Собственно всё упирается вот во что: изменяются ли в заголовке контрольные суммы кусочков при дефрагментации gcf?

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#199 Сообщение 15.09.2010, 17:39

1) можно, но неэффективно ;)
2) нет, не переразбиваются. Все кусочки файла (кроме последнего) имеют размер ровно 8кб. Именно за счет этого и можно организовать р2р сеть с файлами кэша в качестве основы.
3) нет, КС файлов не изменяются, а почему - см. п.2 :) + часть заголовков, отвечающая за контрольные суммы, 99,9% одинаковы абсолютно для всех файлов кэша ;)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#200 Сообщение 15.09.2010, 17:52

andreil
Отлично, как кстати продвигаются твои разработки по поводу p2p?
Сделай для либы возможность как-нибудь заполнять файл кусочками, имея все хедеры с хешами и сами кусочки, при этом лучше чтобы не все кусочки сразу были необходимы (постепенно, напрмер появился кусочек - запихали в кеш файл). Вообщем, для p2p это будет полезно.

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#201 Сообщение 16.09.2010, 09:17

MOZGIII
1) пока не напишу ВСЮ работу с кэшем, за р2р браться не собираюсь ;)
2) а в чем вопрос? Еще в прошлой версии в классе кэша были методы, открывающие файл на чтение как файловый поток + сейчас это сделано вообще отлично:

Код: Выделить всё

TGCFFile = class (TObject)
    private
..............
    private
..............
    private
..............
    public
..............
      // работа с файловыми потоками
      function OpenFile(FileName: string; Access: byte; CommonPath: string = ''): TStream; overload;
      function OpenFile(Item: integer; Access: byte; CommonPath: string = ''): TStream; overload;
      property StreamMethods: TStreamMethods read fStreamMethods;
............
  end;

  TStream = class(TObject)
  protected
.........
  protected
.........
  public
    Data: TStreamData;
    constructor CreateFileStream(const FileName: string; Mode: ulong);
    constructor CreateMemoryStream();
    constructor CreateStreamOnStream(Procs: pStreamMethods);

    function Read(var Buffer; const Count: TStrmSize): TStrmSize;
    function Seek(MoveTo: TStrmMove; MoveMethod: TMoveMethod): TStrmSize;
    function Write(var Buffer; Count: TStrmSize): TStrmSize;
    property Size: TStrmSize read GetSize write SetSize;
    property Position: TStrmSize read GetPosition write SetPosition;
    property Memory: Pointer read fMemory;
    {* Only for memory stream. }
    property Handle: THandle read GetFileStreamHandle;
    {* Only for file stream. It is possible to check that Handle <>
       INVALID_HANDLE_VALUE to ensure that file stream is created OK. }

    property Methods: PStreamMethods read fPMethods;
    //property Data: TStreamData read fData write fData;

    property Capacity: TStrmSize read GetCapacity write SetCapacity;
  end;
Причем все работает отлично ;) К началу следующей недели думаю дописать нормальную функцию создания обновлений (без программных "затычек").
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#202 Сообщение 16.09.2010, 16:47

andreil
Хорошо, теперь всё понятно, очень неплохо сделано. Я тада пойду пока, попрактикуюсь в создании p2p сетей... %)

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#203 Сообщение 07.10.2010, 22:34

Вот и прошел творческий застой, связанный с активным выполнением лаб по учебе %-)
Если допишу процедуру, пересоздающую таблицу размещения секторов (с сохранением структуры, если уже была создана), то функция создания апдейтов будет готова, а вслед за ней - и применяющая апдейты.

PS: Скорость работы хоть и высока, но буду оптимизировать еще больше. На данный момент полностью отказался от использования почти всех библиотек (кроме системных), так что можно будет говорить и о кроссплатформенном приложении.

PPS: На данный момент библиотека работает только с GCF/NCF-файлами и имеет размер 110Кб (увеличится до 130-200) после написания всех функций для них и до 400Кб в релизе :crazy:

PPPS: Скоро будет закрытый тест для выявления самых сильных багов (от коих всячески пытаюсь избавиться, но без которых нет ни одной программы :( ), а следом - и открытый с помощью куска SteamLite - менеджера кэша.
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
bugme666
Эксперты no-Steam
Эксперты no-Steam
Сообщения: 1168
Зарегистрирован: 29.01.2009
Откуда: MOSCOШ
Благодарил (а): 882 раза
Поблагодарили: 358 раз
Контактная информация:

#204 Сообщение 07.10.2010, 22:55

andreil
архивы/апдейты CFT-совместимые будут?

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#205 Сообщение 07.10.2010, 23:20

bugme
Пока вроде на 100% совместимо. Если бы не бился над совместимостью, а сделал бы свой формат, было бы проще ;)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#206 Сообщение 11.10.2010, 22:35

Итак, есть прогресс - вроде как закончил с простейшим заполнением таблицы секторов (один файл - один блок).
Сейчас перейду на более сложный уровень - работу со сложными блоками (по несколько блоков на файл; получается после дешифровки файла и после неравномерной во времени закачки). Вот здесь и начнется свистопляска - тут будет производится оптимизация блоков для упрощения последующей работы с ними (в плане быстродействия), а так же для упрощения структуры файла.

PS: Работы тут предстоит много, так что могу обрадовать только одним - создание патчей уже работает, так что прошу желающих связаться со мной по ICQ для проведения тестирования (у меня самого файлов сейчас почти нет - забыл переписать со стационарника дома :( ).
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#207 Сообщение 13.02.2011, 13:49

Давно уже не отписывался :blush:

На данный момент занят восстановлением папки с кэшэм по причине ее полного удаления (полетела мать, решили поменять и винты. При переносе данных были скопированы не все данные, а по старому диску прошлись полным форматом - сказваалось 2-х суточное бдение за компом :( ).

PS: Конкретно сейчас переписываю данную либу (+ модуль для работы с сетью) на C++ для дальнейшего использования в своих проектах. Delphi-версия этих библиотек будет работать в виде заголовочного файла для Cишной библиотеки. А в структуре ничего сильно не измениться - стараюсь переписать все, как есть, ибо работает на отлично ;)

PPS: Заметил одну утечку памяти при написании... Долго ловил... Потом додумался посчитать. Отлавливал данным кодом:

Код: Выделить всё

	int i = 0;
	while (true)
	{
		GCFFile *GCF = new GCFFile();
		GCF->LoadFromFile("f:\\games\\Steam\\steamapps\\counter-strike.gcf");
		delete GCF;
		printf("%i\n", i);
		i++;
	}
В итоге при небольшом закомментированном участке (который буду еще оптимизировать для скорости) была замечена скорость чтения данных - примерно 300Мб/с :shock: Но это - только чтение заголовков одного файла. Утечка при этом была заметна как ступенька на графике использования памяти программой, вот я и запаниковал... При подсчетах (было выполнено 10000 циклов загрузки) оказалось, что утечка составила всего-то ~23 байта :lol: Вполне хороший результат.

PPPS: Файл "counter-strike.gcf" загрузился/выгрузился 10000 раз примерно за 1 минуту :lol:
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
andreil
Разработчик
Разработчик
Сообщения: 781
Зарегистрирован: 14.08.2006
Откуда: Светлогорск, Беларусь
Поблагодарили: 2 раза
Контактная информация:

#208 Сообщение 20.02.2011, 12:56

Итак, поддержка GCF/NCF-кэша уже переписана на С++ prankster Сейчас перепишу остальные типы и буду тестить на валидность (сейчас просто нет файлов для проверки правильности создания архивов/апдейтов + GCFScape почему-то не запускается :( )

PS: Ждите новостей к выходным, может будет небольшой тест для апдейтов ;)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).

Аватара пользователя
impulse666
Полковник
Полковник
Сообщения: 7405
Зарегистрирован: 08.12.2005
Откуда: Atman
Благодарил (а): 2340 раз
Поблагодарили: 590 раз

#209 Сообщение 22.02.2011, 12:09

andreil
А мы уж потеряли надежду, да и я за три года разработки, забыл что к чему %)

Создание архивов с нуля позволит нам, например, делать пиратки в ГСФ файлах собственной упаковки, для исключения ненужных файлов, т.е. лишнего веса. Так?

Хм, тогда вот еще вопрос, патчинг существующих ГСФ архивов будет выглядить примерно так:
У пользователя ГСФ пиратка, он берет набор файлов (типичный патч для распака) и с помощью USE замещает уже существующие файлы в имеющемся у него Кеше (при том что размеры не совпадают), все верно?
Изображение
Негласные Правила
1. Пропаганда лицензии запрещена.
2. На форуме режим многоступенчатых стандартов Ψ. То что можно одним, нельзя другим. Решается правящей партией
3. Ники членов правящей партии (impulse666, NiGHt-LEshiY, SHADOW) искажают только в случае необходимости получить БАН.

...воздержитесь от этого, изучите вот это.
Лучшая статья о моих взглядах. Настоятельно рекомендую.

Аватара пользователя
$t@t!c_V()1D
Разработчик
Разработчик
Сообщения: 2639
Зарегистрирован: 06.12.2007
Благодарил (а): 10 раз
Поблагодарили: 29 раз

#210 Сообщение 22.02.2011, 17:44

impulse666
Если я тебя правильно понял, ты хочешь удалять ненужные файлы из некоторых GCF для определённых игр, чтобы эти файлы не занимали место в GCF почём зря. Это можно сделать хоть сейчас. Не то, чтобы я был против разработок andreil, я как бы За конкуренцию, но у steamCooker уже есть необходимая библиотека для этого.

bugme как-то обращался ко мне за тем, чтобы сделать фичу обновления для распаков в cfUpdater. Я поделился своей идеей включать вместе с распаком .archive-файл и по нему уже отслеживать какие файлы нужно обновить, а какие оставить в покое. То есть получается, по сути, этакая NCF-игра.

Ответить Вложения 3