共用方式為


註冊裝置介面抵達和裝置移除的通知

本主題描述使用者模式應用程式或驅動程式如何註冊通知裝置介面抵達和裝置移除。

如果您在 UMDF 2 驅動程式中遵循此程式,請參閱 使用裝置介面 取得程式碼範例。

使用者模式元件通常會呼叫 CM_Register_Notification 來尋找裝置介面,然後將 I/O 要求傳送至介面。 若要這樣做,元件會分別註冊 CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACECM_NOTIFY_FILTER_TYPE_DEVICEHANDLE,以通知裝置介面抵達和裝置移除。 呼叫順序可能如下所示。

註冊裝置介面抵達和裝置移除的通知

  1. 使用 CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE 呼叫 CM_Register_Notification,以註冊裝置介面抵達通知。 當指定類別的未來介面到達時,系統會通知您的元件。

  2. 因為您想要將 I/O 傳送至 的介面可能已經存在於系統上,請呼叫 CM_Get_Device_Interface_ListSetupDiGetClassDevs 來擷取現有介面的清單。 注意 如果介面在步驟 1 和步驟 2 之間到達,介面會從步驟 1 的註冊和步驟 2 中的介面清單列出兩次。

  3. 找到所需的介面之後,請呼叫 CreateFile 以開啟裝置的句柄。

  4. 成功在步驟 3 中建立裝置句柄之後,請第二次呼叫 CM_Register_Notification 。 這次,註冊類型為 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE通知,並提供新的裝置句柄做為接收通知的句柄。 當介面所代表的裝置收到查詢移除要求時,系統會通知您的元件。

  5. 當您實作裝置句柄通知回呼時,請使用此表格。

回呼收到的動作值 您的元件應該執行的動作
CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 呼叫 CloseHandle 以關閉裝置句柄。 如果您沒有這麼做,開啟的句柄會防止此裝置的查詢移除成功。
CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED 查詢移除失敗,因此裝置及其介面仍然有效。 若要繼續將 I/O 傳送至介面,請開啟新的句柄。 即使該句柄已經關閉,裝置上的通知註冊仍有效,因此不需要取消註冊通知註冊,並在裝置介面的新句柄下建立新的註冊。

請注意,如果您在傳送CM_NOTIFY_ACTION_DEVICEQUERYREMOVE通知之後正在移除查詢的裝置上註冊通知,您可能會收到CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED通知,而不需要先收到CM_NOTIFY_ACTION_DEVICEQUERYREMOVE通知。
CM_NOTIFY_ACTION_DEVICEREMOVEPENDING 呼叫 CM_Unregister_Notification 以取消註冊句柄的通知。 您必須從延後例程執行此動作。 如需詳細資訊,請參閱 CM_Unregister_Notification<備註>一節。 如果您仍然擁有裝置的開啟句柄,請呼叫 CloseHandle 以關閉裝置句柄。
CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE 呼叫 CM_Unregister_Notification 以取消註冊句柄的通知。 您必須從延後例程執行此動作。 如需詳細資訊,請參閱 CM_Unregister_Notification<備註>一節。 如果您仍然擁有裝置的開啟句柄,請呼叫 CloseHandle 以關閉裝置句柄。
  1. 完成裝置之後,請呼叫 CM_Unregister_Notification ,以取消註冊您在步驟 1 中註冊的介面通知回呼。

UMDF 2 驅動程式可能會在驅動程式的 EvtDevicePrepareHardware 回呼例程中執行步驟 1-4,並在其中一個驅動程式的裝置移除回呼例程中執行步驟 6。

CM_Register_Notification

CM_Unregister_Notification

使用裝置介面