Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Большинство подпрограмм KTM используют формат именования ZwXxx. Эти подпрограммы основаны на дескрипторе. То есть хотя бы один из входных или выходных параметров является дескриптором объекта KTM.
KTM также предоставляет меньшее количество подпрограмм, использующих формат именования TmXxx. Эти подпрограммы основаны на указателях. По крайней мере один из входных или выходных параметров является указателем на объект KTM.
Некоторые подпрограммы TmXxx повторяют процедуры ZwXxx. Другие подпрограммы TmXxx не имеют эквивалентов ZwXxx.
В большинстве случаев следует использовать подпрограммы ZwXxx. Но в следующих ситуациях следует использовать TmXxx подпрограмм:
В диспетчере ресурсов используется подпрограмма обратного вызова ResourceManagerNotification, которая предоставляет указатель на объект записи вместо дескриптора.
Вы можете передать указатель объекта перечисления к подпрограммам объекта перечисления TmXxx.
Компонент системы обработки транзакций (TPS) выполняет множество быстрых вызовов KTM, что потенциально приводит к тому, что производительность системы будет слишком медленной.
В этом случае компонент может вызывать ObReferenceObjectByHandle, чтобы преобразовать каждый дескриптор KTM в указатель, сохранить указатель, а затем передать указатель на подпрограммы TmXxx. Это преобразование устраняет необходимость для KTM преобразовывать каждый дескриптор в указатель при каждом вызове процедуры ZwXxx.
Каждый вызов ObReferenceObectByHandle должен включать маску доступа, которая содержит соответствующие флаги, определенные KTM. Эти флаги описаны на справочных страницах для создания и открытия подпрограмм KTM.
Когда компонент завершит работу с объектом KTM, он должен разыменовать объект, вызвав ObDereferenceObjectDeferDelete или ObDereferenceObject.
Необходимо использовать ObDereferenceObjectDeferDelete, если ваш компонент или любой другой компонент в стеке драйверов удерживает любые предоставляемые системой блокировки, такие как спиновые блокировки, объекты мьютекса или быстрые мьютексы.
Вы можете использовать ObDereferenceObject, если вы уверены, что ни какой компонент в стеке драйверов не содержит системные блокировки.
Взаимоблокировки могут возникать, если компонент вызывает ObDereferenceObject, удерживая блокировки, так как KTM также может удерживать блокировки для пространства имен объекта. Кроме того, компонент может вызывать TmGetTransactionId для быстрого получения идентификатора транзакции, чем вызов ZwQueryInformationTransaction.
У вас должна быть функция, которая не включена в подпрограмму ZwXxx.
В частности, диспетчер ресурсов может вызывать следующие подпрограммы:
- TmEnableCallbacks, чтобы включить асинхронную доставку уведомлений с помощью функции обратного вызова.
- TmReferenceEnlistmentKey и TmDereferenceEnlistmentKey для увеличения или уменьшения счетчика ссылок объекта регистрации.
- TmRequestOutcomeEnlistment запросить немедленное уведомление о фиксации или откате для перечисления.
- TmIsTransactionActive, чтобы определить, находится ли транзакция в активном состоянии.