Повторно сканировать дерево устройств на предмет изменений оборудования во время установки драйвера.

Я использую InstallShield для установки своего приложения, драйвера и службы. Мне нужно установить драйвер plug-N-play, только если его аппаратный идентификатор был найден в диспетчере устройств. Установка драйвера производится с помощью DPInst.exe. Моя проблема заключается в том, что пользователь иногда может вручную удалить драйвер (после его установки или даже удалить «Неизвестный драйвер» в разделе «Другие устройства»), а затем я могу Не могу найти идентификатор оборудования в дереве устройств, хотя устройство подключено. Если я повторно просканирую дерево устройств во время установки с помощью CM_Reenumerate_DevNode_Ex (код, эквивалентный «Сканировать новое оборудование»), я смогу найти идентификатор оборудования, но при этом появится «Мастер поиска нового оборудования» .

Есть ли способ повторно сканировать дерево устройств, но подавить «Мастер нового оборудования» или избежать повторного сканирования, но при этом убедиться, что идентификатор оборудования моего устройства присутствует в системе?


person Eldad    schedule 27.01.2010    source источник


Ответы (2)


Я пишу новый ответ, так как у нас уже слишком много комментариев к моему старому, и его содержание основано на небольшом недопонимании ситуации.

Настоящая проблема, насколько я понимаю сейчас, - это мастер «Добавить новое оборудование», который появляется при повторном сканировании устройств перед установкой драйвера. К сожалению, этот мастер появляется всякий раз, когда не обнаруживается подходящий драйвер для работы с новым устройством в системе, поэтому для его преодоления единственный вариант - убедиться, что такой драйвер существует в системе. Это приводит к двум возможным решениям, которые я вижу:

  1. Выполните первую установку программного обеспечения и убедитесь, что ваш драйвер подходит для устройства (информация правильно сформирована, и у вас есть подпись WHQL). Насколько я понимаю, это не вариант, потому что вы не хотите устанавливать драйвер на машинах, к которым устройство не подключено (я хотел бы услышать, почему).
  2. Убедитесь, что какой-либо другой драйвер в системе подходит для этого. В этом случае вам нужно выбрать один из встроенных драйверов (тот, который не нанесет ущерба, если он будет действовать как функциональный драйвер для вашего устройства), и дать вашему устройству соответствующий совместимый идентификатор - тот, который вызовет встроенный драйвер найти подходящий. Таким образом, вам не придется ждать пользователя после повторного сканирования устройств, но в зависимости от вашего устройства найти подходящий встроенный драйвер может быть невозможно.
person On Freund    schedule 28.01.2010
comment
Прежде всего, я очень ценю вашу помощь. Мое устройство - это встроенный контроллер, который на самом деле не то, что нужно подключать и отключать. поэтому, если аппаратный идентификатор устройства отсутствует в системе, это может означать, что либо на машине нет такого контроллера, либо BIOS была настроена неправильно. Я думаю, что в обоих случаях установка должна завершиться неудачно и предупредить пользователя. Ваше второе решение звучит интересно, но я думаю, что в конечном итоге я останусь с сообщением пользователю о том, что установка не удалась, и он должен попытаться перезагрузить компьютер, прежде чем пытаться установить снова. - person Eldad; 28.01.2010
comment
Зачем пользователям пытаться установить ваш драйвер, если у них нет вашего устройства? Как вы распространяете свою установку? - person On Freund; 28.01.2010
comment
На самом деле нет причин, по которым это должно происходить, но это (ОПЯТЬ) требование нашего клиента. Я могу придумать сценарий: пользователь пытается запустить настройку для другого устройства, но случайно выполняет неправильную установку. - person Eldad; 28.01.2010
comment
В этом случае я думаю, что лучше всего подходит описанное выше решение для сообщений. - person On Freund; 28.01.2010

Похоже, вы ошиблись. Если у вас установка на основе MSI, почему бы не использовать DIFxApp вместо DPInst? Что касается мастера «Найдено новое оборудование», вам понадобятся две вещи:

  1. Убедитесь, что ваш inf-файл правильный (чтобы ваш драйвер был связан с идентификатором оборудования)
  2. Получите подпись WHQL от MS. Этот шаг необходим для XP, так как ненадежные драйверы не будут автоматически назначаться устройствам. В Vista и 7 вы можете поставить цифровую подпись на драйвер самостоятельно, но во время установки вы получите предупреждение, спрашивающее пользователя, хочет ли он / она доверять этому издателю (вам).
person On Freund    schedule 27.01.2010
comment
WHQL в разработке. Я проверяю идентификатор оборудования перед вызовом DPInst, поэтому я не могу понять, какое отношение может иметь содержимое .inf ... Я что-то здесь упускаю? Что касается DiFxApp: у нас есть 2 драйвера - один для x32, а другой для x64. Я попытался включить 2 разные версии DifxApp, но есть некоторые функции, которые вызываются из других функций в DLL Difx, и я не могу контролировать, какая dll будет вызываться для этих функций. Могу включить 2 разные версии DPInst.exe и условно назвать нужную. - person Eldad; 27.01.2010
comment
Даже если вы проверите наличие устройства, информация по-прежнему актуальна, поскольку она определяет, какой драйвер будет отвечать за устройство (и вы хотите, чтобы он был вашим :)). Кроме того, это необходимо в сценарии, когда пользователь удалил устройство, а вы сканируете новое оборудование. Что касается x32 и x64, как я писал вам в другом потоке, вам не следует использовать один MSI для обработки установок как x32, так и x64. - person On Freund; 27.01.2010
comment
Что касается x32 и x64, я читал ваш ответ раньше, но это все еще требование нашего клиента. Я знаю, что файл inf важен. Я просто не могу понять, как Windows узнает о моей информации до того, как я ее установлю (я не хочу устанавливать драйвер до того, как я это сделаю, поэтому я сканирую новое оборудование перед установкой драйвера). - person Eldad; 27.01.2010
comment
Что вы имеете в виду - убедиться, что можете? Вы всегда можете предварительно установить драйвер, и Windows позаботится о том, чтобы связать его с соответствующими устройствами. Windows ничего не знает об этой информации до того, как вы установите драйвер, но фактическая установка состоит из двух частей - предварительной установки, после которой Windows знает вашу информацию, и фактической установки устройства, после чего ваш драйвер выбирается в соответствии с информация в инф. Что касается 64-битной версии, я думаю, вам следует объяснить своему клиенту, что это техническое ограничение MSI, и дать ему возможность использовать решение, отличное от MSI. - person On Freund; 27.01.2010
comment
Убедитесь, что я могу = Если у пользователя нет моего устройства (что означает отсутствие идентификатора оборудования в дереве устройств), я хочу прервать установку. Запуск DPInst скопирует файлы inf, но не установит драйвер и вернет x100. x100 может означать 1 из 2 вещей: устройство отсутствует на клиентском ПК ИЛИ Устройство присутствует, но отсутствует в дереве устройств (поэтому повторное сканирование дерева устройств покажет его). Я был бы рад узнать, ошибся ли я в этом сценарии. - person Eldad; 27.01.2010
comment
Я не уверен, что понимаю ваш вопрос, но я считаю, что вы не можете использовать код возврата, чтобы отличить случай, когда устройство физически подключено, но удалено из дерева, от случая, когда устройство физически не подключено. - person On Freund; 27.01.2010
comment
Это означает, что предварительная установка была выполнена успешно, но устройство не было найдено (либо потому, что оно физически не подключено, либо потому, что оно было удалено из дерева устройств - они почти идентичны). Однако, когда подходящее устройство будет подключаться к машине, при условии, что ваш inf хорошо определен, вашему драйверу будет назначено его обрабатывать. Как упоминалось ранее, если ваш драйвер не подписан WHQL, это потребует взаимодействия с пользователем в XP. - person On Freund; 27.01.2010
comment
Мое устройство встроено в ПК (хотя и типа Plug-N-Play). Поэтому я не могу подключить его к компьютеру позже. Единственный способ узнать Windows об этом устройстве - это повторно просканировать дерево устройств или перезагрузить компьютер. 0x100 означает, что драйверы установлены независимо от того, подключено ли у меня устройство или нет, и я не хочу устанавливать драйверы на машине, на которой нет моего устройства. - person Eldad; 27.01.2010
comment
Хорошо, но если устройство подключено до установки драйвера (что отчасти противоречит обычной модели Windows), вы в любом случае столкнетесь с мастером добавления нового оборудования (поскольку никакой другой драйвер в системе не справится с этим) . Если вы готовы жить с этим, у вас может быть настраиваемое действие для запуска повторного сканирования дерева устройств перед настраиваемым действием, которое решает, устанавливать ли драйвер. Если вы не можете смириться с этим, вы можете дать своему устройству совместимый идентификатор, который распознается драйвером, который уже установлен на машине (тот, который знает, как с этим справиться). - person On Freund; 27.01.2010
comment
Но при повторном сканировании появляется «Добавить новое оборудование». Если настраиваемое действие синхронизировано, оно не вернется, пока пользователь не выйдет из мастера. Если это асинхронно, я могу проверить свой идентификатор оборудования до того, как повторное сканирование закончится и устройство будет найдено. - person Eldad; 27.01.2010