Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
FltQuerySecurityObject извлекает копию дескриптора безопасности объекта.
Синтаксис
NTSTATUS FLTAPI FltQuerySecurityObject(
[in] PFLT_INSTANCE Instance,
[in] PFILE_OBJECT FileObject,
[in] SECURITY_INFORMATION SecurityInformation,
[in, out] PSECURITY_DESCRIPTOR SecurityDescriptor,
[in] ULONG Length,
[out, optional] PULONG LengthNeeded
);
Параметры
[in] Instance
Указатель непрозрачного экземпляра для вызывающего объекта. Этот параметр является обязательным и не может быть null.
[in] FileObject
Указатель объекта файла для объекта, дескриптор безопасности которого запрашивается. Этот параметр является обязательным и не может быть null.
[in] SecurityInformation
SECURITY_INFORMATION значение. Этот параметр является обязательным и должен иметь одно из следующих значений:
| Значение SecurityInformation | Значение |
|---|---|
| OWNER_SECURITY_INFORMATION | Идентификатор владельца объекта запрашивается. Требуется READ_CONTROL доступ. |
| GROUP_SECURITY_INFORMATION | Запрашивается идентификатор основной группы объекта. Требуется READ_CONTROL доступ. |
| DACL_SECURITY_INFORMATION | Запрашивается список управления доступом (DACL) объекта. Требуется READ_CONTROL доступ. |
| SACL_SECURITY_INFORMATION | Системный ACL (SACL) объекта запрашивается. Требуется ACCESS_SYSTEM_SECURITY доступ. |
[in, out] SecurityDescriptor
Указатель на предоставленный вызывающим выходной буфер, который получает копию дескриптора безопасности для указанного объекта. Структура SECURITY_DESCRIPTOR возвращается в автономном формате. Этот параметр является необязательным и может быть null.
[in] Length
Размер в байтах буфера SecurityDescriptor.
[out, optional] LengthNeeded
Указатель на выделенную вызывающим переменную, которая получает количество байтов, необходимых для хранения дескриптора скопированной безопасности, возвращаемого в буфере, на который указывает параметр SecurityDescriptor . Этот параметр является необязательным и может быть null. Если параметр SecurityDescriptor имеет значение NULL, этот параметр получает требуемый размер буфера, когда функция возвращает STATUS_BUFFER_TOO_SMALL.
Возвращаемое значение
FltQuerySecurityObject возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS , например одно из следующих:
| Возвращаемый код | Описание |
|---|---|
| STATUS_ACCESS_DENIED | Вызывающий объект не получил необходимый доступ. Это код ошибки. |
| STATUS_BUFFER_TOO_SMALL | Буфер слишком мал, чтобы содержать дескриптор безопасности. Ни одна из сведений о безопасности не была скопирована в буфер. Требуемый размер буфера возвращается в параметре LengthNeeded. Это код ошибки. |
Замечания
Дескриптор безопасности может находиться в абсолютной или относительной форме. В самостоятельной форме все члены структуры находятся в памяти. В абсолютной форме структура содержит только указатели на его члены.
Файловая система NTFS накладывает ограничение 64 КБ на размер дескриптора безопасности, записываемого на диск для файла. (Файловая система FAT не поддерживает дескрипторы безопасности для файлов.) Таким образом, буфер размером 64 КБ, на который указывает параметр SecurityDescriptor, гарантированно будет достаточно большим для хранения возвращаемой SECURITY_DESCRIPTOR структуры.
Объект, указывающий параметр FileObject, который может представлять именованный поток данных. Дополнительные сведения об именованных потоках данных см. в FILE_STREAM_INFORMATION.
Дополнительные сведения о безопасности и управлении доступом см. в документации по пакету SDK для Microsoft Windows.
шаблон запроса Two-Step
Распространенный шаблон использования включает два вызова FltQuerySecurityObject для динамического определения требуемого размера буфера:
Шаг 1. Запрос требуемого размера буфера
Вызовите функцию с буфером NULL и нулевой длиной, чтобы получить требуемый размер буфера:
ULONG bytesNeeded;
status = FltQuerySecurityObject(
instance,
fileObj,
securityInfo,
NULL, // SecurityDescriptor - NULL to query size
0, // Length - zero since no buffer provided
&bytesNeeded); // Receives required buffer size
Этот вызов возвращает STATUS_BUFFER_TOO_SMALL и заполняет байтыNeeded с необходимым размером буфера.
Шаг 2. Выделение и извлечение дескриптора безопасности
Выделите буфер требуемого размера и снова вызовите функцию:
secDescriptor = ExAllocatePoolWithTag(PagedPool, bytesNeeded, 'cSeD');
if (secDescriptor != NULL) {
status = FltQuerySecurityObject(
instance,
fileObj,
securityInfo,
secDescriptor, // Allocated buffer
bytesNeeded, // Size from first call
NULL); // LengthNeeded - optional, can be NULL
}
Параметр LengthNeeded является необязательным и может иметь значение NULL во втором вызове, если логика повтора при сбое не требуется.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Всеобщий |
| заголовка | fltkernel.h (включая Fltkernel.h) |
| библиотеки | FltMgr.lib |
| DLL | Fltmgr.sys |
| IRQL | PASSIVE_LEVEL |