![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Создание объектов ядра
Для создания объекта ядра необходимо использовать одну из специальных функций (специфичных для каждого типа объекта). Вот некоторые функции, с помощью которых это можно сделать: 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 ); Получив дескриптор объекта, эта функция удаляет соответствующую запись в таблице дескрипторов и уменьшает на единицу счетчик использования объекта ядра. В случае если счетчик стал равен нулю, уничтожается и сам объект. После вызова этой функции процесс теряет доступ к объекту ядра (так как удаляется запись в таблице дескрипторов) вне зависимости от того, был ли удален сам объект или нет. Если программист забыл закрыть дескриптор объекта после его использования, то об этом позаботиться система – при завершении процесса все оставшиеся открытыми объекты закрываются операционной системой. Однако не стоит рассчитывать на это свойство – это может привести к пустой трате системных ресурсов, пока программа еще работает, не записанным в файл данными и другим отрицательным последствиям.
|