OBJECT_ATTRIBUTES 구조체(ntdef.h)

OBJECT_ATTRIBUTES 구조체는 개체 및/또는 개체에 대한 핸들을 반환하는 루틴으로 개체 또는 개체 핸들에 적용할 수 있는 특성을 지정합니다.

구문

typedef struct _OBJECT_ATTRIBUTES {
  ULONG           Length;
  HANDLE          RootDirectory;
  PUNICODE_STRING ObjectName;
  ULONG           Attributes;
  PVOID           SecurityDescriptor;
  PVOID           SecurityQualityOfService;
} OBJECT_ATTRIBUTES;

멤버

Length

이 구조에 포함된 데이터의 바이트 수입니다. InitializeObjectAttributes 매크로는 이 멤버를 sizeof(OBJECT_ATTRIBUTES)로 설정합니다.

RootDirectory

ObjectName 멤버가 지정한 경로 이름에 대한 루트 개체 디렉터리에 대한 선택적 핸들입니다. RootDirectory가 이면 ObjectNameNULL대상 개체의 전체 경로를 포함하는 정규화된 개체 이름을 가리킬 수 있습니다. RootDirectory가 비이NULLObjectNameRootDirectory 디렉터리를 기준으로 개체 이름을 지정합니다. RootDirectory 핸들은 개체 관리자 네임스페이스의 파일 시스템 디렉터리 또는 개체 디렉터리를 참조할 수 있습니다.

ObjectName

핸들을 열 개체의 이름을 포함하는 유니코드 문자열 에 대한 포인터입니다. 정규화된 개체 이름이거나 RootDirectory 멤버가 지정한 디렉터리에 대한 상대 경로 이름이어야 합니다.

Attributes

개체 핸들 특성을 지정하는 플래그의 비트 마스크입니다. 이 멤버는 다음 표에 하나 이상의 플래그를 포함할 수 있습니다.

플래그 의미
OBJ_INHERIT 이 핸들은 현재 프로세스의 자식 프로세스에서 상속할 수 있습니다.
OBJ_PERMANENT 이 플래그는 개체 관리자 내에서 명명된 개체에만 적용됩니다. 기본적으로 이러한 개체는 열려 있는 모든 핸들이 닫혀 있을 때 삭제됩니다. 이 플래그를 지정하면 열려 있는 모든 핸들이 닫혀 있으면 개체가 삭제되지 않습니다. 드라이버는 ZwMakeTemporaryObject 루틴을 사용하여 영구 개체를 영구적이지 않은 개체로 만들 수 있습니다.
OBJ_EXCLUSIVE 이 플래그가 설정되고 OBJECT_ATTRIBUTES 구조체가 개체를 만드는 루틴에 전달되면 개체에 단독으로 액세스할 수 있습니다. 즉, 프로세스가 개체에 대한 이러한 핸들을 열면 다른 프로세스에서 이 개체에 대한 핸들을 열 수 없습니다.

이 플래그가 설정되고 OBJECT_ATTRIBUTES 구조체가 개체 핸들을 만드는 루틴에 전달되는 경우 호출자는 핸들이 만들어진 프로세스 컨텍스트에 대한 개체에 대한 단독 액세스를 요청합니다. 이 요청은 개체를 만들 때 OBJ_EXCLUSIVE 플래그가 설정된 경우에만 부여할 수 있습니다.
OBJ_CASE_INSENSITIVE 이 플래그를 지정하면 ObjectName 멤버가 가리키는 이름을 기존 개체의 이름과 일치시킬 때 대/소문자를 구분하지 않는 비교가 사용됩니다. 그렇지 않으면 기본 시스템 설정을 사용하여 개체 이름을 비교합니다.
OBJ_OPENIF 개체 핸들을 사용하여 개체를 만드는 루틴에 이 플래그를 지정하고 해당 개체가 이미 있는 경우 루틴에서 해당 개체를 열어야 합니다. 그렇지 않으면 개체를 만드는 루틴은 STATUS_OBJECT_NAME_COLLISION NTSTATUS 코드를 반환합니다.
OBJ_OPENLINK 이 플래그가 설정된 개체 핸들이 개체를 여는 루틴에 전달되고 개체가 기호 링크 개체인 경우 루틴은 기호 링크가 참조하는 개체(기본 동작)가 아닌 기호 링크 개체 자체를 열어야 합니다.
OBJ_KERNEL_HANDLE 핸들은 시스템 프로세스 컨텍스트에서 생성되며 커널 모드에서만 액세스할 수 있습니다.
OBJ_FORCE_ACCESS_CHECK 핸들을 여는 루틴은 핸들이 커널 모드로 열려 있는 경우에도 개체에 대한 모든 액세스 검사를 적용해야 합니다.
OBJ_DONT_REPARSE 이 플래그가 설정되면 연결된 개체의 이름을 구문 분석할 때 재분석 지점이 수행되지 않습니다. 재분석이 발생하면 시도가 실패하고 STATUS_REPARSE_POINT_ENCOUNTERED 결과를 반환합니다. 보안 시나리오에서 개체의 경로에 재분석 지점이 있는지 확인하는 데 사용할 수 있습니다.
OBJ_IGNORE_IMPERSONATED_DEVICEMAP 디바이스 맵은 시스템의 DOS 디바이스 이름과 디바이스 간의 매핑이며 DOS 이름을 확인할 때 사용됩니다. 시스템의 각 사용자에 대해 별도의 디바이스 맵이 있으며 사용자는 자신의 디바이스 맵을 관리할 수 있습니다. 일반적으로 가장하는 동안 가장된 사용자의 디바이스 맵이 사용됩니다. 그러나 이 플래그가 설정되면 프로세스 사용자의 디바이스 맵이 대신 사용됩니다.
OBJ_VALID_ATTRIBUTES 예약되어 있습니다.

SecurityDescriptor

개체를 만들 때 개체에 대한 보안 설명자(SECURITY_DESCRIPTOR)를 지정합니다. SecurityDescriptor가 이NULL면 개체는 기본 보안 설정을 받습니다. 새 개체는 DACL을 참조하세요.

SecurityQualityOfService

개체를 만들 때 적용할 서비스 품질(선택 사항)입니다. 보안 가장 수준 및 컨텍스트 추적 모드(동적 또는 정적)를 나타내는 데 사용됩니다. 현재 InitializeObjectAttributes 매크로는 이 멤버를 로 NULL설정합니다.

설명

InitializeObjectAttributes 매크로를 사용하여 OBJECT_ATTRIBUTES 구조체의 멤버를 초기화합니다. InitializeObjectAttributes는SecurityQualityOfService 멤버NULL를 로 초기화합니다. 비값NULL 을 지정해야 하는 경우 초기화 후 SecurityQualityOfService 멤버를 설정합니다.

이 구조체에 포함된 특성을 개체 또는 개체 핸들에 적용하려면 개체에 액세스하거나 ZwCreateFile 또는 ZwCreateDirectoryObject와 같은 개체 핸들을 반환하는 루틴에 이 구조체에 대한 포인터를 전달합니다.

이 구조체의 모든 멤버는 읽기 전용입니다. 이 구조체의 멤버가 포인터인 경우 이 멤버가 가리키는 개체도 읽기 전용입니다. 읽기 전용 멤버 및 개체를 사용하여 관련 정보를 가져올 수 있지만 수정해서는 안 됩니다. 이 구조체의 멤버를 설정하려면 InitializeObjectAttributes 매크로를 사용합니다.

시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 InitializeObjectAttributes 매크로를 사용하여 특성 멤버에 대한 OBJ_KERNEL_HANDLE 플래그를 설정해야 합니다. 이렇게 하면 해당 개체에 대해 열린 핸들의 사용이 커널 모드에서만 실행되는 프로세스로 제한됩니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다.

요구 사항

요구 사항
헤더 ntdef.h(D3dkmthk.h, Ntdef.h, Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h 포함)

추가 정보

FltCreateCommunicationPort

FltCreateFile

FltCreateFileEx

FltCreateFileEx2

InitializeObjectAttributes

IoCreateFile

IoCreateFileEx

IoCreateFileSpecifyDeviceObjectHint

ZwCreateDirectoryObject

ZwCreateFile

새 개체에 대한 DACL