Поделиться через


Использование процедур TmXxx

В большинстве подпрограмм 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 или ObDereferObject.

    • Используйте ObDereferenceObjectDeferDelete , если компонент или любой другой компонент в стеке драйверов содержит любые системные блокировки, такие как блокировки спина, объекты мьютексов или быстрые мьютексы.

    • Вы можете использовать ObDereferenceObject , если уверены, что ни в каких компонентах стека драйверов нет системных блокировок.

    Взаимоблокировки могут возникать, если компонент вызывает ObDereferenceObject при удержании блокировок, так как KTM также может удерживать блокировки для пространства имен объекта. Кроме того, компонент может вызывать TmGetTransactionId , чтобы быстрее получить идентификатор транзакции, чем вызов ZwQueryInformationTransaction.

  • У вас должна быть возможность, которую не предоставляет подпрограмма ZwXxx .

    В частности, диспетчер ресурсов может вызывать следующие подпрограммы:

    • TmEnableCallbacks для включения асинхронной доставки уведомлений с помощью процедуры обратного вызова.
    • TmReferenceEnlistmentKey и TmDereferenceEnlistmentKey для увеличения или уменьшения числа ссылок ключа объекта зачисления.
    • TmRequestOutcomeEnlistment для запроса немедленного уведомления о фиксации или откате для зачисления.
    • TmIsTransactionActive , чтобы определить, находится ли транзакция в активном состоянии.