註冊裝置介面抵達和裝置移除通知
本主題描述使用者模式應用程式或驅動程式如何註冊裝置介面抵達和裝置移除通知。
使用者模式元件通常會呼叫 CM_Register_Notification 來尋找裝置介面,然後將 I/O 要求傳送至介面。 若要這樣做,元件會分別註冊 CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE 和 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE,以通知裝置介面抵達和裝置移除。 呼叫序列可能如下所示。
註冊裝置介面抵達和裝置移除通知
使用CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE 呼叫 CM_Register_Notification,以註冊裝置介面抵達通知。 當指定類別的未來介面送達時,系統會通知您的元件。
因為您想要將 I/O 傳送至 的介面可能已經存在於系統上,請呼叫 CM_Get_Device_Interface_List 或 SetupDiGetClassDevs 以擷取現有介面的清單。 注意 如果介面在步驟 1 和步驟 2 之間抵達,則會從步驟 1 的註冊和步驟 2 中的介面清單列出兩次介面。
找到所需的介面之後,請呼叫 CreateFile 以開啟裝置的控制碼。
成功在步驟 3 中建立裝置控制碼之後,請再次呼叫 CM_Register_Notification 。 這次,註冊 類型為 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE的通知,並提供新的裝置控制碼做為接收通知的控制碼。 當介面所代表的裝置收到查詢移除要求時,系統會通知您的元件。
當您實作裝置控制碼通知回呼時,請使用此表格。
回呼收到的動作值 您的元件應該執行的動作 CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 呼叫 CloseHandle 以關閉裝置控制碼。 如果您未這麼做,則開啟的控制碼會防止此裝置的查詢成功。
CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED 查詢移除失敗,因此裝置及其介面仍然有效。 若要繼續將 I/O 傳送至介面,請開啟新的控制碼。
首先,呼叫 CM_Unregister_Notification,以取消註冊舊控制碼的通知。 您必須從延後常式執行此動作,因為您無法從通知回呼呼叫 CM_Unregister_Notification ,以取得您正在取消註冊的通知控制碼。 如需詳細資訊,請參閱CM_Unregister_Notification的一節。
然後,繼續在延後常式中,或回到通知回呼,呼叫 CreateFile 以建立新的控制碼。 然後使用新的控制碼和CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE呼叫CM_Register_Notification。
請注意,如果您在傳送 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 以關閉裝置控制碼。
完成裝置之後,請呼叫 CM_Unregister_Notification 以取消註冊您在步驟 1 中註冊的介面通知回呼。
如果您在 UMDF 2 驅動程式中遵循此程式,請參閱 使用裝置介面 以取得程式碼範例。 UMDF 2 驅動程式可能會在驅動程式的 EvtDevicePrepareHardware 回呼常式中執行步驟 1-4,以及其中一個驅動程式裝置移除回呼常式中的步驟 6。