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

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

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

1 Ответ

1 голос
/ 12 июня 2011

Я бы посмотрел исходный код 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 был разработан для использования в Windows2000, 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. Щелкните значок Build Environment по выбору в наборах разработчикаПодменю «Построить среду».Это создаст правильную среду сборки для сборки этого образца.Обратите внимание, что этот пример будет построен как в 64-разрядных, так и в 32-разрядных средах.

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

cd src \ setup \ devcon

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

build –c

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

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

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

ИСПОЛЬЗОВАНИЕ DEVCON

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

TESTING

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

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

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

...