共用方式為


控制 KMDF 驅動程式中的裝置存取

驅動程式必須協助防止使用者不當存取電腦的裝置和檔案。 若要防止未經授權存取裝置和檔案,您必須:

  • 僅在必要時命名裝置物件。

  • 提供裝置物件和介面的安全性描述項。

僅在必要時命名裝置物件

與大多數 Windows 驅動程式模型 (WDM) 驅動程式一樣,架構型驅動程式通常不會為其裝置物件命名。 應用程式可以藉由指定裝置物件名稱來存取裝置,因此每個額外的裝置物件名稱都代表應用程式可用來存取裝置的其他路徑。

若要防止未經授權的裝置存取,每個驅動程式都可以在命名裝置物件時指定安全性描述元。 不過,作系統提供給驅動程式的檔名(請參閱 WdfFileObjectGetFileName),不包含應用程式所使用的裝置物件名稱。 因此,如果驅動程式堆疊中的數個驅動程式為其裝置物件提供名稱,您的驅動程式就無法判斷用來開啟裝置的應用程式物件名稱。 因此,應用程式可能會以比驅動程序預期的更不嚴格的安全性描述元來開啟裝置。

實體裝置物件 (PDO) 必須具有名稱。 一般而言,架構型總線驅動程式不會指定 PDO 的名稱,因為架構 (預設) 會指示作系統產生名稱。

另一方面,架構型驅動程式可以呼叫 WdfDeviceInitAssignName,將裝置名稱指派給裝置物件。 只有在驅動程式必須支援需要特定裝置名稱的較舊應用程式,或驅動程式屬於需要物件名稱的較舊驅動程式堆疊時,驅動程式才應該將功能裝置物件命名為 FDO、篩選裝置物件(篩選 DO),或 PDO。

WDM 驅動程式和架構型驅動程式應該提供應用程式可存取的裝置介面,而不是命名功能設備物件 (FDO) 和篩選設備物件。 作業系統會從裝置的 PDO 和驅動程式套件的 INF 文件中所指定的登錄項目取得裝置介面的安全性描述符。 如果驅動程式的裝置以原始模式運作,而沒有函式驅動程式,則總線驅動程式可以提供 PDO 的裝置介面。

某些驅動程式必須呼叫 WdfDeviceCreateSymbolicLink,為其裝置建立符號連結名稱。 例如,如果應用程式預期看到裝置 MS-DOS 名稱,驅動程式可能會建立 MS-DOS 裝置名稱。 如果您的驅動程式為未命名的 FDO 或篩選 DO 建立符號連結名稱,架構會將符號連結名稱與 PDO 的名稱產生關聯。 (控制裝置未與 PDO 相關聯,因此您的驅動程式無法為未命名的控制裝置建立符號連結名稱。

為裝置物件和介面提供安全性描述項

每個具名裝置對象都必須有安全性描述元。 作系統會使用裝置物件的安全性描述元來判斷允許存取裝置及其裝置介面的用戶類型。 安全性描述項可以指派給裝置物件,方法是:

  • 操作系統提供裝置物件的預設安全性描述元(請參閱 控制裝置存取)。

  • 如果您的驅動程式呼叫 WdfDeviceInitAssignName,此架構會提供預設的安全性描述元(使用 SDDL_DEVOBJ_SYS_ALL_ADM_ALL 值),以將名稱指派給裝置物件(請參閱 device Objects的 SDDL )。

  • 您的驅動程式可以藉由呼叫 WdfDeviceInitAssignSDDLString來取代架構的預設安全性描述元。

根據預設,作系統也會使用裝置 PDO 的安全性描述元來判斷驅動程式所提供之裝置介面的訪問許可權。

驅動程式套件可以提供一個 INF 檔案,其中透過 INF AddReg 指令INF DDInstall.HW 區段中指定設備的安全描述符。

如需在 INF 檔案中指定安全性描述元的詳細資訊,請參閱 建立安全裝置安裝

如果您的驅動程式為以原始模式運作的裝置建立 PDO,則驅動程式必須在呼叫 WdfPdoInitAssignRawDevice時,指定 裝置設定類別。 此外,如果您的驅動程式建立控制裝置,它可以呼叫 WdfDeviceInitSetDeviceClass 來指定裝置設定類別。 在這兩種情況下,系統管理員可以使用指定之安裝類別的登錄機碼來儲存裝置的安全性描述元。

如需作系統如何決定要用於裝置之安全性描述項的資訊,請參閱 控制裝置存取

當架構建立裝置物件時,它一律會設定FILE_DEVICE_SECURE_OPEN旗標,讓作系統在允許應用程式存取裝置命名空間內的任何名稱之前,先檢查裝置的安全性描述項。 如需FILE_DEVICE_SECURE_OPEN旗標和裝置命名空間的詳細資訊,請參閱 控制裝置命名空間存取