다음을 통해 공유


TmXxx 루틴 사용

대부분의 KTM 루틴은 ZwXxx의 명명 형식을 사용합니다. 이러한 루틴은 핸들 기반입니다. 즉, 입력 또는 출력 매개 변수 중 하나 이상이 KTM 개체에 대한 핸들입니다.

또한 KTM은 TmXxx의 명명 형식을 사용하는 더 적은 수의 루틴을 제공합니다. 이러한 루틴은 포인터 기반입니다. 해당 입력 또는 출력 매개 변수 중 하나 이상이 KTM 개체에 대한 포인터입니다.

일부 TmXxx 루틴은 ZwXxx 루틴을 복제합니다. 다른 TmXxx 루틴에는 ZwXxx 와 동등한 항목이 없습니다.

대부분의 경우 ZwXxx 루틴을 사용해야 합니다. 그러나 다음과 같은 상황에서 TmXxx 루틴을 사용해야 합니다.

  • 리소스 관리자는 핸들 대신 인리스트먼트 개체에 대한 포인터를 제공하는 ResourceManagerNotification 콜백 루틴을 사용합니다.

    인리스트먼트 개체 포인터를 인리스트먼트 개체의 TmXxx 루틴에 전달할 수 있습니다.

  • TPS(트랜잭션 처리 시스템) 구성 요소는 KTM에 대한 많은 빠른 호출을 수행하므로 시스템 성능이 너무 느려질 수 있습니다.

    이 경우 구성 요소는 ObReferenceObjectByHandle을 호출하여 각 KTM 개체 핸들을 포인터로 변환하고 포인터를 저장한 다음 포인터를 TmXxx 루틴에 전달할 수 있습니다. 이렇게 변환하면 ZwXxx 루틴이 호출 될 때마다 KTM이 각 핸들을 내부적으로 포인터로 변환할 필요가 없습니다.

    ObReferenceObectByHandle에 대한 각 호출에는 적절한 KTM 정의 플래그가 포함된 액세스 마스크가 포함되어야 합니다. 이러한 플래그는 KTM의 만들기 및 열기 루틴에 대한 참조 페이지에 설명되어 있습니다.

    구성 요소가 KTM 개체 사용을 완료하면 ObDereferenceObjectDeferDelete 또는 ObDereferenceObject를 호출하여 개체를 역참조해야 합니다.

    • 구성 요소 또는 드라이버 스택의 다른 구성 요소가 스핀 잠금, 뮤텍스 개체 또는 빠른 뮤텍스와 같은 시스템 제공 잠금을 보유하고 있는 경우 ObDereferenceObjectDeferDelete 를 사용해야 합니다.

    • 드라이버 스택의 구성 요소가 시스템 제공 잠금을 보유하지 않는 경우 ObDereferenceObject 를 사용할 수 있습니다.

    KTM이 개체 네임스페이스에 대한 잠금을 보유할 수도 있으므로 구성 요소가 잠금을 보유하는 동안 ObDereferenceObject 를 호출하는 경우 교착 상태가 발생할 수 있습니다. 또한 구성 요소는 TmGetTransactionId 를 호출하여 ZwQueryInformationTransaction을 호출하는 것보다 트랜잭션 식별자를 더 효율적으로 빠르게 가져올 수 있습니다.

  • ZwXxx 루틴에서 제공하지 않는 기능이 있어야 합니다.

    특히 리소스 관리자는 다음 루틴을 호출할 수 있습니다.