物件控制碼

驅動程式和使用者模式元件會透過 控制碼存取大部分的系統定義物件。 控制碼是以 HANDLE 不透明資料類型表示。 (請注意,控制碼不會用來存取裝置物件或驅動程式物件。)

對於大部分的物件類型,建立或開啟物件的核心模式常式會提供呼叫端的控制碼。 呼叫端接著會在 物件的後續作業中使用該控制碼。

以下是驅動程式通常會使用的物件類型清單,以及提供該類型物件的控制碼的常式。

物件型別 對應的建立/開啟常式

檔案

IoCreateFileZwCreateFileZwOpenFile

登錄機碼

IoOpenDeviceInterfaceRegistryKeyIoOpenDeviceRegistryKeyZwCreateKeyZwOpenKey

執行緒

PsCreateSystemThread

事件

IoCreateSynchronizationEventIoCreateNotificationEvent

符號連結

ZwOpenSymbolicLinkObject

目錄物件

ZwCreateDirectoryObject

區段物件

ZwOpenSection

當驅動程式不再需要存取 物件時,它會呼叫 ZwClose 常式來關閉控制碼。 這適用于上表中所列的所有物件類型。

大部分提供控制碼的常式會採用 OBJECT_ATTRIBUTES 結構做為參數。 這個結構可用來指定控制碼的屬性。

驅動程式可以指定下列控制碼屬性:

  • OBJ_KERNEL_HANDLE

    控制碼只能從核心模式存取。

  • OBJ_INHERIT

    目前進程的任何子系會在建立控制碼時收到控制碼的複本。

  • OBJ_FORCE_ACCESS_CHECK

    此屬性指定系統會對控制碼執行所有存取檢查。 根據預設,系統會略過在核心模式中建立之控制碼的所有存取檢查。

使用 InitializeObjectAttributes 常式,在 OBJECT_ATTRIBUTES 結構中設定這些屬性。

如需驗證物件控制碼的相關資訊,請參閱 驗證物件控制碼失敗

Private 物件控制碼

每當驅動程式為其私用建立物件控制碼時,驅動程式必須指定OBJ_KERNEL_HANDLE屬性。 這可確保使用者模式應用程式無法存取控制碼。

共用物件控制碼

共用核心模式與使用者模式之間物件控制碼的驅動程式必須仔細撰寫,以避免意外建立安全性漏洞。 以下是一些指導方針:

  1. 在核心模式中建立控制碼,並將其傳遞至使用者模式,而不是另一種方式。 使用者模式元件所建立並傳遞至驅動程式的控制碼不應受到信任。

  2. 如果驅動程式必須代表使用者模式應用程式操作控制碼,請使用 OBJ_FORCE_ACCESS_CHECK 屬性來確認應用程式具有必要的存取權。

  3. 使用 ObReferenceObjectByPointer 在共用控制碼上保留核心模式參考。 否則,如果使用者模式元件關閉控制碼,則參考計數會變成零,如果驅動程式接著嘗試使用或關閉控制碼,系統將會當機。

如果使用者模式應用程式建立事件物件,驅動程式可以安全地等候該事件發出訊號,但只有在應用程式透過 IOCTL 將控制碼傳遞給驅動程式時。 驅動程式必須在建立事件的進程內容中處理 IOCTL,而且必須呼叫 ObReferenceObjectByHandle來驗證控制碼是否為事件控制碼。