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 조합입니다.
기 | 의미 |
---|---|
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 |