|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
Как распаковать файл ZIP функциями из Cabinet.dll или чем отличается ZIP от MSZIP05.03.2025, 23:14. Показов 3697. Ответов 38
Всем привет!
Я тут решил поэкспериментировать и узнать чем же отличается ZIP от MSZIP. Моя идея заключалась в том, чтобы распаковывать простые ZIP-файлы кодом функций из Cabinet.dll, распаковывая буфер MSZIP. Идея была до ужаса проста: взять буфер ZIP и перенести в CAB и приклеить его в буфер MSZIP для того чтобы попробовать распаковать файл таким образом. Как вы думаете, получилось у меня это или нет? Получилось! Но только наполовину. Не всегда буфер MSZIP совпадает с буфером обычного ZIP. Я решил для этого освоить новые функции Windows 8 из Cabinet.dll и попробовать ими распаковывать буфер обычного ZIP. Мои эксперименты длились несколько дней и всё чего я смог достичь это то что половина файлов у меня всё-таки распаковывается таким образом. Я поэтому даже немного переделал версию своего класса для распаковки ZIP файлов, пытаясь достичь распаковки буфера ZIP, но правильным образом мне всё-таки этого достичь не удалось... Итак, представляю вам версию своего творчества, но только для ознакомления, а не для постоянного использования, так как мне не удалось на 100% разобраться с Cabinet.dll и сделать так чтобы распаковывались все файлы. Сейчас половину файлов не распаковывается у меня этим кодом... Буду признателен и благодарен если кто-нибудь мне когда-нибудь подскажет, что же можно изменить в этом коде, для того чтобы распаковывались все файлы, и возможно ли это вообще (это тоже вопрос!).
1
|
|
| 05.03.2025, 23:14 | |
|
Ответы с готовыми решениями:
38
Zip в zip. Как распаковать одним махом? Как распаковать ZIP-файл в 7z?
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 09.03.2025, 02:03 [ТС] | ||
|
Я нашёл все необходимые структуры для создания CAB-файла с нуля! Все эти необходимые структуры есть в открытом исходном коде ReactOS за что им большое спасибо конечно, очень помогает, такого больше в интернете нигде не найдёшь уже в MSDN давно нет полного описания CAB файлов...
Добавлено через 5 минут Итак сначала CAB файла идёт структура CFHEADER, потом идёт CFFOLDER, CFFILE и потом в самом конце уже идёт структура CFDATA, а потом уже сразу следуя за структурой CFDATA сразу уже идёт буфер начинающий с двух байтов 43 4B. Добавлено через 37 секунд То есть минимальный CAB-файл состоит из 4 структур. Добавлено через 48 секунд В структуре CFDATA правда есть заковырка, её не так просто будет собрать так как там есть контрольная сумма... Добавлено через 1 минуту Зато все эти структуры, хотябы, описаны! В ReactOS по крайней мере и мы будем точно знать куда что записывать, а не тыкаться наугад, как я это делал с буфером восьмёрышных функций до этого... Добавлено через 1 час 2 минуты Добавлено через 1 минуту Фактически теперь мне стало понятно уже точно что ZIP и MSZIP это по сути одно и тоже... Там буфер одинаковый вообще...
1
|
||
| 09.03.2025, 03:22 | |||
|
Решил поискать, что за CFDATA и поиск выдал мне спецификацию cab-формата - небольшой файл ворд. Там, кстати приводится код вычисления контрольной суммы и такая аннотация (перевод)
Кликните здесь для просмотра всего текста
1
|
|||
| 09.03.2025, 05:23 | |||||||||||
|
Я вот, если честно, сам не очень люблю тему ИИ, но к сожалению он работает(наверное, я еще не проверял). Grock 3 beta:
Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||||||
| 09.03.2025, 12:27 [ТС] | ||||||||
|
Добавлено через 6 минут Добавлено через 2 минуты Что касательно структур и создания CAB-файла с нуля, то я ещё вчера это успешно сделал, правда только опять-таки в пределах одного 32-килобайтного блока. Самое сложное сейчас будет разбираться с деление на 32 килобайтные блоки, когда их несколько... Вот структуры, я переписывал вчера из ReactOS:
Теперь мне нужно изучать как заканчиваются 32 килобайтные блоки и начинаются новые в форматах ZIP и CAB
0
|
||||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 10.03.2025, 01:11 [ТС] | |
|
Короче фокус не получился с тем чтобы взять буфер ZIP и разъединить его на несколько 32-килобайтных чанок и перегнать это всё в CAB.
Получается такая штука, что если размер распакованных данных превышает 32 КБ то мой код распаковки уже работать не будет через CAB или через новые восьмёрышные функции. Но если размер несжатого файла до 32 Кб то всё ок, всё работает, только до 32 Кб... Добавлено через 5 часов 25 минут В формате файлов ZIP используются блоки произвольного размера, который кстати может превышать 32 Кб, хотя обычно не превышает 32 Кб, но может, по описанию в документации. Мало того каждый блок начинается не с байта, а с бита! Заголовок ZIP буфера представляет собой 3 первых бита из первого байта блока... Но определить размер одного блока в ZIP, как я понял, не представляется возможным не распаковав его... Мало того в формате файлов CAB размер одного блока ограничен 32 Кб, хоть об этом нигде и не сказано почему, и снять это ограничение вряд ли возможно... Поэтому я делаю выводы хоть ZIP и MSZIP и используют один и тот же алгоритм распаковки RFC1951, тем ни менее они не совместимы получается, что возможно распаковать только ZIP через MSZIP если размер распакованных данных не будет превышать 32 Кб, что очень мало для нас конечно и мало что нам даёт вообще такая возможность распаковки ZIP файлов до 32 Кб... Добавлено через 22 минуты Но зато этот код отлично подойдёт, если вам нужно распаковать много маленьких файлов до 32 Кб, из ZIP-архива, с молниеносной скоростью. То есть сам файл ZIP может занимать и больше 32 Кб, хоть несколько мегабайт, главное чтобы сами файлы внутри ZIP, не превышали 32 Кб.
0
|
|
| 10.03.2025, 01:45 | ||||||
|
Вот есть объяснение поблочной упаковки/распаковки, приводится код, там кстати есть тоже момент получения размеров блока из его заголовка https://learn.microsoft.com/en... block-mode
1
|
||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 10.03.2025, 02:33 [ТС] | |
|
testuser2, я кстати кажется нашёл документ почти такой же как ты мне скидывал: https://learn.microsoft.com/ru... v=msdn.10)
Добавлено через 25 минут testuser2, кстати! в самом конце этого документа как раз есть описание Формат сжатия данных Microsoft MSZIP Сжатие MSZIP имеет лишь незначительные отличия от метода 'deflate' Фила Каца. Вместо того, чтобы заново документировать этот метод, этот документ объяснит эти отличия и отошлет читателя к общедоступным документам 'deflate'. Добавлено через 1 минуту Как раз в тему! Чем отличается ZIP от MSZIP кажется нашёл нужную документация наконец-то! Добавлено через 10 минут Там даже в документации написано что максимальный размер несжатого блока (то есть распакованных данных) не может превышать 32 Кб...
1
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 10.03.2025, 13:42 [ТС] | |
|
testuser2, ты был прав! сжатие в блочном режиме (COMPRESS_RAW) создаёт ровно такой буфер какой мне надо, без всяких прибамбас, без заголовков, просто начинается сразу с 43 4B а потом сразу ZIP-буфер и всё.
Там тот магический байт значит вообще можно было даже и не разгадывать... Добавлено через 39 минут testuser2, но всё равно, даже таким кодом, распаковать можно максимум 32768 байт.
0
|
|
| 10.03.2025, 14:32 | ||||
|
Добавлено через 16 минут
1
|
||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||||||
| 10.03.2025, 14:44 [ТС] | |||||||
1
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 10.03.2025, 14:56 [ТС] | |
|
Если бы каждый блок в ZIP файле помечался бы его размером, было бы гораздо лучше. А ещё лучше чтобы каждый блок так же выдавал информацию о количестве несжатых и сжатых байт внутри одного блока, лучше всего чтобы такая информация была бы в заголовке ZIP. Но такого нет. Я прочитал документацию, единственный случай когда в заголовке блока ZIP написан размер это когда данные несжаты...
Добавлено через 4 минуты Но учитывая, что блоки начинаются даже не с байта, а с бита, определить границу где вообще заканчивается один блок внутри ЗИП и начинается другой блок, вообще не представляется возможным. Можно прочитать лишь первый блок, но это мало что нам даст, можно лишь достать информацию например финальный это блок или нет, таким образом определить единственный он или нет и можно прочитать ещё например пометку о том что данные несжаты. Это всё что можно. ЗИП очень старый формат и очень неудобный для чтения и распаковки оказался. Тут больше ничего не придумаешь толком. Вряд ли ты сможешь распаковать файл, размер распакованных данных которого будет превышать 32768 байт... Я склоняюсь к тому что это невозможно...
0
|
|
| 10.03.2025, 17:38 | |
|
Наверное нужно двигаться в эту сторону https://www.cyberforum.ru/blogs/354370/4075.html
Вот есть inflate на asm https://github.com/keirf/amiga... nflate.asm Я так просто если что, я вооще не знаю как етим пользоваться )
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|
| 10.03.2025, 17:59 [ТС] | |
|
testuser2, так это уже реализовано в классе wqweto, его превзойти мы вряд ли сможем... Единственный минус его класса это огромные EXE - только по этой единственной причине я и затеял поиск других методов...
Добавлено через 7 минут testuser2, в классе wqweto сохранён как раз таки ассемблерный код который запускается для распаковки зипов, но его реализация занимает слишком много места из-за того что ещё и ассемблерную подпрограмму приходится хранить прямо в коде класса его Добавлено через 1 минуту testuser2, кстати его класс работает в VBA? Не знаешь?
0
|
|
| 10.03.2025, 18:27 | |
|
[HackerVlad, ты хочешь сказать, что у него там нативный код загружается в память.. Я особо не разбирался, как он работает, но на vba 86-ом он действительно работал, как я помню без особых переделок.
0
|
|
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
|||
| 10.03.2025, 19:44 [ТС] | |||
|
Добавлено через 1 минуту Добавлено через 1 минуту На 64 битах можно распаковать через этот новый код до 32 килобайт, а больше 32 килобайт можно распаковать через SHFileOperation с флагом который гасит диалоговое окно!
0
|
|||
| 11.03.2025, 02:16 | |||||||
0
|
|||||||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||
| 11.03.2025, 13:03 [ТС] | ||
|
Ну да, похоже, что его ассемблерный переходник называется "_ZIP_THUNK_"
Добавлено через 6 минут Добавлено через 5 минут testuser2, я вот когда занимался специально урезанием его класса, то мне удалось урезать со 150 до 82 Кб. 82 килобайт это мой рекорд по урезанию, но я мечтаю ещё больше урезать его класс (но будет только одна распаковка).
0
|
||
| 11.03.2025, 13:14 | ||
|
Да, самое главное не отметил это процедура pvGetThunkData.. Кстати, как я смотрю, довольно просто выглядит использование т.н. "вставки", конечно же при наличии кода для такой вставки и знание в ней смещений - выделяется память с помощью VirtualAlloc, копирование туда
Добавлено через 6 минут
0
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
|
||||
| 11.03.2025, 13:47 [ТС] | ||||
|
Добавлено через 59 секунд Ему видимо точно плевать на огромный размер EXE, в отличии от меня... Добавлено через 1 минуту Добавлено через 1 минуту А плюс если ещё сжать (желательно через дельту) тогда размер его ассемблерной вставки будет почти в два раза меньше... Я ему говорил об этом, но он меня не услышал, не захотел он этим заниматься, опять отмахнулся и сказал хочешь сам попробуй... Добавлено через 1 минуту Он аргументировал это тем что класс будет тогда работать начиная от XP... Хотя и до этого у него тоже от XP работало... Но теперь он с умным видом сказал мне что будет, вместо всего этого, работать над тем чтобы его класс работал в системах меньше чем XP...
0
|
||||
| 11.03.2025, 13:47 | |
|
Открыть zip архив и распаковать pdf файл с паролем Как распаковать файл из архива внутри архива? Ionic.Zip Как в Access97 распаковать ZIP Как распаковать Zip архив? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов
• Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp
• Смежный проект:. . .
|
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат
Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
|
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1)
Сложность: Medium
Источник: LeetCode 380
Задача
Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
|
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли.
Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
|
|
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack
Сложность: Medium
Источник: LeetCode 155
Задача:
Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1).
Методы:
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|