ObOpenObjectByPointer 함수(ntifs.h)
ObOpenObjectByPointer 함수는 포인터에서 참조하는 개체를 열고 개체에 대한 핸들을 반환합니다.
구문
NTSTATUS ObOpenObjectByPointer(
[in] PVOID Object,
[in] ULONG HandleAttributes,
[in, optional] PACCESS_STATE PassedAccessState,
[in] ACCESS_MASK DesiredAccess,
[in, optional] POBJECT_TYPE ObjectType,
[in] KPROCESSOR_MODE AccessMode,
[out] PHANDLE Handle
);
매개 변수
[in] Object
열 개체에 대한 포인터입니다.
[in] HandleAttributes
개체 핸들에 원하는 특성을 지정하는 플래그의 비트 마스크입니다. 호출자가 시스템 프로세스 컨텍스트에서 실행되고 있지 않으면 이러한 플래그에는 OBJ_KERNEL_HANDLE 포함되어야 합니다. 이 매개 변수는 선택 사항이며 0일 수 있습니다. 그렇지 않으면 다음 값 중 하나 이상의 OR'ed 조합입니다.
플래그 | 의미 |
---|---|
OBJ_EXCLUSIVE | 개체는 단독 액세스를 위해 열어야 합니다. 이 플래그가 설정되고 ObOpenObjectByPointer 호출이 성공하면 개체를 공유할 수 없으며 핸들을 닫을 때까지 다시 열 수 없습니다. 이 플래그는 OBJ_INHERIT 플래그와 호환되지 않습니다. 이 플래그는 파일 개체에 유효하지 않습니다. |
OBJ_FORCE_ACCESS_CHECK | 개체가 커널 모드로 열려 있는 경우에도 개체에 대한 모든 액세스 검사를 적용해야 합니다. 이 플래그를 지정하면 AccessMode 매개 변수의 값이 무시됩니다. |
OBJ_INHERIT | 핸들은 현재 프로세스의 자식 프로세스에서 상속할 수 있습니다. 이 플래그는 OBJ_EXCLUSIVE 플래그와 호환되지 않습니다. |
OBJ_KERNEL_HANDLE | 핸들은 커널 모드에서만 액세스할 수 있습니다. 호출자가 시스템 프로세스 컨텍스트에서 실행되고 있지 않은 경우 이 플래그를 지정해야 합니다. |
[in, optional] PassedAccessState
개체의 주체 컨텍스트, 부여된 액세스 형식 및 나머지 원하는 액세스 형식을 포함하는 ACCESS_STATE 구조체에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다. 디스패치 루틴 만들기에서 이 포인터는 IrpSp-Parameters.Create.SecurityContext-AccessState>>에서 찾을 수 있습니다. 여기서 IrpSp는 IRP에서 호출자의 스택 위치에 대한 포인터입니다. (자세한 내용은 IRP_MJ_CREATE 참조하세요.)
[in] DesiredAccess
개체 에 대한 원하는 액세스를 지정하는 ACCESS_MASK 값입니다. 이 매개 변수는 선택 사항이며 0일 수 있습니다.
[in, optional] ObjectType
개체 형식에 대한 포인터입니다. AccessMode 값이 KernelMode이면 이 매개 변수는 선택 사항이며 NULL일 수 있습니다. 그렇지 않으면 *ExEventObjectType, *ExSemaphoreObjectType, *IoFileObjectType, *PsThreadType, *SeTokenObjectType 또는 *CmKeyObjectType이어야 합니다.
참고
SeTokenObjectType 개체 형식은 Windows XP를 응시할 수 있으며 CmKeyObjectType 개체 형식은 Windows 7을 응시할 수 있습니다.
[in] AccessMode
액세스 검사 사용할 액세스 모드입니다. 이 매개 변수는 필수이며 UserMode 또는 KernelMode여야 합니다.
AccessMode가 KernelMode인 경우 시스템은 이전에 드라이버를 설정한 제한된 액세스와 관계없이 항상 요청된 액세스를 허용합니다(예: POB_PRE_OPERATION_CALLBACK 콜백에 대한 이전 호출에서 액세스가 제한됨).
AccessMode가 UserMode인 경우 요청된 액세스는 개체에 대해 부여된 액세스 권한과 비교됩니다.
[out] Handle
개체에 대한 핸들을 수신하는 호출자가 할당한 변수에 대한 포인터입니다.
반환 값
ObOpenObjectByPointer는 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.
반환 코드 | 설명 |
---|---|
STATUS_ACCESS_DENIED | 호출자가 개체에 대한 핸들을 여는 데 필요한 액세스 권한이 없습니다. 오류 코드입니다. |
STATUS_INSUFFICIENT_RESOURCES | ObOpenObjectByPointer 에서 풀 할당 오류가 발생했습니다. 오류 코드입니다. |
STATUS_INVALID_PARAMETER | HandleAttributes 매개 변수에 잘못된 플래그 값이 지정되었습니다. 오류 코드입니다. |
STATUS_OBJECT_TYPE_MISMATCH | Object 매개 변수가 가리키는 개체가 ObjectType 매개 변수에 지정된 형식이 아닙니다. 오류 코드입니다. |
STATUS_PRIVILEGE_NOT_HELD | 호출자에게 DesiredAccess 매개 변수에 지정된 액세스 권한이 있는 핸들을 만드는 데 필요한 권한이 없습니다. 오류 코드입니다. |
STATUS_QUOTA_EXCEEDED | 호출자는 메모리 할당량이 개체 핸들을 할당하기에 충분하지 않은 프로세스의 컨텍스트에서 실행됩니다. 오류 코드입니다. |
STATUS_UNSUCCESSFUL | 개체 핸들을 만들 수 없습니다. 오류 코드입니다. |
설명
Object 매개 변수가 파일 개체(즉, FILE_OBJECT 구조)를 가리키는 경우 파일 개체에 대해 하나 이상의 핸들을 만든 후에만 ObOpenObjectByPointer를 호출할 수 있습니다. 호출자는 Object 매개 변수가 가리키는 FILE_OBJECT 구조체의 Flags 멤버를 검사 수 있습니다. FO_HANDLE_CREATED 플래그가 설정된 경우 파일 개체에 대해 하나 이상의 핸들이 만들어졌으므로 ObOpenObjectByPointer를 호출해도 안전합니다.
ObOpenObjectByPointer를 호출하여 얻은 모든 핸들은 결국 ZwClose를 호출하여 해제되어야 합니다.
시스템 프로세스 이외의 프로세스 컨텍스트에서 실행되는 드라이버 루틴은 HandleAttributes 매개 변수에서 OBJ_KERNEL_HANDLE 플래그를 설정해야 합니다. 이렇게 하면 ObOpenObjectByPointer 에서 반환된 핸들의 사용이 커널 모드에서 실행되는 프로세스로 제한됩니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | ntifs.h(Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |