Лекция 4. Разработка Win32 приложений

Лекция 3. Подсистема Win32

Лекция 4. Разработка Win32 приложений

Практическое занятие №18

Лекция 7. Объекты в ОС Windows.

Лекция 8. Процессы в ОС Windows

Лекция 1. Архитектура Операционных Систем

Известно, что операционная система (ОС) является базисной системной программой. Обычно аппаратно-программное обеспечение типовой вычислительной системы представляют в виде набора слоев (рис. 1.1), при этом операционной системе соответствует слой между оборудованием компьютера и остальным программным обеспечением. Такое расположение позволяет ОС обеспечивать возможность рационального использования оборудования компьютера удобным для пользователя образом путем создания среды для функционирования и разработки прикладных программ.

Лекция 4. Разработка Win32 приложений - student2.ru
Рис. 1.1. Слои программного обеспечения компьютерной системы

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

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

Краткая история создания ОС Windows

Первая версия описываемого ряда операционных систем - ОС Windows NT появилась в 1993 г. Краткий исторический экскурс позволяет объяснить ряд ее особенностей и отличительных черт.

Онтогенез повторяет филогенез

В книге Таненбаума справедливо отмечено, что развитие операционных систем иллюстрирует известное из биологии правило "Онтогенез повторяет филогенез" - то есть развитие зародыша (онтогенез) повторяет эволюцию видов. Соответственно, каждый новый вид компьютера (мэйнфрейм, мини-компьютер, персональный компьютер, встроенный компьютер, смарт-карта и т.д.) проходит через одни и те же стадии развития. По мере совершенствования архитектуры, программирование на ассемблере сменяется программированием на языках высокого уровня. Затем компьютер обрастает дополнительным оборудованием, средствами поддержки многозадачности, простые операционные системы заменяются все более сложными. Попутно появляются централизованные файловые системы, виртуальная память и другие атрибуты полноценных операционных систем. Такой взгляд на эволюцию компьютерных архитектур имеет известную предсказательную силу. В частности, можно считать, что операционные системы Microsoft, начиная от MS-DOS и кончая современными версиями Windows, развивались по схожему сценарию.

Лекция 2. История развития ОС Windows

Создание ОС Windows

Как уже отмечалось, эволюция операционных систем Microsoft является хорошей иллюстрацией тезиса о повторении онтогенезом филогенеза.

Операционные системы корпорации Microsoft можно условно разделить на три группы:

· MS-DOS и MS-DOS+Windows 3.1,

· так называемые потребительские (consumer) версии Windows (Windows 95/98/Me)

· и предмет данного курса - линия ОС, ведущих свое начало от Windows NT (Windows NT/2000/XP/Vista).

Однозадачная 16-разрядная ОС MS-DOS была выпущена в начале 80-х годов и затем широко применялась на компьютерах с процессором x86. Вначале MS-DOS была довольно примитивна (деградация ОС), ее оболочка занималась, главным образом, обработкой командной строки, но в последующие версии было внесено много улучшений, заимствованных, главным образом, из ОС Unix. Затем под влиянием успехов дружественного графического интерфейса корпорации Apple для компьютеров Macintosh была разработана система Windows. Особенно широкое распространение получили версии Windows 3.0, 3.1 и 3.11. Первоначально это была не самостоятельная ОС, а скорее многозадачная (с невытесняющей многозадачностью) графическая оболочка MS-DOS, которая контролировала компьютер и файловую систему.

В 1995 г. была выпущена 32-разрядная ОС Windows 95, где была реализована вытесняющая многозадачность. ОС Windows 95 включала большой объем 16-разрядного кода, главным образом для обеспечения преемственности с приложениями MS-DOS. 16-разрядный код присутствовал и в последующих версиях этой серии Windows 98 и Windows Me. Другой проблемой данной версии Windows, во многом обусловленной той же причиной, была нереентерабельность существенной части кода ядра. Так, если один из потоков был занят модификацией данных в ядре, другой поток, чтобы не получить эти данные в противоречивом состоянии, вынужден был ждать, то есть не мог воспользоваться системными сервисами. Это, зачастую, сводило на нет преимущества многозадачности.

ОС Windows NT (New Technology) - новая 32-разрядная ОС, совместимая с предшествующими версиями Windows по интерфейсу. Работу над созданием системы возглавил Дэвид Катлер, один из ключевых разработчиков ОС VAX VMS. Ряд идей системы VMS присутствует в NT (см рис. 1.3). Заметна преемственность в системе управления большим адресным пространством и резидентным множеством процесса, в системе приоритетов обычных процессов и процессов реального времени, в средствах синхронизации и т.д. Вместе с тем Windows NT - это совершенно новый амбициозный проект разработки системы с учетом новейших достижений в области архитектуры микроядра. Первая версия, названная Windows NT 3.1 для соответствия популярной Windows 3.1, была выпущена в 1993 г. Коммерческого успеха добилась версия Windows NT 4.0, заимствовавшая графический интерфейс Windows 95. В начале 1999 г. была выпущена Windows NT 5.0, переименованная в Windows 2000. Следующая версия этой ОС данной серии - Windows XP появилась в 2001 г., а Windows Server 2003 - в 2003 г. В настоящее время выпущена Windows Vista, ранее известная под кодовым именем Longhorn, - новая версия Windows, продолжающая линейку Windows NT.

Лекция 4. Разработка Win32 приложений - student2.ru


Рис. 1.3. Сравнение архитектур ОС Windows и VAX/VMS

Объем исходных текстов ядра ОС Windows неизвестен. По некоторым оценкам, объем ядра Windows NT 3.5 составляет приблизительно 10Мб, а с каждой новой версией ОС Windows этот объем неуклонно увеличивается в полтора-два раза.

Возможности системы

Перед разработчиками системы была поставлена задача создать операционную систему персонального компьютера, предназначенную для решения серьезных задач, а также для домашнего использования. Перечень возможностей системы достаточно широк, вот лишь некоторые из них [6], [4]. Операционная система Windows:

· является истинно 32-разрядной, поддерживает вытесняющую многозадачность;

· работает на разных аппаратных архитектурах и обладает способностью к сравнительно легкому переносу на новые аппаратные архитектуры;

· поддерживает работу с виртуальной памятью;

· является полностью реентерабельной;

· хорошо масштабируется в системах с симметричной мультипроцессорной обработкой;

· является распределенной вычислительной платформой, способной выступать в роли как клиента сети, так и сервера;

· защищена как от внутренних сбоев, так и от внешних деструктивных действий. У приложений нет возможности нарушить работу операционной системы или других приложений;

· совместима, то есть, ее пользовательский интерфейс и API совместимы с предыдущими версиями Windows и MS-DOS. Она также умеет взаимодействовать с другими системами вроде UNIX, OS/2 и NetWare;

· обладает высокой производительностью независимо от аппаратной платформы;

· обеспечивает простоту адаптации к глобальному рынку за счет поддержки Unicode;

· поддерживает многопоточность и объектную модель.

Успешность реализации этих требований будет продемонстрирована по мере изучения деталей ОС Windows. В рамках курса будут введены и впоследствии уточнены и детализированы различные понятия и термины.. Некоторые из них приведены в приложении.

Структура ОС Windows

Подсистема Win32

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

Win32 API (Application Programming Interface) - основной интерфейс программирования в семействе операционных систем Microsoft Windows. Функции Win32 API , например, CreateProcess или CreateFile, - документированные, вызываемые подпрограммы, реализуемые Win32 подсистемой.

В состав Win32 подсистемы (см. рис. 1.4) входят: cерверный процесс подсистемы окружения csrss.exe, драйвер режима ядра Win32k.sys, dll - модули подсистем (kernel32.dll, advapi32.dll, user32.dll и gdi32.dll), экспортирующие Win32-функции и драйверы графических устройств. В процессе эволюции структура подсистемы претерпела изменения. Например, функции окон и рисования с целью повышения производительности были перенесены из серверного процесса, работающего в режиме пользователя, в драйвер режима ядра Win32k.sys. Однако это и подобные изменения никак не отразились на работоспособности приложений, поскольку существующие вызовы Win32 API не изменяются с новыми выпусками системы Windows, хотя их состав постоянно пополняется.

Приложение, ориентированное на использование Win32 API, может работать практически на всех версиях Windows, несмотря на то, что сами системные вызовы в различных системах различны (см. рис. 1.5). Таким путем корпорация Microsoft обеспечивает преемственность своих операционных систем.

Лекция 4. Разработка Win32 приложений - student2.ru

Рис. 1.5. Поддержка единого программного интерфейса для различных версий Windows

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

Лекция 4. Разработка Win32 приложений - student2.ru


Рис. 1.6. Различные маршруты выполнения вызовов Win32 API.

При вызове приложением одной из Win32-функций dll-подсистем может возникнуть одна из трех ситуаций (см. рис. 1.6).

· Функция полностью выполняется внутри данной dll (шаг 1).

· Для выполнения функции привлекается сервер csrss, для чего ему посылается сообщение (шаг 2a, за которым обычно следуют шаги 2b и 2c).

· Данный вызов транслируется в системный сервис (системный вызов), который обычно обрабатывается в модуле ntdll.dll (шаги 3a и 3b). Например, Win32-функция ReadFile выполняется с помощью недокументированного сервиса NtReadFile.

Некоторые функции (например, CreateProcess ) требуют выполнения обоих последних пунктов.

В первых версиях ОС Windows практически все вызовы Win32 API выполнялись, следуя маршруту 2 (2a, 2b, 2c). После того, как существенная часть кода системы для увеличения производительности была перенесена в ядро (начиная с Windows NT 4.0), вызовы Win32 API, как правило, идут напрямую по 3-му (3a, 3b) пути, минуя подсистему окружения Win32. В настоящее время лишь небольшое число вызовов выполняется по длинному 2-му маршруту.

Помимо перечисленных, наиболее важных dll-библиотек, в системном каталоге system32 имеется большое количество других dll-файлов. В настоящее время количество вызовов API составляет несколько десятков тысяч.

Заключение

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

Приложение. Некоторые понятия и термины

DLL (динамически подключаемая библиотека)

Набор вызываемых подпрограмм, включенных в один двоичный файл, который приложения, использующие эти подпрограммы, могут динамически загружать в процессе своего выполнения. В качестве примера можно привести модули Msvcrt.dll (библиотека исполняющей Си подсистемы) и Kernel32.dll (одна из библиотек подсистемы Win32). DLL активно используются компонентами и приложениями ОС Windows пользовательского режима. Преимущество DLL перед статическими библиотеками состоит в том, что приложения могут разделять DLL-модули, при этом ОС Windows гарантирует, что в памяти будет находиться лишь по одному экземпляру используемых DLL.

Процессы и потоки

Под процессом понимается контейнер ресурсов, используемых потоками. Процесс включает: закрытое адресное пространство, в котором располагаются код, данные и стеки потоков; список открытых описателей ресурсов; контекст защиты; идентификатор процесса.

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

Более подробно процессы и потоки описаны в части II.

Компилятор Visual C++ и среда программирования для Windows

Компилятор Windows Visual C++ удобно объединять со справочной системой MSDN Library, которая при этом вызывается через пункт меню "Справка" ("Help") в интегрированной среде Microsoft Visual C++, а также может использоваться автономно. Запуск установленной графической оболочки Microsoft Visual C++ осуществляется стандартными средствами системы.

Прежде, чем начинать работать с Windows Visual C++ рекомендуется сформировать на рабочем столе иконку запуска компилятора. Для этого зайдите в меню <все программы>, найдите там пункт <Microsoft Visual > и создайте копию иконки <Microsoft Visual С++> , затем перенесите ее на рабочий стол.

Чтобы из текста программы на языке высокого уровня (файл с расширением "c" или "cpp") получить исполняемую программу в машинных кодах (файл с расширением "exe"), необходимо запустить графическую оболочку Microsoft Visual Studio C++ создать рабочий проект, который представляет собой совокупность служебных файлов, необходимых для дальнейшей работы.

Программные примеры, иллюстрирующие данный курс, представляют собой Windows-приложения с текстовым интерфейсом (консольные). Разработка приложений с дружественным графическим интерфейсом сама по себе достаточно сложна и должна изучаться в рамках специальных учебных курсов. Поэтому, формируя проект, далее в графической оболочке Visual Studio в диалоговом окне "New project" нужно выбрать Win32 Console Application в качестве типа приложения, а также дать проекту имя, указать каталог расположения файлов проекта и нажать кнопку "OK".

Имена файлам будем давать по номеру практической работы prN_Фамилия где N-номер практической работы, Фамилия-фамилия студента. Каталог используем по умолчанию.

Затем при помощи пунктов меню и всплывающих окон графической оболочки нужно включить в проект файлы, содержащие программу, или ввести программу с клавиатуры с последующим ее сохранением в одном из файлов проекта. Через пункт меню "Build" можно выполнить компиляцию программы, создать исполняемый модуль, запустить программу на счет и, при необходимости, выполнить ее отладку.

Откомпилировать программу можно нажатием клавиши F7

Запустить программу на отладку можно клавишами Ctrl+F5

Прогон программы "Hello, world"

В качестве самостоятельного упражнения рекомендуется реализовать простейшую программу в интегрированной среде компилятора Visual C++, например, хрестоматийную программу "Hello, world", и ознакомиться со средствами разработки, отладки и контекстной помощи.

Обработка ошибок

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

Вызываемая Win32-функция может возвратить значение, свидетельствующее об ошибке (например, NULL для функций типа HANDLE или ноль для функций типа BOOL). В таких случаях можно попытаться выявить тип ошибки при помощи функции GetLastError - она возвращает код последней ошибки, который хранится в локальной памяти потока, вызвавшего ошибку. Коды ошибок (а их более 10 тысяч), представляющие собой 32-битные числа, находятся в заголовочном файле WinError.h.

Если приложение содержит функции, к которым обращаются другие программы, то желательно, чтобы эти функции синтезировали код ошибки в случае возникновения ошибочных ситуаций, то есть вели себя подобно функциям Win32 API. Это можно сделать при помощи функции SetLastError.

Для преобразования кода ошибки в ее содержательное описание предназначена Win32-функция FormatMessage.

Заключение

В данной лекции рассмотрены вопросы, важные с точки зрения практического освоения ОС Windows и разработки Win32-приложений. Основным источником сведений об API системы является справочная система MSDN. Разработчику приложений необходимо владеть средствами разработки и отладки, знать основные типы данных и форматы хранения текстовых строк, а также правильно обрабатывать ошибки. Дополнительным источником сведений о системе являются разнообразные инструментальные средства.

Вопросы :

Лекция 4. Разработка Win32 приложений - student2.ru 1.Что такое Win32 API ?

(Win32 API предоставляет всеобъемлющий интерфейс, позволяющий выполнить каждое действие несколькими способами и покрывающий все области, с которыми должна работать операционная система.)

Практическое занятие №16

Разработка и отладка программ в MS Visual C++

Практическое занятие №17

Разработка и отладка программ в MS Visial C++

Лекция 3. Подсистема Win32

Как отмечалось в предыдущей лекции в развитии ОС Windows большую роль сыграло развитие программного интерфейса Win32 API (Application Programming Interfase).

Win32 API

Уже отмечалось, что в ОС Windows между приложением и совокупностью системных вызовов (системных сервисов в терминологии Microsoft) расположен дополнительный абстрактный слой - программный интерфейс Win32 API. За счет этого Win32-приложение может работать практически во всех версиях Windows , несмотря на то, что сами системные вызовы в различных версиях системы различны и не документированы.

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

Функции API хранятся в так называемых динамических библиотеках - (Dynamic Link Library ), которые размещаются в файлах с расширением dll, таких как kernel.dll, user32.dll, gdi32.dll и некоторых других. Эти файлы размещаются в системном каталоге Windows (обычно C:\WINDOWS\SYSTEM).

Фактически функции API для Windows играют ту же самую роль, что и программные прерывания для MS DOS, однако вызов функций API производится более простым и привычным для программиста способом - через символические имена. Например, функция удаления файла вызывается по имени DeleteFile, функция установки системного времени - SetSystemTime и т.д.

Исчерпывающая информация по программному интерфейсу Win32 API содержится в справочной документации на Win32 API. Эту документацию можно просмотреть на сайте http://msdn.microsoft.com или на компакт-дисках MSDN (Microsoft Developer Network Library). MSDN является программой технической поддержки разработчиков.

Если заглянуть в раздел MSDN \Platform SDK\ Win32\ Overview of the Win32 API, то можно увидеть, что Win32 API подразделяются на следующие группы.

1) Base Services - базовые сервисы отвечают за обеспечение доступа к ресурсам компьютера и интерфейс для работы с памятью, файлами, устройствами, процессами и потоками.

2) Common Control Library - библиотека общих элементов управления для разработки оконных интерфейсов.

3) Graphics Device Interface - вывод графики на дисплей и другие устройства.

4) Network Services - сетевые сервисы.

5) User Interface - интерфейс пользователя.

6) Windows Shell - функции для работы с оболочкой.

7) Windows System Information - информация о конфигурации системы Windows.

В рамках данного курса нам потребуются главным образом функции, относящиеся к первому пункту списка и описанные в MSDN разделе \Platform SDK\Base Services.

Список функций Win32 API можно найти на сайтах http://www.piclist.com/Techref/os/win/api/funcIndex-local.html

http://win-api.narod.ru/g.htm

GetVolumeInformationA(

In nVolumeNameSize

&lDriverSerialNumber, //out серийный номер диска

&dMaxNameFileSize, //out макc количество символов в имени файла

&dFlags, //out флаги

In nFileSystemNameSize

);

cout << "Имя тома:\t";

cout << cVolumeNameBuffer << endl;

cout << "Тип файловой системы:\t";

cout << cFileSystemNameBuffer << endl;

cout << "Серийный номер тома:\t";

cout << lDriverSerialNumber << endl;

}

/* При выполнении данной практической работы я освоил

*/

В результате выполнения этой программы в консольном окне появится, например, следующее:

Disk1

NTFS

Press any key to continue

Обратите внимание, что указатели типа LPSTR могут объявляться как char, а указатели на числовые переменные при передаче параметров записываются с помощью оператора &

Вопросы :

Лекция 4. Разработка Win32 приложений - student2.ru 1. Из библиотек какого типа загружаются функции WIN32 API (Application Programming Interfase) ?

Функции API хранятся в так называемых динамических библиотеках - (Dynamic Link Library ), которые размещаются в файлах с расширением dll, таких как kernel.dll, user32.dll, gdi32.dll и некоторых других. Эти файлы размещаются в системном каталоге Windows (обычно C:\WINDOWS\SYSTEM).

Лекция 4. Разработка Win32 приложений - student2.ru 2. Где в основном определяются прототипы функций WIN32 API ?

При написании программ на языке C/C++ типы данных Windows и прототипы функций API определяются во включаемых заголовочных файлах Win32, основным из которых является файл windows.h. Помимо типов данных в этом файле определено более 1000 констант.

3. Где хранится описание константы ERROR_FILE_NOT_FOUND ?

Лекция 4. Разработка Win32 приложений - student2.ru В файле windows.h

Лекция 4. Разработка Win32 приложений - student2.ru 4. Каких двух типов могут быть программы использующие WIN32 API ?

Оконные и консольные.

Решения и проекты

С точки зрения программирования, все, что вы делаете внутри VS, происходит в контексте решения.

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

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

Начальная страница

Когда вы впервые попадаете в интегрированную среду разработки VS, то видите Начальную страницу этого инструмента. На рис. 1 показан пример такой страницы . На начальной странице имеется строка главного меню, панель инструментов , обозреватель решений. Справой стороны расположены поля New Project и Open Project для формирования нового проекта или открытия существующего. Ниже расположены поля последних проектов (Recent projects).

Обозреватель решений

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

Создать новый проект
Лекция 4. Разработка Win32 приложений - student2.ru
Добавить новый элемент
Лекция 4. Разработка Win32 приложений - student2.ru
Сохранить все
Лекция 4. Разработка Win32 приложений - student2.ru
Начать отладку CTRL+F5  
Редактор кода
Лекция 4. Разработка Win32 приложений - student2.ru Лекция 4. Разработка Win32 приложений - student2.ru
Список ошибок
Лекция 4. Разработка Win32 приложений - student2.ru Лекция 4. Разработка Win32 приложений - student2.ru

Рис. 2. Фрагмент окна интегрированной среды разработки в режиме открытого решения

Практическое занятие №18

Win32 API

GetVolumeInformationA(

In nVolumeNameSize

&lDriverSerialNumber, //out серийный номер диска

&dMaxNameFileSize, //out макc количество символов в имени файла

&dFlags, //out флаги

In nFileSystemNameSize

);

cout << "Имя тома:\t";

cout << cVolumeNameBuffer << endl;

cout << "Тип файловой системы:\t";

cout << cFileSystemNameBuffer << endl;

cout << "Серийный номер тома:\t";

cout << lDriverSerialNumber << endl;

}

/* При выполнении данной практической работы я освоил

*/

Вопросы :

1.Зачем нужна функция int main() ?

2.Зачем нужна инструкция #include <iostream> ?

3. Какого типа переменная cRootPathName[100] ?

4.Что делает системная функция GetVolumeInformationA () ?

5. Что делает инструкция cout << lDriverSerialNumber << endl;

Практическое занятие №19

Разработка win32 приложений

Инструменты

Сеть

Инструменты для сети: от мониторов подключений до анализаторов безопасности ресурсов.

Процессы и потоки

Сервисные программы, позволяющие заглянуть "под капот" и определить задачи, выполняемые теми или иными процессами и потребляемые ими ресурсы.

· Программа PsExec

Эта программа позволяет удаленно запускать процессы.

· Программа PsKill

Эта программа позволяет завершать работу процессов как на локальной, так и на удаленной системе.

· Программа PsList

Эта программа выводит информацию о процессах и потоках.

Комплект программ PsTools

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

Разное

Собрание разнообразных сервисных программ, в том числе заставок, средств представления и инструментов отладки.

Int main()

{

// setlocale(LC_ALL,"RUS");

DWORD dL;

Практическое занятие №20

Практическая часть

//Практическое занятие № 20

//Группа xxxxxx Терминал N ФИО

#include "stdafx.h"

#include "windows.h" /* win32 API */

//#include <locale.h> /* подключение Русского языка */

Int main()

{

// setlocale(LC_ALL,"RUS");

DWORD dL;

Практическое занятие №21

Синтаксис инструкции try

__try

{

// код программы с возможной ошибкой (защищенный раздел)

}

__except ( expression )

{

// Обработчик исключения

}

Практическая часть

//Практическое занятие № 21

//Группа xxxxxx Терминал N ФИО

#include "stdafx.h"

#include "windows.h" // win32 API

#include <locale.h> // подключение Русского языка

#include <iostream> // инструкции c++ std,cout,cin …

using namespace std; // пространство стандартных имен */

void main() {

setlocale(LC_ALL,"RUS");

int iI = 1, iJ = 0, iK = 0,iNtry;

__try { //Защищенный раздел

iNtry=13;

iK = iI / iJ;// Возможно деление на 0

cout << "in try" << endl ;

cout << "iK= " << iK << endl ;

cout << "LastError = " << GetLastError() << endl;

}

__except (1) {

cout << "in except " << endl ;

cout << "Деление на 0 iNtry= " << iNtry << endl ;

cout << "LastError= " << GetLastError() << endl;

}

}

/* При выполнении данной практической работы я освоил

.

*/

Вопросы :

1.Что означает инструкция COORD crPoint;?

2.Что означают инструкции crPoint.X = 0; crPoint.Y = 0;?

3.Что делает инструкция GetStdHandle(STD_OUTPUT_HANDLE); ?

4.Что делает инструкция SetConsoleTitle(wTitle); ?

5.Что делает инструкция SetConsoleCursorPosition(hOut, crPoint);?

6. Что делает инструкция __try { } __except (1) { cout << "in except " << endl ;}

Введение

Для работы с важными системными ресурсами ОС Windows создает объекты, управление которыми осуществляет менеджер объектов. Когда приложение открывает файл, создает поток или семафор, оно получает описатель ( handle ) соответствующего объекта (см. рис. 4.1). Например, после выполнения программного оператора

hSemaphore = CreateSemaphore(NULL, 0, MaxCount, "MySemaphore");

создающего семафор, возвращаемый описатель hSemaphore необходим приложению для последующей работы с этим семафором.

Лекция 4. Разработка Win32 приложений - student2.ru

Рис. 4.1. Создание объекта "семафор" приложением

Объекты присутствуют почти во всех компонентах системы, особенно там, где есть данные, которые нужно разделять, защищать, именовать или сделать доступными. Например, посредством объектов реализованы программные и аппаратные прерывания, а также многие другие функции ядра.

Объекты ядра

В рамках данного курса нам придется активно использовать объекты, называемые в руководствах по Win32-программированию объектами ядра (kernel objects). Поддержка объектов ядра осуществляется собственно ядром системы.

Ядро поддерживает базовые объекты двух видов:

-объекты диспетчера (события, мьютексы, семафоры, потоки ядра, таймеры и др.)

- и управляющие объекты (DPC, APC, прерывания, процессы, профили и др.)

Над объектами ядра находятся объекты исполнительной системы, каждый из которых инкапсулирует один или более объектов ядра. Объекты исполнительной системы предназначены для управления памятью, процессами и межпроцессным обменом. Они экспортируются в распоряжение пользовательских приложений через Win32 функции. К ним относятся такие объекты, как: процесс, поток, открытый файл, семафор, мьютекс, маркер доступа и ряд других. Полный список можно увидеть в MSDN. Эти объекты и называются объектами ядра в руководствах по программированию.

Объект представляет собой блок памяти в виртуальном адресном пространстве ядра. Этот блок содержит информацию об объекте в виде структуры данных (см. ниже "структура объекта"). Структура содержит как общие, так и специфичные для каждого объекта элементы. Объекты создаются в процессе загрузки и функционирования ОС и теряются при перезагрузке и выключении питания.

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

Методы объекта

В состав заголовка объекта входит поле тип объекта которое ссылается на таблицу типа объекта. В эту таблицу входит атрибут методы - указатель на внутренние процедуры для выполнения стандартных операций. Методы вызываются диспетчером объектов при создании и уничтожении объекта, открытии и закрытии описателя объекта, изменении параметров защиты. Система позволяет динамически создавать новые типы объектов. В этом случае предполагается регистрация его методов у диспетчера объектов. Например, метод open вызывается всякий раз, когда создается или открывается объект и создается его новый описатель.

Описатели объектов

Создание новых объектов, или открытие по имени уже существующих, приложение может осуществить при помощи Win32-функций, таких, как CreateFile, CreateSemaphore, OpenSemaphore и т.д. Это библиотечные процедуры, за которыми стоят сервисы Windows и методы объектов. В случае успешного выполнения создается 64-битный описатель в таблице описателей процесса в памяти ядра.

Из 64-х разрядов описателя 29 разрядов используются для ссылки на блок памяти объекта ядра, 3 - для флагов, а оставшиеся 32 - в качестве маски прав доступа. Маска прав доступа формируется на этапе создания или открытия объекта, когда выполняется проверка разрешений. Таким образом, описатель объекта - принадлежность процесса, создавшего этот объект. По умолчанию он не может быть передан другому процессу. Тем не менее, система предоставляет возможность дублирования описателя и передачи его другому процессу специальным образом (см. ниже раздел "Совместное использование объектов" ).

Лекция 4. Разработка Win32 приложений - student2.ru

Рис. 4.3. Объекты и их описатели

Реестр

В составе windows есть утилита regedit.exe. Описание работы с реестром http://www.oszone.net/6176 http://comp0.ru/reestr.html .

Операционная система управляет большим объемом информации, необходимой для ее загрузки и конфигурирования. В ранних версиях Windows эта информация содержалась в различных текстовых файлах с расширением .ini (Win.ini, System.ini и т.д.). Начиная с Windows 95, эта информация хранится в централизованной общесистемной базе данных, называемой реестром (registry). Для просмотра и модификации данных реестра имеются штатные утилиты (regedit или редактор реестра, например), однако рекомендуется это делать с помощью административной консоли управления.

Лекция 4. Разработка Win32 приложений - student2.ru

Рис. 4.7. Общий вид редактора реестра

Данные реестра хранятся в виде иерархической древовидной структуры. Каждый узел или каталог называется разделом или ключом (keys), а названия каталогов верхнего уровня начинаются со строки HKEY. Каждый раздел может содержать подраздел (subkey). Записи нижней части структуры называются параметрами (values), данные которых строго типизированы, см. MSDN.

Реестр содержит шесть корневых разделов:

1 HKEY_CURRENT_USER,

2 HKEY__USERS,

3 HKEY_CLASSES_ROOT,

4 HKEY_LOCAL_MACHINE,

5 HKEY_PERFORMANCE_DATA

6 HKEY_CURRENT_CONFIG.

Наиболее важным, вероятно, является раздел HKEY_LOCAL_MACHINE. В нем содержится вся информация о локальной системе.

Пространство имен реестра интегрировано с общим пространством имен ядра. Оно является третьим пространством имен в системе наряду с пространствами имен объектов и файлов. Для интеграции система поддерживает объект "раздел реестра" (key есть среди типов объектов).

Реестр хранится на диске в виде набора файлов, называемых "кустами" или "ульями" (hives). Большинство из них находится в каталоге \Systemroot\System32\Config. Большое значение уделяется повышению надежности хранения. В частности, система ведет протоколы модификации кустов (при помощи так называемых регистрационных кустов, log hives), которые обеспечивают гарантированную возможность восстановления постоянных кустов реестра. Для еще большей защиты целостности на диске поддерживаются зеркальные копии критически важных кустов. Структура кустов подробно описана в [6], а их описатели можно просмотреть с помощью утилиты Handleex.exe с сайта http://www.sysinternals.com.

Данные реестра полностью доступны через Win32 API. Существуют вызовы для про

Наши рекомендации