- •3. Лекция: Базовые понятия ос Windows
- •Прерывания, исключения, системные вызовы
- •Int Ox2e обработка системного сервиса
- •Приоритеты. Irql
- •Объекты ядра
- •Структура объекта. Методы объекта
- •Именование объектов. Разделяемые ресурсы
- •Прогон программы, создающей объект
- •Совместное использование объектов
- •Заключение
Именование объектов. Разделяемые ресурсы
Многие объекты в системе имеют имена. Именование объектов удобно для учета объектов и поиска нужного объекта. Кроме того, знание имени объекта может быть использовано процессом для получения к нему доступа (совместное использование ресурсов). Пространство имен объектов по аналогии с пространствами имен реестра и файлов организовано в виде древовидной иерархической системы. В качестве нетерминальной вершины дерева используется объект - "каталог объектов". Каталог включает информацию, необходимую для трансляции имен объектов в указатели на сами объекты. Вследствие необходимости выполнения навигации по каталогам ссылка на объект по имени работает существенно дольше, чем по описателю.
"Увидеть" пространство имен можно только при помощи специальных инструментальных средств, например, с помощью утилиты winobj, входящей в состав MS Platform SDK. Другую версию этой утилиты можно бесплатно получить на сайте www.sysinternals.com.

Рис. 4.4. Окно утилиты winobj
Прогон программы, создающей объект
В качестве самостоятельного упражнения рекомендуется осуществить прогон программы, создающей один или несколько объектов, появление которых можно проконтролировать с помощью утилиты winobj. Примером такой программы может служить программа отображения файла в память.
#include <windows.h>
#include <stdio.h>
void main(void)
{
HANDLE hMapFile;
HANDLE hFile;
hFile = CreateFile("MyFile.txt",
GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hMapFile = CreateFileMapping(hFile, NULL,
PAGE_READWRITE, 0, 0, "MyFileObject");
getchar();
}
В результате работы этой программы файл "myfile.txt" отображается в память, при этом в каталоге объектовBaseNamedObjects создается объект "секция" с именем "MyFileObject".
Имена всех базовых объектов, таких, как мьютексы, проекции файла в память, семафоры хранятся в одном каталоге BaseNamedObjects. Поэтому они не должны совпадать даже у объектов разных типов. Избрание одного и того же имени для разных объектов приведет к ошибке. Это свойство можно использовать для предотвращения запуска нескольких экземпляров приложения, в котором создается именованный объект.
Именование допускают не все объекты ядра. Обычно функция, создающая именованный объект, имеет в качестве параметра имя объекта. Например, функцияCreateMutex создает именованный объект.
HANDLE CreateMutex( PSECURITY_ATTRIBUTES psa,
BOOL bInitialOwner, PCTSTR pszName);
Последний параметр pszName и есть искомое имя (можно создать безымянный объект, если указать здесь NULL ). Между прочим, объект "открытый файл" является неименованным, и, следовательно, создающая этот объект функция CreateFile этого параметра не имеет. Собственного имени файла вполне достаточно для его идентификации и разделения, а пространство имен файлов является продолжением пространства имен объектов (см. рис. 4.5)

Рис. 4.5. Связь пространства имен объектов и пространства имен файловой системы
