Маска доступа
Функция маски доступа заключается в том, чтобы описать права доступа в компактной форме. Чтобы упростить управление доступом, маска доступа содержит набор четырех битов, универсальные права, которые преобразуются в набор более подробных прав с помощью функции RtlMapGenericMask.
На следующем рисунке показана маска доступа.
Универсальные права:
GENERIC_READ — право на чтение информации, поддерживаемой объектом.
GENERIC_WRITE — право на запись информации, поддерживаемой объектом.
GENERIC_EXECUTE — право на выполнение или альтернативный просмотр объекта.
GENERIC_ALL — право на чтение, запись и выполнение объекта.
Эти права можно объединить. Например, можно запросить GENERIC_READ и GENERIC_WRITE. Результирующий сопоставление требует объединения прав, необходимых для каждого универсального права. Эта парадигма имитирует биты доступа UNIX "rwx", которые используются для управления доступом к ресурсам UNIX. Универсальные права в маске доступа упрощают разработку приложений в Windows, так как эти права маскировки различных прав безопасности для различных типов объектов.
Следующий набор стандартных прав применим ко всем типам объектов:
DELETE — право удалить конкретный объект.
READ_CONTROL — право считывать сведения об элементе управления (безопасности) для объекта.
WRITE_DAC — право изменять сведения об элементе управления (безопасности) для объекта.
WRITE_OWNER — право на изменение идентификатора безопасности владельца объекта. Помните, что владельцы всегда имеют право изменять объект.
SYNCHRONIZE — право ждать заданного объекта (предположим, что ожидание является допустимым понятием для объекта).
Ниже 16 бит маски доступа представляют определенные права. Смысл этих конкретных прав является уникальным для данного объекта. Для файловой системы основными интересами являются конкретные права для объектов файлов. Для объектов файлов определенные права обычно интерпретируются по-разному в зависимости от того, представляет ли файл или каталог объект файла. Для файлов обычное толкование:
FILE_READ_DATA — право на чтение данных из данного файла.
FILE_WRITE_DATA — право на запись данных в указанный файл (в пределах существующего диапазона файла).
FILE_APPEND_DATA — право расширения заданного файла.
FILE_READ_EA — право на чтение расширенных атрибутов файла.
FILE_WRITE_EA — право изменять расширенные атрибуты файла.
FILE_EXECUTE — право локально выполнить указанный файл. Для выполнения файла, хранящегося в удаленном ресурсе, требуется разрешение на чтение, так как файл считывается с сервера, но выполняется на клиенте.
FILE_READ_ATTRIBUTES — право на чтение сведений о атрибутах файла.
FILE_WRITE_ATTRIBUTES — право изменять сведения о атрибутах файла.
Для каталогов используются те же битовые значения, но их интерпретация отличается в некоторых из следующих случаев:
FILE_LIST_DIRECTORY — право на перечисление содержимого каталога.
FILE_ADD_FILE — право на создание нового файла в каталоге.
FILE_ADD_SUBDIRECTORY — право на создание нового каталога (подкаталога) в каталоге.
FILE_READ_EA — право на чтение расширенных атрибутов данного каталога.
FILE_WRITE_EA — право на запись расширенных атрибутов данного каталога.
FILE_TRAVERSE — право доступа к объектам в каталоге. Право доступа FILE_TRAVERSE отличается от права доступа FILE_LIST_DIRECTORY. Хранение права доступа FILE_LIST_DIRECTORY позволяет сущности получить список содержимого каталога, а право доступа FILE_TRAVERSE дает сущности право доступа к объекту. Вызывающий объект без права доступа FILE_LIST_DIRECTORY может открыть файл, который он уже знал, что он уже существовал, но не сможет получить список содержимого каталога.
FILE_DELETE_CHILD — право на удаление файла или каталога в текущем каталоге.
FILE_READ_ATTRIBUTES — право на чтение сведений о атрибутах каталога.
FILE_WRITE_ATTRIBUTES — право изменять сведения о атрибутах каталога.
Диспетчер операций ввода-вывода определяет фактическое сопоставление универсальных прав на стандартные и определенные права для файловых объектов. Файловая система может получить это сопоставление с помощью IoGetFileObjectGenericMapping. Как правило, диспетчер ввода-вывода выполняет это сопоставление во время IRP_MJ_CREATE обработки перед вызовом файловой системы. Но проверка безопасности файловой системы для определенных операций (например, специализированных операций FSCTL) может потребоваться выполнить это сопоставление.