Наверх Системное программирование
Предыдущий раздел Оглавление Следующий раздел

2.1. ИНТЕРФЕЙС ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ WIN32

Интерфейсом прикладного программирования Win32 или, по-другому, Win32 API, называют вызовы функций Win32. Полная документация по данным интерфейса доступна для разработчиков на официальных информационных ресурсах компании Microsoft. Win32 API получил свою реализацию в виде библиотек функций. Функции Win32 API представляют собой системные вызовы, которые либо обертывают системные вызовы NT, либо выполняют собственные задачи в пользовательском режиме. Большая часть функциональности недоступных для сторонних разработчиков собственных интерфейсов прикладного программирования NT все же доступна посредством вызовов соответствующих функций Win32 API. Причем существующие функции Win32 API редко меняются при выходе новых версий Windows, но библиотеки пополняются множеством новых функций.

В табл. 2.1 находится информация о соответствии различных вызовов Win32 API и собственных вызовов NT API. Для отображения параметров Win32 в NT уровень Win32 должен соответствующим образом манипулировать данными параметрами. Например, при создании процессов и потоков посредством системных вызовов Win32 API необходимо уведомить процесс подсистемы csrss.exe о том, что у него для наблюдения появились новые процессы и потоки.

Возможны такие ситуации, при которых в качестве параметров вызовов Win32 будут выступать пути или маршруты, а для соответствующих вызовов NT необходимы дескрипторы (описатели). Именно поэтому вызовы Win32 API должны сначала открыть файлы, получить дескриптор, передать его соответствующему вызову NT, а в конце работы с файлами закрыть описатель. Кроме того, процедуры-оболочки заняты также трансляцией кода ANSI в Unicode. Функции Win32, использующие в качестве параметров строки, по факту являются двумя интерфейсами прикладного программирования (например, MapViewOfFileW и MapViewOfFileA) и различаются типом строки, которую обрабатывают.

2.1. Примеры вызовов Win32 API и тех вызовов NT API, для которых они являются оболочками
Вызов Win32 Собственный вызов NT API
CreateProcess NtCreateProcess
CreateThread NtCreateThread
SuspendThread NtSuspendThread
CreateSemaphore NtCreateSemaphore
ReadFile NtReadFile
DeleteFile NtSetInformationFile
CreateFileMapping NtCreateSection
VirtualAlloc NtAllocateVirtualMemory
MapViewOfFile NtMapViewOfSection
DuplicateHandle NtDuplicateObject
CloseHandle NtClose

Для поддержки работы приложений, разрядность которых не совпадает с разрядностью целевой операционной системы, в Windows есть две специальные среды выполнения, называемые Windows-on-Windows (WOW). Например, WOW64 позволяет работать на 64-разрядных системах 32-битным приложениям.

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

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

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

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

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

В Win32 API для управления данными в файлах есть также и другие различные средства. Для файлов кроме основного потока данных можно создать и дополнительные потоки, которые будут храниться в файловой системе NTFS. Файлы также могут быть зашифрованы или сжаты, то есть быть представленными в виде разреженного потока байтов. Может быть произведена организация в массивы RAID некоторых томов файловой системы. Файловая система NTFS поддерживает для каждого тома журнал, из которого можно получить информацию о модификации файлов, деревьев каталогов.

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

Win32 API содержит также вызовы, связанные с безопасностью. Для каждого потока создается маркер (token), предоставляющий данные об идентификаторе, привилегиях потока. Для каждого объекта системы может создаваться список управления доступом (Access Control List (ACL)), предоставляющий информацию о категориях пользователей, которые могут обращаться к объекту, типах операций, применяемых к объекту, и другую подобную информацию. При таком подходе обеспечивается тонкая настройка безопасности, когда за каждым конкретным пользователем закрепляются конкретные права на доступ к любому объекту. В модель безопасности выполняющиеся в системе приложения могут добавлять новые правила, таким образом расширяя данную модель.

Только часть пространства имен NT доступна для интерфейсов Win32 API. Например, доступ к файлам в Win32 API производится через буквенные обозначения дисков, а для обращения к именованным объектам режима ядра (таким, как объекты синхронизации, совместно используемая память, порты, таймеры или имена устройств) используется каталог NT \BaseNamedObjects.

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

Предыдущий раздел Оглавление Следующий раздел