Condividi tramite


Uso delle routine TmXxx

La maggior parte delle routine KTM usa un formato di denominazione di ZwXxx. Queste routine sono basate su handle. Ovvero, almeno uno dei relativi parametri di input o output è un handle per un oggetto KTM.

KTM fornisce anche un numero minore di routine che usano un formato di denominazione TmXxx. Queste routine sono basate su puntatore. Almeno uno dei parametri di input o output è un puntatore a un oggetto KTM.

Alcune routine TmXxx duplicano routine ZwXxx . Altre routine TmXxx non hanno equivalenti ZwXxx .

Nella maggior parte dei casi, è consigliabile usare le routine ZwXxx . È tuttavia consigliabile usare le routine TmXxx nelle situazioni seguenti:

  • Gestione risorse usa la routine di callback ResourceManagerNotification , che fornisce un puntatore a un oggetto di integrazione anziché un handle.

    È possibile passare il puntatore dell'oggetto di integrazione alle routine TmXxx dell'oggetto di integrazione.

  • Il componente TPS (Transaction Processing System) esegue molte chiamate rapide a KTM, causando potenzialmente un rallentamento delle prestazioni del sistema.

    In questo caso, il componente può chiamare ObReferenceObjectByHandle per convertire ogni handle di oggetto KTM in un puntatore, salvare il puntatore e quindi passare il puntatore alle routine TmXxx . Questa conversione elimina la necessità di convertire ogni handle in un puntatore internamente ogni volta che viene chiamata una routine ZwXxx .

    Ogni chiamata a ObReferenceObectByHandle deve includere una maschera di accesso che contiene flag definiti da KTM appropriati. Questi flag sono descritti nelle pagine di riferimento per le routine di creazione e apertura di KTM.

    Al termine dell'utilizzo dell'oggetto KTM, il componente deve dereferenziare l'oggetto chiamando ObDereferenceObjectDeferDelete o ObDereferenceObject.

    • È necessario usare ObDereferenceObjectDeferDelete se il componente o qualsiasi altro componente nello stack di driver contiene eventuali blocchi forniti dal sistema, ad esempio blocchi di rotazione, oggetti mutex o mutex veloci.

    • È possibile usare ObDereferenceObject se si è certi che nessun componente nello stack di driver contenga blocchi forniti dal sistema.

    I deadlock possono verificarsi se il componente chiama ObDereferenceObject mantenendo i blocchi, perché KTM potrebbe anche contenere blocchi per lo spazio dei nomi dell'oggetto. Inoltre, il componente può chiamare TmGetTransactionId per ottenere rapidamente l'identificatore di una transazione in modo più efficiente rispetto alla chiamata di ZwQueryInformationTransaction.

  • È necessario avere una funzionalità che una routine ZwXxx non fornisce.

    In particolare, un gestore di risorse può chiamare le routine seguenti: