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: