мы не имеем прямой доступ к объектам ядра, все делается через специальные функции
начиная с Win 2000 объект ядра можно защитить security descriptor'ом, для этого почти все фнкции создающие объект ядра принимают указатель на структуру SECURITY_ATTRIBUTES.
так же есть GDI объекты, основное отличие от объектов ядра - отсутствие нужды в SECURITY_ATTRIBUTES (шрифты, значки, меню, окна, курсоры, кисти)
таблица описателей
создается при инициализации процесса, содержит ТОЛЬКО объекты ядра
основная структура:
индекс
указатель на блок памяти объекта ядра
маска доступа (DWORD)
флаги (DWORD)
поначалу пустая, при создании объекта ядра, находит пустую строчку в таблице и пишет туда, возвращая HANDLE
HANDLE - индекс в таблице описателей (или байтовое смещение)
на каждом объекте ядра есть счетчик пользователей, CloseHandle как раз его уменьшает на 1, если он 0 - объект удаляется.
совместное использование
типы объектов
проекции файлов
почтовые ящики и именованные каналы
мьютексы/семафоры
способ 1 наследование
если между процессами связь отец/сын
помечаем флаг bInheritHandle в SecurityAttributes как TRUE
если потом в CreateProcess bInheritHandles пометить как TRUE, то наследуемые объекты будут записаны после инициализации перед запуском в ТЕ ЖЕ индексы, что и у родителя (чтобы описатели оставались валидными) и увеличивает у таких объектов кол-во пользователей на 1
созданные после createProcess наследуемые объекты не будут занесены в таблицу ребенка
время МЕГАКОСТЫЛЕЙ: дочерний процесс них*яшеньки не представляет о том, что он что-то отнаследовал, потому обычно сами значения описателей ему передают черзе командную строку
SetHandleInformation - модифицирует флаги описателя, но с этим надо быть осторожным - ребенок может тихонько изменить флаги нашкодив тем самым родителю
способ 2 именование
все объекты с pszName (mutex semaphore event timer job filemapping)
в конструкторе для именования надо передать не NULL в pszName
длина имени до 260 символов (WAT!?!?!)
правила именования Microsoft не разглашает
еще одно, флаги и параметры объекты сетятся при создании (при втором вызове либо возвращается существующий, либо NULL если типы разные или флаги конфликтуют)
также нередко можно использовать Open функцию
есть некий TerminalServer который пытается разграничить пространства имен, чтобы он ничегон е испортил надо к имя начинать Global\ или чтобы им воспользоваться надо имя начинать с Local\
способ 3 DuplicateHandle
просто из handle а процесса x скопируй объект в handle b процесса y