Заметки по WinAPI

  • типы: access token, file objects, file-mapping objects, I/O completion port objects, job objects, mailslot objects, mutex objects, pipe objects, process objects, semaphore objects, thread objects, waitable timer objects
  • мы не имеем прямой доступ к объектам ядра, все делается через специальные функции
  • начиная с 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