Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Механическая чистка ветхих драйверов, либо выжмем немножко места из Windows 7

Anna | 16.06.2014 | нет комментариев
В один очаровательный (либо грустный, кому как) день мне наскучило, что у меня периодично заканчивается место на ноутбуке. Да, я в курсе, что жёсткие диски теперь дешевы, но это для меня не выход, потому что:

  • У меня SSD, а он всё-таки дороже будет, чем обыкновенные HDD (объём моего нынешнего SSD — 120 гигов)
  • Ноутбук рабочий, соответственно данные на нём тоже, обязаны быть шифрованы, всё такое, следственно самопальный и не утверждённое работодателем носитель втыкать не стоит
  • Я алчный :)

Данный топик, вероятно, предуготовлен и может быть пригоден тем людям, кого беспокоит свободное место на системном диске, обыкновенные средства чистки теснее попробованы, а хочется выжать ещё чуть-чуть (как вветхом приколе — первая попавшаяся в гугле ссылка на прикол, если сайт дрянной — пардон).

В всеобщем, я изредка чищу место на диске. Типовые процедуры — чистка %TEMP%, чистка диска (стирает каждые там отчёты об ошибках, прикопанные системой на каждый пожарный, любые memory dump’ы упавших процессов и другое), снос непотребных больше программ.
Впрочем, как я узнал, есть папки, которые не чистит никто (от слова вовсе). Ну в смысле из стандартных средств. И теперь я хочу побеседовать о папке %WINDIR%System32DriverStore.

Если у Вас эта папка занимает много-много места, а читать каждый пост неохота — пожалуйте в самый его конец, там есть ссылки на github, откуда дозволено взять готовый итог моих исследований и испробовать выжать (либо отжать) немножко места у винды.

Вступление в загвоздку — что это за папка, для чего она необходима, кто повинен, что делать

Если порыться в интернетах, дозволено обнаружить, что это то место, куда система про резерв складывает вообще все драйвера, которые ей когда-либо попались по дороге. Да-да, и те, что были установлены для Вашей видеокарты три года назад, тоже лежат там, невзирая на то, что Вы их себе обновляли много-много раз.

Приведу немножко теории с того самого MSDN:

Starting with Windows Vista, the driver store is a trusted collection of inbox and third-party driver packages. The operating system maintains this collection in a secure location on the local hard disk. Only the driver packages in the driver store can be installed for a device.

When a driver package is copied to the driver store, all of its files are copied. This includes the INF file and all files that are referenced by the INF file. All files that are in the driver package are considered critical to the device installation. The INF file must reference all of the required files for device installation so that they are present in the driver store. If the INF file references a file that is not included in the driver package, the driver package is not copied to the store.

The process of copying a driver package to the driver store is called staging. A driver package must be staged to the driver store before the package can be used to install any devices. As a result, driver staging and device installation are separate operations.

A driver package is staged to the driver store by being verified and validated

В моём вольном переводе получится что-то как бы:

В Windows Vista и позже, хранилище драйверов применяется как альманах доверенных предустановленных и сторонних драйверов. Операционная система поддерживает данный альманах в безвредном месте на локальном диске. Только те драйвера, которые лежат в хранилище, могут быть установлены.

Когда драйвер копируется в хранилище, туда попадают все его файлы, включая .INF файл и все файлы, на которые данный .INF ссылается. Все файлы, составляющие драйвер, считаются нужными для работы устройства. INF файл должен ссылаться на все файлы, нужные для работы устройства, для того, Дабы они все попали в хранилище. Если .INF файл ссылается на файл, не входящий в драйвер, данный драйвер не копируется в хранилище.

Процесс копирования драйвера в хранилище именуется staging (не стал пытаться выдумать термин, оставил английское слово — прим.пер.). Для того, Дабы драйвер мог быть использован для какого-либо устройства, он должен пройти процесс staging, таким образом, установка устройства и staging драйвера — отдельные операции.

Перед попаданием в хранилище драйвер проверяется на реальность подписи и целостность файлов.

Неужто всё так нехорошо, и никто не поможет?

Выглядит страшновато для влезания своими чумазыми руками, не правда ли? Впрочем здесь есть маленькая (и не слишком комфортная) соломинка от Microsoft, именуется она pnputil.exe и может:

  • Перечислять драйвера, находящиеся в staging (но не входящие в стандартную поставку Вашей Windows, т.е. не интегрированные в установочный дистрибутив)
  • Добавлять драйвер в хранилище
  • Удалять драйвер из хранилища

Причём при удалении она проверяет, не применяется ли удаляемый драйвер на данный момент для какого-нибудь подключенного устройства, и без опции /f (т.е. /force — принудить насильственно) удалять такие драйвера отказывается.
Этой утилитой я и воспользовался.

Здесь нужно упомянуть, что я не 1-й такой разумный, кто думал над этой задачей, на codeplex есть план по GUI приложению DriverStore Explorer, но он реально является только графической обёрткой вокруг pnputil и никак не анализирует драйвера, предоставляя полную волю своему пользователю.
Мне же, во-первых, искать вручную устаревшие версии драйверов было не дюже охота, а во-вторых хотелось осознать, что я выиграю от удаления того либо другого драйвера (в смысле места на диске). Так что здесь был синдром NIH в полный рост.
Следственно я взял в руки Python и понеслось.

Ура, строим свой велосипед!

Способом пристального всматривания я нашел, что для того, Дабы обнаружить особенно свежую версию, довольно данных от pnputil, а вот для определения размера — нет, потому что pnputil про драйвер говорит приблизительно следующее — кто сделал, когда, версия и имя INF файла. Какая из кучи папок в DriverStore относится к этому драйверу — он не говорит.
Вглядевшись ещё внимательнее в папочку %WINDIR%Inf, я нашел там те самые .INF файлы (по именам), которые перечисляет pnputil, а заглянув в папки в DriverStore, нашел там… те же самые .INF файлы, но с другими именами — всякий в папке от своего драйвера.
Наверно есть метод и примитивней, но я пошёл в лоб — возвел отображение от имени .INF файла в выдаче pnputil на папку в DriverStore, в которой лежит такой же по содержимому .INF файл (с иным именем). И взял размер этой папки за размер драйвера.

Сейчас дело оставалось за малым — обернуть всё это в скрипты для комфортного исполнения.
По дороге, правда, лежала подстава в виде UAC — pnputil работал только с администраторскими правами, а значит, нужно было повышать привилегии из Питона. Беглое гугление дало несколько рецептов, которые говорили что-то как бы «дозволено сделать так, но итога (и уж тем больше ввода) не будет, как будете отлаживаться — без представления», и меня это не устроило, так что я чуть-чуть доработал примеры.
Правда, моя реализация на данный момент неидеальна — она упадёт при попытке перенаправить stdout либо stderr, потому что внутри я использую виндовое представление консоли, а для перенаправленных потоков это не работает…
Но я пока закрыл на это глаза, потому что для починки нужно городить чуть больше трудный механизм, чем вызов FreeConsole/AttachConsole, т.е. заниматься перенаправлением всех потоков вручную.

Пробуем написанное на практике

А сейчас, собственно, самый смак — итоги каждой этой портянки текста. Дозволено брать, применять на свой ужас и риск, дозволено пробовать наносить благо и причинять пользу исходникам (MIT лицензия, да). Дозволено даже сказать мне спасибо в комментариях, если кому-то эти скрипты помогут :)
Релиз на github’e
Если качаете бинарную версию (интерпретатор зашит внутри) — берите ту, что соответствует разрядности операционки (32-битная версия на 64-битной ОС не обнаружит pnputil и трудиться, соответственно, не будет… если дюже нужно — пишите, дозволено испробовать это обойти).
Если берёте скриптовую версию — подобно, запускать нужно интерпретатором с разрядностью операционки.

Сам лично я это проверял на 2-х компьютерах с Windows 7, в теории должно трудиться на Vista и 8. На WinXP должно быть (как бы) непотребно.
Скрипт проанализирует хранилище драйверов, постарается обнаружить устаревшие версии драйверов (т.е. такие, для которых единовременно в staging находится больше новая версия) и предложит их удалить, выдав оценку занимаемого драйверами места (и оценку выигрыша, разумеется, тоже).

Итог на моем ноутбуке

Лично мне удалось отжать порядка 6 гигабайт (!), в основном за счет удаления ветхих версий драйверов видеокарточки NVidia.
На ином ноутбуке всё оказалось не так светло, удалось очистить каждого 200 (по-моему) мегабайт, но там система жила значительно поменьше моей и легко не поспела собрать много драйверов.

Оба ноутбука с тех пор живут полной жизнью, в смысле никаких задач от чистки я не подметил.

Если Вы досюда дочитали — спасибо за внимание!

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB