Удаление COM-портов в Windows программным способом (Setup API?)

Я ищу способ программного удаления виртуальных COM-портов, созданных несколькими процессами сопряжения Bluetooth. В идеале я хотел бы сопоставить каждое новое сопряженное устройство (только сразу) с одним и тем же виртуальным портом. Можно ли это сделать через Windows Setup API?

Спасибо динсдейл

1 ответ

Решение

Я хотел бы посмотреть на исходный код devcon в Windows DDK. Я прикрепил файл readme, чтобы вы могли видеть, что у него есть источник, который делает именно то, что вы хотите - отключить последовательный порт.

Пример DevCon

DEVCON

DevCon - это инструмент командной строки, который отображает подробную информацию об устройствах и позволяет искать устройства и управлять ими из командной строки. DevCon включает, отключает, устанавливает, настраивает и удаляет устройства на локальном компьютере и отображает подробную информацию об устройствах на локальных и удаленных компьютерах. DevCon включен в Windows DDK.

ОБ ЭТОМ ДОКУМЕНТЕ

Этот документ описывает исходный код DevCon, который включен в Windows DDK в каталоге /src/setup/devcon. Он объясняет структуру DevCon и описывает, как использовать функции SetupAPI и установки устройства для перечисления устройств и выполнения операций с устройством в консольном приложении.

Полное описание возможностей DevCon и инструкции по их использованию см. В файле справки DevCon в документации DDK в разделе Средства разработки драйверов / Инструменты для тестирования драйверов /DevCon.

ОБЪЕМ

Эти инструкции относятся к Windows XP и Windows Server 2003. DevCon был разработан для использования в Windows 2000, Windows XP и Windows Server 2003. Он не будет работать в Windows 95, Windows 98 или Windows ME.

КАК ЭТО УСТРОЕНО

Запуск "помощи devcon" предоставит список команд вместе с кратким описанием того, что делает каждая команда. "devcon help " даст более подробную справку по этой команде. Интерпретация каждой команды выполняется через таблицу диспетчеризации "DispatchTable", которая находится внизу "cmds.cpp". Некоторые из команд используют универсальный перечислитель устройств "EnumerateDevices". Некоторые из этих команд будут работать при наличии удаленного целевого компьютера, а также будут работать при использовании 32-битного devcon на Wow64. Ниже приведено описание некоторых наиболее интересных функций и используемых ими API.

cmdClasses

Эта команда демонстрирует использование SetupDiBuildClassInfoListEx для перечисления GUID всех классов устройств. Функции SetupDiClassNameFromGuidEx и SetupDiGetClassDescriptionEx используются для получения дополнительной информации о каждом классе устройств.

cmdListClass

Эта команда демонстрирует использование SetupDiClassGuidsFromNameEx для перечисления одного или нескольких идентификаторов классов, соответствующих имени класса. Эта команда также демонстрирует использование SetupDiGetClassDevsEx для вывода списка всех устройств для каждого идентификатора GUID класса.

cmdFind cmdFindAll cmdStatus

Простое использование EnumerateDevices (описано ниже) для отображения списка устройств и отображения разных уровней информации о каждом устройстве. Обратите внимание, что все, кроме cmdFindAll, используют DIGCF_PRESENT, чтобы перечислять только информацию об устройствах, которые в настоящее время присутствуют. Основная функциональность для этих и связанных с ними устройств осуществляется внутри FindCallback.

cmdEnable cmdDisable cmdRestart

Эти команды показывают, как выполнить команду DIF_PROPERTYCHANGE, чтобы включить устройство, отключить устройство или перезапустить устройство. Основная функциональность каждой из этих команд выполняется внутри ControlCallback.

Эти операции нельзя выполнить на удаленной машине или в контексте Wow64. API CFGMGR32 не должны использоваться, поскольку они пропускают класс и соинсталляторы.

cmdUpdate

Эта команда показывает, как использовать UpdateDriverForPlugAndPlayDevices для обновления драйвера для всех устройств до определенного драйвера. Обычно INSTALLFLAG_FORCE не указывается, что позволяет UpdateDriverForPlugAndPlayDevices определить, существует ли уже лучшее совпадение. Это указано в DevCon, чтобы позволить DevCon более эффективно использоваться в качестве инструмента отладки / тестирования. Это нельзя сделать на удаленной машине или в контексте Wow64.

cmdInstall

Вариант cmdUpdate для установки драйвера при отсутствии соответствующего оборудования. Он создает новый экземпляр устройства с корневым перечислением и связывает его с составленным идентификатором оборудования, указанным в командной строке (который должен соответствовать идентификатору оборудования в INF). Это нельзя сделать на удаленной машине или в контексте Wow64.

cmdRemove

Команда для удаления устройств. Удаленные устройства Plug & Play снова появятся в ответ на cmdRescan. Основная функциональность этой команды находится в RemoveCallback, который демонстрирует использование DIF_REMOVE. Это нельзя сделать на удаленной машине или в контексте Wow64. API CFGMGR32 не должны использоваться, поскольку они пропускают класс и соинсталляторы.

cmdRescan

Эта команда показывает правильный способ повторного сканирования для всех устройств Plug & Play, которые, возможно, были ранее удалены или которым для их обнаружения требуется повторное сканирование.

cmdDPAdd

Эта команда позволяет добавить пакет драйверов на машину. Основная функциональность этой команды демонстрирует использование SetupCopyOEMInf. Добавление пакета драйверов к машине не означает, что драйверы установлены на устройствах, это просто означает, что драйверы доступны автоматически при подключении нового устройства или обновлении существующего устройства.

cmdDPDelete

Эта команда позволяет удалить пакет драйверов с компьютера. Основная функциональность этой команды демонстрирует использование SetupUninstallOEMInf. Удаление пакета драйверов с машины не приводит к удалению драйверов, связанных с устройством. Если вы хотите выполнить и то и другое, используйте cmdRemove на всех устройствах, использующих данный пакет драйверов, а затем cmdDPDelete, чтобы удалить сам пакет драйверов с машины. Эта функция недоступна в Windows 2000 и более ранних версиях.

cmdDPEnum

Эта команда позволяет перечислить все пакеты драйверов сторонних производителей, которые в настоящее время установлены на компьютере, а также показывает, как получить некоторые общие свойства из пакета драйверов (поставщик, описание класса, дата и версия DriverVer).

cmdDPEnumLegacy

Эта команда показывает, как перечислять сторонние пакеты драйверов в Windows Server 2003 и более ранних операционных системах.

перезагружать

Эта функция показывает, как правильно перезагрузить компьютер из программы установки оборудования. В частности, он передает флаги ExitWindowsEx, которые вызывают перезагрузку, связанную с установкой оборудования. Вы никогда не должны перезагружать машину без необходимости.

EnumerateDevices

Демонстрирует использование SetupDiGetClassDevsEx для перечисления всех устройств или всех существующих устройств, глобально или ограниченных определенным классом установки. Демонстрирует использование SetupDiCreateDeviceInfoListEx для создания пустого списка, связанного с классом или нет (в большинстве случаев пустой список не должен быть связан с классом). Демонстрирует использование SetupDiOpenDeviceInfo для добавления экземпляра устройства в список информации об устройстве. Эти два последних API идеально подходят для получения структуры DeviceInfoData из экземпляра устройства и имени компьютера при смешивании API CFGMGR32 с API SETUPAPI. SetupDiGetDeviceInfoListDetail вызывается для получения дескриптора удаленного компьютера, который может быть передан в API CFGMGR32. SetupDiEnumDeviceInfo вызывается для перечисления каждого устройства, которое находится в списке информации об устройстве (либо добавлено явно, либо определяется вызовом SetupDiGetClassDevsEx). Идентификатор экземпляра получается путем вызова CM_Get_Device_ID_Ex с использованием информации в devInfo (полученной из SetupDiEnumerateDeviceInfo) и devInfoListDetail (полученной из SetupDiGetDeviceInfoListDetail). GetHwIds вызывается для получения списка аппаратных средств и совместимых идентификаторов (объясняется ниже). После определения интересующего устройства (обычно путем проверки идентификаторов оборудования) вызывается обратный вызов для работы на этом отдельном устройстве.

GetHwIds

Показывает, как получить полный список идентификаторов оборудования или совместимых идентификаторов для устройства с помощью SetupDiGetDeviceRegistryProperty.

GetDeviceDescription

Показывает, как получить описательную информацию об устройстве. Дружественное имя используется, если оно существует, в противном случае используется описание устройства.

DumpDeviceWithInfo

Показывает, как получить идентификатор экземпляра (или использовать любой API CFGMGR32) с данными HDEVINFO (список информации об устройстве) и PSP_DEVINFO_DATA (данные информации об устройстве).

DumpDeviceStatus

Показывает, как интерпретировать информацию, возвращаемую CM_Get_DevNode_Status_Ex. Обратитесь к cfg.h за информацией, возвращаемой этим API.

DumpDeviceResources

Показывает, как получить информацию о ресурсах, используемых устройством.

DumpDeviceDriverFiles

Предоставляется в качестве средства отладки, получает информацию о файлах, которые, по-видимому, используются для устройства. Он использует SetupDiBuildDriverInfoList для получения информации о драйвере, используемом для указанного устройства. Список драйверов, связанных с устройством, можно перечислить, вызвав SetupDiEnumDriverInfo. В этом случае в списке будет не более одного драйвера. Эта функция переходит к получению списка файлов, которые обычно копируются для этого драйвера, используя DIF_INSTALLDEVICEFILES. SetupScanFileQueue используется для перечисления очереди файлов для отображения списка файлов, связанных с драйвером.

DumpDeviceDriverNodes

Эта функция, предоставляемая в качестве средства отладки, определяет список совместимых драйверов для устройства. Он использует SetupDiBuildDriverInfoList для получения списка совместимых драйверов. В этом случае перечисляются все драйверы, однако, как правило, DIF_SELECTBESTCOMPATDRV и SetupDiGetSelectedDriver будут использоваться вместе, чтобы найти, какой драйвер ОС считает лучшим.

DumpDeviceStack

Эта функция определяет класс и устройство верхнего и нижнего фильтров.

СОЗДАНИЕ ОБРАЗЦА DEVCON

Чтобы построить пример devcon:

  1. Щелкните значок выбора "Среда сборки" в подменю "Среды сборки среды разработки". Это создаст правильную среду сборки для сборки этого образца. Обратите внимание, что этот пример будет построен как в 64-битных средах, так и в 32-битных средах.

  2. В командном окне перейдите в каталог, содержащий исходный код DevCon. Например:

cd src \ setup \ devcon

  1. Используйте макрос BLD или выполните в командной строке следующее:

построить –c

Это вызывает процедуры Microsoft make, которые создают файлы журналов Build.log, Build.wrn и Build.err.

После завершения сборки исполняемый файл будет помещен в подкаталог ObjXXX\I386 каталога, указанного в файле Sources (в зависимости от выбранной среды сборки).

Если сборка не удалась, проверьте наличие следующих ошибок: 1) среда сборки не настроена должным образом, или 2) изменения, внесенные в пример исходного кода, привели к ошибкам.

ИСПОЛЬЗУЯ DEVCON

DevCon предоставляется в готовом виде в tools\devcon. Для использования обратитесь к документу, поставляемому с devcon.exe. DevCon - это утилита командной строки со встроенной документацией, доступной с помощью команды "devcon help".

ТЕСТИРОВАНИЕ

Введите "devcon find *", чтобы получить список экземпляров всех существующих устройств на локальном компьютере.

Введите "devcon status @root\rdp_mou\0000", чтобы отобразить состояние драйвера мыши сервера терминалов.

Введите "devcon status PNP05 ", чтобы отобразить состояние всех COM-портов.

Другие вопросы по тегам