Verwenden von TmXxx-Routinen
Die meisten KTM-Routinen verwenden das Benennungsformat ZwXxx. Diese Routinen sind griffbasiert. Das heißt, mindestens einer der Eingabe- oder Ausgabeparameter ist ein Handle für ein KTM-Objekt.
KTM bietet auch eine kleinere Anzahl von Routinen, die ein Benennungsformat von TmXxx verwenden. Diese Routinen sind zeigerbasiert. Mindestens einer der Eingabe- oder Ausgabeparameter ist ein Zeiger auf ein KTM-Objekt.
Einige TmXxx-Routinen duplizieren ZwXxx-Routinen . Andere TmXxx-Routinen verfügen nicht über ZwXxx-Entsprechungen .
In den meisten Fällen sollten Sie die ZwXxx-Routinen verwenden. Sie sollten jedoch TmXxx-Routinen in den folgenden Situationen verwenden:
Ihr Ressourcen-Manager verwendet die ResourceManagerNotification-Rückrufroutine , die anstelle eines Handles einen Zeiger auf ein Einlistungsobjekt bereitstellt.
Sie können den Einlistungsobjektzeiger an die TmXxx-Routinen des Enlistment-Objekts übergeben.
Ihre TPS-Komponente (Transaction Processing System) führt viele schnelle Aufrufe von KTM aus, was möglicherweise zu einer zu langsamen Systemleistung führt.
In diesem Fall kann Ihre Komponente ObReferenceObjectByHandle aufrufen, um jedes KTM-Objekthandle in einen Zeiger zu konvertieren, den Zeiger zu speichern und den Zeiger dann an TmXxx-Routinen zu übergeben. Durch diese Konvertierung entfällt die Notwendigkeit, dass KTM jedes Handle jedes Mal intern in einen Zeiger konvertiert, wenn eine ZwXxx-Routine aufgerufen wird.
Jeder Aufruf von ObReferenceObectByHandle sollte eine Zugriffsmaske enthalten, die entsprechende VON KTM definierte Flags enthält. Diese Flags werden auf den Referenzseiten für die Erstellungs- und Öffnungsroutinen von KTM beschrieben.
Wenn Ihre Komponente die Verwendung des KTM-Objekts abgeschlossen hat, muss sie das Objekt dereferenzieren, indem sie entweder ObDereferenceObjectDeferDelete oder ObDereferenceObject aufruft.
Sie müssen ObDereferenceObjectDeferDelete verwenden, wenn Ihre Komponente oder eine andere Komponente in Ihrem Treiberstapel alle vom System bereitgestellten Sperren enthält, z. B. Drehsperren, Mutex-Objekte oder schnelle Mutexe.
Sie können ObDereferenceObject verwenden, wenn Sie sicher sind, dass keine Komponente auf Ihrem Treiberstapel vom System bereitgestellte Sperren enthält.
Deadlocks können auftreten, wenn Ihre Komponente ObDereferenceObject aufruft , während sie Sperren hält, da KTM möglicherweise auch Sperren für den Objektnamespace hält. Außerdem kann Ihre Komponente TmGetTransactionId aufrufen, um den Bezeichner einer Transaktion effizienter zu erhalten als ZwQueryInformationTransaction.
Sie müssen über eine Funktion verfügen, die von einer ZwXxx-Routine nicht bereitgestellt wird.
Insbesondere kann ein Ressourcen-Manager die folgenden Routinen aufrufen:
- TmEnableCallbacks , um die asynchrone Übermittlung von Benachrichtigungen durch eine Rückrufroutine zu ermöglichen.
- TmReferenceEnlistmentKey und TmDereferenceEnlistmentKey , um die Schlüsselverweisanzahl eines Enlistment-Objekts zu erhöhen oder zu verringern.
- TmRequestOutcomeEnlistment , um eine sofortige Commit- oder Rollbackbenachrichtigung für eine Registrierung anzufordern.
- TmIsTransactionActive , um zu bestimmen, ob sich eine Transaktion im aktiven Zustand befindet.