Share via


使用 TmXxx 常式

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

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

某些TmXxx常式重複ZwXxx常式。 其他TmXxx常式沒有ZwXxx對等專案。

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

  • 您的資源管理員會使用 ResourceManagerNotification 回呼常式,其提供登錄物件的指標,而不是控制碼。

    您可以將登錄物件指標傳遞至登錄物件的TmXxx常式。

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

    在此情況下,您的元件可以呼叫ObReferenceObjectByHandle,將每個 KTM 物件控制碼轉換成指標、儲存指標,然後將指標傳遞至TmXxx常式。 此轉換不需要 KTM 在每次呼叫ZwXxx常式時,于內部將每個控制碼轉換成指標。

    每個對 ObReferenceObectByHandle的呼叫都應該包含包含適當 KTM 定義旗標的存取遮罩。 這些旗標會在 KTM 的建立和開啟常式的參考頁面上描述。

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

    • 如果您的元件或任何其他元件位於驅動程式堆疊中,您必須使用 ObDereferenceObjectDeferDelete ,並保留任何系統提供的鎖定,例如微調鎖定、mutex 物件或快速 Mutex。

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

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

  • 您必須具備ZwXxx常式未提供的功能。

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