Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание объектов ядра






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

HANDLE CreateFile(

LPCTSTR lpFileName, // file name

DWORD dwDesiredAccess, // access mode

DWORD dwShareMode, // share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD

DWORD dwCreationDisposition, // how to create

DWORD dwFlagsAndAttributes, // file attributes

HANDLE hTemplateFile // handle to template file

);

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD

LONG lInitialCount, // initial count

LONG lMaximumCount, // maximum count

LPCTSTR lpName // object name

);

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

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

Закрытие объектов ядра

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

BOOL CloseHandle(

HANDLE hObject // handle to object

);

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

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

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.