Compartilhar via


Usando rotinas TmXxx

A maioria das rotinas KTM usa um formato de nomenclatura de ZwXxx. Essas rotinas são baseadas em identificador. Ou seja, pelo menos um de seus parâmetros de entrada ou saída é um identificador para um objeto KTM.

KTM também fornece um número menor de rotinas que usam um formato de nomenclatura de TmXxx. Essas rotinas são baseadas em ponteiro. Pelo menos um de seus parâmetros de entrada ou saída é um ponteiro para um objeto KTM.

Algumas rotinas TmXxx duplicam rotinas ZwXxx . Outras rotinas TmXxx não têm equivalentes ZwXxx .

Na maioria dos casos, você deve usar as rotinas do ZwXxx . Mas você deve usar rotinas TmXxx nas seguintes situações:

  • Seu gerenciador de recursos usa a rotina de retorno de chamada ResourceManagerNotification , que fornece um ponteiro para um objeto de inscrição em vez de um identificador.

    Você pode passar o ponteiro do objeto de inscrição para as rotinas TmXxx do objeto de inscrição.

  • O componente do TPS (sistema de processamento de transações) executa muitas chamadas rápidas para KTM, o que potencialmente faz com que o desempenho do sistema seja muito lento.

    Nesse caso, seu componente pode chamar ObReferenceObjectByHandle para converter cada identificador de objeto KTM em um ponteiro, salvar o ponteiro e, em seguida, passar o ponteiro para rotinas TmXxx . Essa conversão elimina a necessidade de o KTM converter cada identificador em um ponteiro internamente sempre que uma rotina ZwXxx é chamada.

    Cada chamada para ObReferenceObectByHandle deve incluir uma máscara de acesso que contenha sinalizadores apropriados definidos pelo KTM. Esses sinalizadores são descritos nas páginas de referência para as rotinas de criação e abertura do KTM.

    Quando o componente terminar de usar o objeto KTM, ele deverá desreferenciar o objeto chamando ObDereferenceObjectDeferDelete ou ObDereferenceObject.

    • Você deve usar ObDereferenceObjectDeferDelete se o componente ou qualquer outro componente na pilha de driver estiver mantendo bloqueios fornecidos pelo sistema, como bloqueios de rotação, objetos mutex ou mutexes rápidos.

    • Você pode usar ObDereferenceObject se tiver certeza de que nenhum componente na pilha de driver contém bloqueios fornecidos pelo sistema.

    Deadlocks poderão ocorrer se o componente chamar ObDereferenceObject enquanto mantém bloqueios, pois o KTM também pode estar mantendo bloqueios para o namespace do objeto. Além disso, seu componente pode chamar TmGetTransactionId para obter rapidamente o identificador de uma transação com mais eficiência do que chamar ZwQueryInformationTransaction.

  • Você deve ter uma capacidade que uma rotina ZwXxx não fornece.

    Especificamente, um gerenciador de recursos pode chamar as seguintes rotinas: