共用方式為


IoSetDeviceInterfaceState 函式 (wdm.h)

IoSetDeviceInterfaceState 例程會啟用或停用先前註冊裝置介面類別的實例。

語法

NTSTATUS IoSetDeviceInterfaceState(
  [in] PUNICODE_STRING SymbolicLinkName,
  [in] BOOLEAN         Enable
);

參數

[in] SymbolicLinkName

字串的指標,識別已啟用或停用的裝置介面實例。 此字串是從先前呼叫 ioRegisterDeviceInterfaceIoGetDeviceInterfaces取得。

[in] Enable

TRUE 表示裝置介面已啟用。 FALSE 表示裝置介面正在停用。

傳回值

如果呼叫成功,IoSetDeviceInterfaceState 會傳回STATUS_SUCCESS。 如果呼叫端要求啟用已啟用裝置介面,此例程會傳回STATUS_OBJECT_NAME_EXISTS的信息狀態。 可能的錯誤傳回值如下所述。

傳回碼 描述
STATUS_OBJECT_NAME_NOT_FOUND
呼叫端嘗試停用未啟用的裝置介面。

言論

IoSetDeviceInterfaceState 可讓應用程式和其他系統元件使用已註冊裝置介面的實例。 介面類別先前必須已向 IoRegisterDeviceInterface 或使用者模式註冊。

應用程式和其他系統元件只能開啟已啟用的介面。

函式或篩選驅動程式通常會呼叫此例程,Enable 在成功啟動裝置以回應 IRP_MN_START_DEVICE IRP 之後,將設定為 TRUE。 這類驅動程式應該停用裝置介面實例(也就是呼叫 IoSetDeviceInterfaceState,並在移除裝置以回應 IRP_MN_REMOVE_DEVICE IRP 或 IRP_MN_SURPRISE_REMOVAL IRP 時,將 [啟用] 設定為 [FALSE]。 如果驅動程式在處理這些移除 IRP 時未停用裝置介面,驅動程式不應該後續嘗試這樣做,因為 PnP 管理員會在 PnP 管理員移除裝置時停用介面。

如果裝置突然移除(例如,意外移除),但仍有有效的裝置介面實例,如果重新附加裝置,就會發生問題。 當 PnP 管理員列舉新連結的裝置並啟用裝置介面實例時,就會發生此問題,該實例會存在於與現有裝置介面實例相同的登錄路徑中。

請注意,如果驅動程式呼叫 IoSetDeviceInterfaceState 來停用裝置介面實例以回應 IRP_MN_SURPRISE_REMOVAL IRP,驅動程式就不得嘗試停用相同的裝置介面實例,以回應 IRP_MN_REMOVE_DEVICE IRP。

如果呼叫 IoSetDeviceInterfaceState 成功公開裝置介面實例,系統會通知註冊裝置類別 PnP 通知的任何元件變更。 同樣地,如果呼叫此例程會停用現有的裝置介面實例,系統就會傳送適當的通知。

IRP_MN_START_DEVICE IRP 完成之前,PnP 管理員不會傳送介面實例抵達的通知,表示裝置的所有驅動程式都已完成其啟動作業。 此外,PnP 管理員會在 IRP_MN_START_DEVICE IRP 完成之前,無法建立裝置的要求。

IoSetDeviceInterfaceState 的呼叫端必須在系統線程的內容中於 IRQL = PASSIVE_LEVEL執行。

要求

要求 價值
最低支援的用戶端 從 Windows 2000 開始提供。
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (請參閱一節)
DDI 合規性規則 HwStorPortProhibitedDIS(storport)IrqlIoPassive1(wdm)LowerDriverReturn(wdm)PowerIrpDDis(wdm)

另請參閱

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL

IoGetDeviceInterfaces

IoRegisterDeviceInterface

IoRegisterPlugPlayNotification