共用方式為


使用TmXxx例程

大部分的 KTM 例程都會使用 ZwXxx 的命名格式。 這些例程是以句柄為基礎。 也就是說,至少有一個輸入或輸出參數是 KTM 物件的控制碼。

KTM 也提供較小的例程,使用 TmXxx 的命名格式。 這些例程是以指標為基礎。 至少有一個輸入或輸出參數是 KTM 物件的指標。

有些 TmXxx 例程會重複 ZwXxx 例程。 其他 TmXxx 例程沒有 ZwXxx 對應。

在大部分情況下,您應該使用 ZwXxx 例程。 但在下列情況下,您應該使用 TmXxx 例程:

  • 您的資源管理員會使用 ResourceManagerNotification 回呼例程,該例程會提供登記物件的指標,而不是句柄。

    您可以將登記物件指標傳遞至登記物件的 TmXxx 例程。

  • 您的事務處理系統 (TPS) 元件會對 KTM 執行許多快速呼叫,這可能會導致系統效能太慢。

    在此情況下,您的元件可以呼叫 ObReferenceObjectByHandle ,將每個 KTM 物件句柄轉換成指標、儲存指標,然後將指標傳遞至 TmXxx 例程。 此轉換使得 KTM 每次呼叫 ZwXxx 例程時,不必在內部將每個控制代碼轉換為指標。

    ObReferenceObjectByHandle 的每次呼叫中應包含一個包含適當由 KTM 定義的旗標的存取遮罩。 這些旗標會在 KTM 建立和開啟例程的參考頁面上描述。

    當您的元件使用 KTM 物件完成時,它必須藉由呼叫 ObDereferenceObjectDeferDeleteObDereferenceObject 來取值物件。

    • 如果您的元件或驅動程式堆疊中的任何其他元件持有任何系統提供的鎖定,例如自旋鎖、Mutex 物件或快速互斥鎖,您必須使用ObDereferenceObjectDeferDelete

    • 如果您確定驅動程式堆疊上沒有任何元件保留系統提供的鎖定,則可以使用 ObDereferenceObject

    如果您的元件持有鎖時呼叫 ObDereferenceObject,可能會發生死結,因為 KTM 可能也會持有物件命名空間的鎖。 此外,您的元件可以呼叫 TmGetTransactionId ,以比呼叫 ZwQueryInformationTransaction 更有效率地快速取得交易的標識符。

  • 您必須具備 ZwXxx 例程未提供的功能。

    具體而言,資源管理員可以呼叫下列例程: