다음을 통해 공유


ObDereferenceObject 매크로(wdm.h)

ObDereferenceObject 루틴은 지정된 개체의 참조 수를 감소시키고 보존 검사를 수행합니다.

구문

void ObDereferenceObject(
  [in]  a
);

매개 변수

[in] a

개체의 본문에 대한 포인터입니다.

반환 값

없음

설명

ObDereferenceObject 는 시스템 사용을 위해 예약된 값을 반환합니다. 드라이버는 이 값을 VOID로 처리해야 합니다.

ObDereferenceObject 는 개체의 참조 수를 1씩 줄입니다. 개체가 임시로 만들어졌고(생성할 때 OBJ_PERMANENT 플래그가 지정되지 않음) 참조 수가 0에 도달하면 시스템에서 개체를 삭제할 수 있습니다.

드라이버는 참조 횟수를 0으로 줄여 만든 임시 개체를 삭제할 수 있습니다. 드라이버는 만들지 않은 개체를 삭제하려고 시도해서는 안됩니다.

개체가 지정된 OBJ_PERMANENT 개체 특성 플래그를 사용하여 만든 경우 개체는 영구적입니다. 개체 특성에 대한 자세한 내용은 InitializeObjectAttributes를 참조하세요. 영구 개체는 참조 횟수가 1로 만들어지므로 드라이버에서 역참조할 때 삭제되지 않습니다. 드라이버는 ZwMakeTemporaryObject 루틴을 사용하여 만든 영구 개체만 삭제하여 임시로 만들 수 있습니다. 다음 단계를 사용하여 만든 영구 개체를 삭제합니다.

  1. ObDereferenceObject를 호출합니다.

  2. 필요한 경우 적절한 ZwOpenXxx 또는 ZwCreateXxx 루틴을 호출하여 개체에 대한 핸들을 가져옵니다.

  3. 2단계에서 가져온 핸들을 사용하여 ZwMakeTemporaryObject 를 호출합니다.

  4. 2단계에서 가져온 핸들을 사용하여 ZwClose 를 호출합니다.

개체의 현재 스레드에 의한 즉각적인 삭제(ObDereferenceObject 사용)로 인해 교착 상태가 발생할 수 있는 경우 모든 개체, 특히 KTM(커널 트랜잭션 관리자) 개체에 대해 ObDereferenceObject 대신 ObDereferenceObjectDeferDelete를 사용합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Fltkernel.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

InitializeObjectAttributes

IoGetDeviceObjectPointer

ObDereferenceObjectDeferDelete

ZwClose

ZwMakeTemporaryObject