Что такое упаковка windows

Что такое упаковка windows

Издано: 2003, BHV
Твердый переплет, 560 стр..

Упаковка исполняемых файлов в среде Windows как она есть

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

Когда же эти махинации всем окончательно надоели, программисты (вспомнив, что компьютер призван служить человеку, а не наоборот), додумались до автоматической распаковки исполняемых файлов «на лету». Идея заключается в дописывании к сжатому файлу крохотного распаковщика, которому передается управление при запуске файла, и который распаковывает исполняемый код не на диск, а непосредственно в оперативную память. Конечно, время загрузки ощутимо увеличивалось (особенно на машинах с медленными процессорами), но это с лихвой окупалось простотой запуска и экономией дискового пространства.

Вскоре появился целый «пантеон» упаковщиков (их тогда писали все кому не лень) — AINEXE, DIET, EXEPACK, LZEXE, PKLITE и масса других — всех не перечислись! И не удивительно: процессоры день ото дня становились все производительнее и производительнее — уже на «тройке» распаковка занимала столь незначительное время, что им было можно полностью пренебречь. К тому же приятным побочным эффектом оказалась защита от дизассемблирования.

Действительно, непосредственно дизассемблировать упакованный файл невозможно, — прежде его необходимо распаковать. Конечно, на каждый щит найдется свой меч — из под пера хакеров вышло немало замечательных универсальных распаковщиков (UNP, Intruder, UUP, а вершиной всему стал CPU386 со встроенным эмулятором реального режима 80386 процессора), но качество автоматической распаковки оставляло желать лучшего (порой распакованные файлы зависали при запуске или в процессе работы), а ручной трассировкой владели далеко не все.

Словом, при всех своих достоинствах, упаковка исполняемых файлов не имела никаких недостатков и не собиралась сдавать позиций даже с приходом емких (по тем временам!) одно — двух гигабайтных жестких дисков и лазерных накопителей на CD-ROM. Но с приходом Windows все изменилось

Сжатие файлов под Windows 9x\NT

Тысяча девятьсот девяносто пятый год мир медленно, но неотвратимо пересаживается на новую операционную систему — Windows 95. Пользователи осторожно осваивают мышь и графический интерфейс, а программисты тем временем лихорадочно переносят старое программное обеспечение на новую платформу. Объемы винчестеров к этому времени выросли настолько, что разработчики могли забыть слово «оптимизация», да они, судя по размеру современных приложений, его и забыли. Сто мегабайт — туда, триста сюда — эдак никаких гигабайт не хватит!

Вот тут-то и вспомнили о распаковке исполняемых файлов «на лету». На рынке появилось несколько программ — компрессоров, из которых наибольшую популярность завоевал ASPack, умеющий сжимать и разжимать не только «экзешники», но и динамические библиотеки. А в состав самой Windows 95 вошла динамическая библиотека «LZEXPAND.DLL», поддерживающая базовые операции упаковки-распаковки и «прозрачную» работу со сжатыми файлами. Пользователи и программисты не замедлили воспользоваться новыми средствами, но

в отличие от старушки MS-DOS, в Windows 9x\NT за автоматическую распаковку приходится платить больше, чем получать взамен. Ведь как в MS-DOS происходила загрузка исполняемых модулей? Файл целиком считывался с диска и копировался в оперативную память, причем наиболее узким местом была именно операция чтения с диска. Упаковка даже ускоряла загрузку, ибо физически считывался меньший объем данных, а их распаковка занимала пренебрежимо короткое время.

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

Читайте также:  Сборка windows с антивирусом

Например, если в текстовом редакторе есть модуль работы с таблицами, он не будет загружен с диска до тех пор, пока пользователь не захочет создать (или отобразить) свою таблицу. Причем неважно — находится ли этот модуль в динамической библиотеке или в основном файле! (Вот и попробуйте после этого сказать, что Windows глупые люди писали!). Загрузка таких «монстров» как Microsoft Visual Studio и Word как бы «размазывается» во времени и к работе с приложением можно приступать практически сразу же после его запуска. А что произойдет, если файл упаковать? Правильно, — он будет должен считаться с диска целиком (!) и затем — опять-таки, целиком — распаковаться в оперативную память.

Стоп! Откуда у нас столько оперативной памяти? Ее явно не хватит и распакованные такой ценой страницы придется вновь скидывать на диск! Как говорится, за что боролись, на то и напоролись. Причем, если при проецировании неупакованного exe-файла оперативная память не выделяется, (ну, во всяком случае, до тех пор, пока в ней не возникнет необходимость), распаковщику без памяти никак не обойтись! А поскольку оперативная память никогда не бывает в избытке, она может быть выделена лишь за счет других приложений! Отметим также, что в силу конструктивных особенностей «железа» и архитектуры операционной системы, операция записи на диск заметно медленнее операции чтения.

Важно понять: Windows никогда не сбрасывает на диск не модифицированные страницы проецируемого файла. Зачем ей это? Ведь в любой момент их можно вновь считать из оригинального файла. Но ведь при распаковке модифицируются все страницы файла! Значит, система будет вынуждена «гонять» их между диском и памятью, что существенно снизит общую производительность всех приложений в целом.

Еще большие накладные расходы влечет за собой сжатие динамических библиотек. Для экономии памяти страницы, занятые динамической библиотекой, используются совместно всеми процессами, загрузившими эту DLL. Но как только один из процессов пытается что-то записать в память, занятую DLL, система автоматически создает копию модифицируемой страницы и предоставляет ее в «монопольное» распоряжение процесса-писателя. Поскольку, распаковка динамических библиотек происходит в контексте процесса, загрузившего эту DLL, система вынуждена многократно дублировать все страницы памяти, выделенные динамической библиотеке, фактически предоставляя каждому процессору свой собственный экземпляр DLL. Предположим, одна DLL размером в мегабайт, была загружена десятью процессами, — посчитайте: сколько памяти напрасно потеряется, если она сжата!

Таким образом, под Windows 9x\NT сжимать исполняемые файлы нецелесообразно, — вы платите гораздо больше, чем выручаете. Что же касается защиты от дизассемблирования Да, когда ASPack только появился, он отвадил от взлома очень многих неквалифицированных хакеров, но, увы, ненадолго! Сегодня только слепой не найдет руководства по ручному снятию ASPack’а. Существует и масса готового инструментария — от автоматических распаковщиков до плагинов к дизассемблеру IDA Pro, позволяющих ему дизассемблировать сжатые файлы. Поэтому, надеяться, что ASPack спасет вашу программу от взлома несколько наивно.

Измерения падения производительности от сжатия программ (DLL)

В заключение поговорим об измерении падения производительности от упаковки файлов. Казалось бы, что тут сложного — берем неупакованный файл, запускаем его, замеряв время загрузки, записываем результат на бумажке, упаковываем, запускаем еще раз, и Первый камень преткновения — что понимать под «временем загрузки»? Если проецирование, — так оно выполняется практически мгновенно, и им можно вообще пренебречь. Момент времени, начиная с которого с приложением можно полноценно работать? Так это от самого приложения зависит больше, чем от его упаковки. К тому же на время загрузки упакованных файлов очень сильно влияет количество свободной на момент запуска физической оперативной памяти (не путать с общим объемом памяти, установленной на машине). Если перед запуском упакованного файла завершить одно-два «монстроузных» приложения, то занятая ими память окажется свободной, и сможет беспрепятственно использоваться распаковщиком. Напротив, если свободной памяти нет, ее придется по крохам отрывать от остальных приложений

Даже если мы оценим изменение времени загрузки (что, кстати, сделать весьма проблематично — серия замеров на одной и той же машине, с одним и тем же набором приложений дает разброс результатов более чем на порядок!), как измерять падение производительности остальных приложений? Ведь, при нехватке памяти Windows в первую очередь избавляется от не модифицированных страниц, которые незачем сохранять на диске! В результате упаковка исполняемого файла может несколько повысить производительность самого этого файла, но значительного ухудшает положение неупакованных приложений, исполняющихся параллельно с ним!

Читайте также:  Installing phpmyadmin in windows

Поэтому, никаких конкретных цифр здесь не приводится. Приблизительные оценки, выполненные «на глаз», показывают, что при наличии практически неограниченного количества оперативной памяти потери производительности составляют менее 10%, но при ее нехватке, скорость всех приложений падает от двух до десяти раз! (Для справки: в эксперименте участвовали исполняемые файлы Microsoft Word 2000, Visual Studio 6.0, Free Pascal 1.04, IDA Pro 4.17, Adobe Acrobat Reader 3.4, машина с процессором CLERION-300A, оснащенная 256 мегабайтами ОЗУ, для имитации нехватки памяти ее объем уменьшался до 64 мегабайт; использовались операционные системы — Windows 2000 и Windows 98).

Часть 5. Упаковка и развертывание с помощью MSIX Part 5: Package and deploy with MSIX

Это заключительная часть учебника, в котором рассматривается модернизация примера классического приложения WPF с именем Contoso Expenses. This is the final part of a tutorial that demonstrates how to modernize a sample WPF desktop app named Contoso Expenses. Общие сведения об этом учебнике, предварительные требования и инструкции по скачиванию примера приложения см. в учебнике по модернизации приложения WPF. For an overview of the tutorial, prerequisites, and instructions for downloading the sample app, see Tutorial: Modernize a WPF app. В этой статье предполагается, что вы уже выполнили инструкции из части 4. This article assumes you have already completed part 4.

В части 4 вы узнали, что для использования в приложении некоторых API WinRT, включая API уведомлений, требуется удостоверение пакета. In part 4 you learned that some WinRT APIs, including the notifications API, require package identity before they can be used in an app. Вы можете получить удостоверение пакета, выполнив упаковку Contoso Expenses в формате MSIX, который был реализован в Windows 10 для упаковки и развертывания приложений Windows. You can obtain package identity by packaging Contoso Expenses using MSIX, the packaging format introduced in Windows 10 to package and deploy Windows applications. MSIX дает разработчикам и ИТ-специалистам ряд преимуществ, в том числе: MSIX provides advantages for developers and IT Pros, including:

  • оптимизированное использование сети и дискового пространства; Optimized network usage and storage space.
  • полное удаление с очисткой благодаря упрощенному контейнеру, в котором выполняется приложение; Complete clean uninstall, thanks to a lightweight container where the app is executed. отсутствие разделов реестра и временных файлов, которые остаются в системе; No registry keys and temporary files are left on the system.
  • отделение обновлений ОС от обновлений и настроек приложения; Decouples OS updates from application updates and customizations.
  • упрощенный процесс установки, обновления и удаления. Simplifies the install, update, and uninstall process.

В этой части учебника вы узнаете, как упаковать приложение Contoso Expenses в пакет MSIX. In this part of the tutorial you’ll learn how to package the Contoso Expenses app in an MSIX package.

Создание пакета приложения Package the application

Visual Studio 2019 предоставляет простой способ для упаковки классического приложения через проект упаковки приложений Windows. Visual Studio 2019 provides an easy way to package a desktop application by using the Windows Application Packaging Project.

В обозревателе решений щелкните правой кнопкой мыши решение ContosoExpenses и выберите команду Добавить > Новый проект. In Solution Explorer, right-click the ContosoExpenses solution and choose Add -> New project.

В диалоговом окне Добавление нового проекта выполните поиск по запросу packaging , затем выберите шаблон Windows Application Packaging Project (Проект упаковки приложений Windows) в категории C# и нажмите Далее. In the Add a new project dialog box, search for packaging , choose the Windows Application Packaging Project project template in the C# category, and click Next.

Присвойте проекту имя ContosoExpenses.Package и нажмите Создать. Name the new project ContosoExpenses.Package and click Create.

Выберите Windows 10 версии 1903 (10.0; сборка 18362) в полях для выбора целевой и минимальной версии, затем нажмите OK. Select Windows 10, version 1903 (10.0; Build 18362) for both the Target version and Minimum version and click OK.

Читайте также:  Зависает монитор windows 10

Проект ContosoExpenses.Package будет добавлен в решение ContosoExpenses. The ContosoExpenses.Package project is added to the ContosoExpenses solution. Этот проект содержит манифест пакета с описанием приложения и некоторые стандартные ресурсы для таких элементов, например значок в меню «Программы» и плитку на начальном экране. This project includes a package manifest, which describes the application, and some default assets that are used for items such as the icon in the Programs menu and the tile in the Start screen. Но в отличие от проекта UWP, проект упаковки не содержит кода. However, unlike a UWP project, the packaging project doesn’t contain code. Он предназначен для упаковки существующего классического приложения. Its purpose is to package an existing desktop app.

В проекте ContosoExpenses.Package щелкните правой кнопкой мыши узел Приложения и выберите Добавить ссылку. In the ContosoExpenses.Package project, right-click the Applications node and choose Add reference. Этот узел указывает, какие приложения из решения будут включены в пакет. This node specifies which applications in your solution will be included in the package.

В списке проектов выберите ContosoExpenses.Core и нажмите OK. In the list of projects, select ContosoExpenses.Core and click OK.

Разверните узел Приложения и убедитесь, что в нем есть ссылка на проект ContosoExpense.Core, выделенная полужирным шрифтом. Expand the Applications node and confirm that the the ContosoExpense.Core project is referenced and highlighted in bold. Это означает, что он будет использоваться в качестве стартовой точки пакета. This means that it will be used as a starting point for the package.

Щелкните проект ContosoExpenses.Package правой кнопкой мыши и выберите Назначить запускаемым проектом. Right-click the ContosoExpenses.Package project and choose Set As Startup Project.

Нажмите клавишу F5, чтобы запустить упакованное приложение в отладчике. Press F5 to start the packaged app in the debugger.

На этом этапе вы можете заметить некоторые изменения, характерные для упакованных приложений. At this point, you can notice some changes that indicate the app is now running as packaged:

Значок на панели задач или в меню «Пуск» теперь считается ресурсом по умолчанию и включается в каждый проект упаковки приложений Windows. The icon in the taskbar or in the Start menu is now the default asset that is included in every Windows Application Packaging Project.

Если щелкнуть правой кнопкой мыши приложение ContosoExpense.Package, указанное в меню «Пуск», вы увидите параметры, которые обычно зарезервированы для скачанных из Microsoft Store приложений, например Параметры приложения, Оценки и отзывы и Поделиться. If you right-click the ContosoExpense.Package application listed in the Start menu, you’ll notice options that are typically reserved for apps downloaded from the Microsoft Store, such as App settings, Rate and review and Share.

Если вы хотите удалить приложение, щелкните правой кнопкой мыши ContosoExpenses.Package в меню «Пуск» и выберите Удалить. If you want to uninstall the app, you can right-click ContosoExpense.Package in the Start menu and choose Uninstall. Приложение будет немедленно удалено и не оставит никаких следов в системе. The app will be immediately removed, without leaving any leftover on the system.

Проверка уведомления Test the notification

Теперь, когда вы создали пакет MSIX приложения Contoso Expenses, вы можете протестировать сценарий уведомления, который не работал после завершения части 4. Now that you have packaged the Contoso Expenses app with MSIX, you can test the notification scenario which wasn’t working at the end of part 4.

  1. В приложении Contoso Expenses выберите из списка сотрудника и нажмите кнопку Добавить новый расход. In the Contoso Expenses app, choose an employee from the list and then click the Add new expense button.
  2. Заполните все поля в этой форме и нажмите Сохранить. Complete all fields in the form and press Save.
  3. Убедитесь, что уведомление операционной системы показывается. Confirm that you see an OS notification.
Оцените статью