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 루틴에서 제공하지 않는 기능이 있어야 합니다.
특히 리소스 관리자는 다음 루틴을 호출할 수 있습니다.
- TmEnableCallbacks - 콜백 루틴으로 알림을 비동기식으로 배달할 수 있도록 합니다.
- TmReferenceEnlistmentKey 및 TmDereferenceEnlistmentKey 를 사용하여 인리스트먼트 개체의 키 참조 수를 증가 또는 감소합니다.
- TmRequestOutcomeEnlistment - 인리스트먼트에 대한 즉각적인 커밋 또는 롤백 알림을 요청합니다.
- TmIsTransactionActive - 트랜잭션이 활성 상태인지 여부를 확인합니다.