Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 06.05.2021
Сообщений: 242

Как правильно удалить драйвер?

05.05.2025, 17:02. Показов 1645. Ответов 1
Метки в (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть устройство, для которого нужно устанавливать драйвер usb (использовался win usb). Есть ПО, которое работает с этим устройством. В какой-то момент, решили перейти на usb драйвер от другого производителя. Теперь, мне нужно прописать в установщике поиск драйвера устройства и далее, если это старый драйвер - удалять его. Установщик я делаю в InnoSetup, но так как писать там надо на паскале, который я знаю плохо, я решил написать программу удаления драйверов на C++ и запускать её во время установки. По этому вопрос такой - как правильно удалить драйвер из системы? Устройство при этом может быть как подключено так и не подключено в данный момент.
Я нагулил примерно варианта 4, как это сделать, где то пишут использовать функции win api, где то - использовать PnPUtil, а где-то примеры 17 летней давности.
Так же где то предлагают выгружать драйвер, через ZwUnloadDriver() и потом удалять, а где то удалять сразу через DiUninstallDriverW(). Так же для выгрузки драйвера советуют использовать DRIVER_UNLOAD

Добавлено через 24 минуты
Code
1
2
3
4
5
6
DRIVER_UNLOAD DriverUnload;
 
void DriverUnload(
  [in] _DRIVER_OBJECT *DriverObject
)
{...}
В общем, в голове образовалась каша и что конкретно делать не очень понятно.

Добавлено через 2 часа 20 минут
Пока что прихожу к выводу, что сначала надо вызвать DiUninstallDevice(), что удалит устройство, а потом нужно удалить драйвер из хранилища, вызвав DiUninstallDriverW(). Верно ли это?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2025, 17:02
Ответы с готовыми решениями:

Как подключаться к различным типам БД (как правильно прописать драйвер для БД)?
Задача научить подключаться различным типам БД и в каких случих пишут имя соединения QSlDatabase...

Какой драйвер нужен для правильной работы TMediaPlayer?
Какой драйвер нужен для правильной работы TMediaPlayer?

Удалить нули из массива! Как удалить нули?но чтобы рисунок остался!
#include <iostream> #include <iomanip> using namespace std; int main() { int r,c; ...

1
1 / 1 / 0
Регистрация: 06.05.2021
Сообщений: 242
07.05.2025, 11:01  [ТС]
В общем, написал такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <stdio.h>
#include <Windows.h>
 
#include <SetupAPI.h>
#pragma comment(lib, "SetupAPI.lib")
#include <conio.h>
#include <Cfgmgr32.h>
#include <tchar.h>
 
#include <newdev.h>
#pragma comment(lib, "newdev.lib")
#include <locale.h>
 
bool DriverDeleter()
{
    setlocale(LC_ALL, "ru");
 
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    CONFIGRET status;
    DWORD dwSize, dwPropertyRegDataType;
    TCHAR szDesc[1024]; //szHardwareIDs[4096];
 
    hDevInfo = SetupDiGetClassDevs(NULL, TEXT("USB"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
 
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        _tprintf(TEXT("hDevInfo == INVALID_HANDLE_VALUE"));
    }
 
    for (unsigned i = 0; ; i++)
    {
        DeviceInfoData.cbSize = sizeof(DeviceInfoData);
 
        if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
            break;
 
        // Описание устройства
        if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
            &dwPropertyRegDataType, (BYTE*)szDesc,
            sizeof(szDesc),   // The size, in bytes
            &dwSize))
        {
            _tprintf(TEXT("Device Description: \"%s\"\n"), szDesc);
        }
 
        //_tprintf(TEXT("\n"));
 
        // Если установлены дрова usb win_usb
        const TCHAR* usrp_descr_win_usb = TEXT("Driver name");
        
        if (_tcscmp(usrp_descr_win_usb, szDesc) == 0)
        {
            // Удаляем устройство
            _tprintf(TEXT("Driver found: \"%s\"\n"), szDesc);
            int delete_device_res = DiUninstallDevice(NULL, hDevInfo, &DeviceInfoData, NULL, NULL);
            _tprintf(TEXT("delete device_result: \"%d\"\n"), delete_device_res);
            if (delete_device_res)
            {
                // Удаляем файлы драйвера
                LPCWSTR uhd_inf_arr[]{ TEXT("Path to driver inf file 1"),
                                       TEXT("Path to driver inf file 2"),
                                       TEXT("Path to driver inf file 3"),
                                       TEXT("Path to driver inf file 4"),
                                       TEXT("Path to driver inf file 5"),
                                       TEXT("Path to driver inf file 6")
                                     };
 
                for (size_t i = 0; i < sizeof(uhd_inf_arr) / sizeof(uhd_inf_arr[0]); i++)
                {
                    if (!DiUninstallDriverW(NULL, uhd_inf_arr[i], NULL, NULL))
                    {
                        _tprintf(TEXT("Driver removal error.\n"));
                        return false;
                    }
                }
            }
            return true;
        }
    }
 
    _tprintf(TEXT("Driver not found.\n"));
 
    return false;
}
 
int main()
{
    FreeConsole();
    if (DriverDeleter())
    {
        _tprintf(TEXT("The driver was deleted successfully.\n"));
    }
    return 0;
}
Вроде работает, удаляет устройство и драйвер. В плане return -ов и ветвлений надо поправить, так как сейчас функция возвращает true не всегда корректно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2025, 11:01
Помогаю со студенческими работами здесь

Удалить числа, повторяющиеся 3 раза подряд (Как удалить эти элементы из массива?)
Задание: Есть динамический массив. Заполнен случайными числами. Удалить числа, повторяющиеся 3...

Как правильно удалить Series из Chart
Здравствуйте! Подскажите, пожалуйста, как правильно удалить программно созданные Series из Chart'a....

Объекты. Как правильно инициализировать и удалить перемнные
Есть довольно сложная задача. 1-й класс считает. 2-й класс делает интерфейс. Первый от второго...

Как правильно удалить строку в Memo\RichEdit?
Приветствую. Всех с наступившим новым годом. Вроде и не пил, но сообразить не могу. Вопрос...

Дерево: Как правильно удалить все узлы дерева?
Как правильно удалить все узлы дерева?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru