Встроенные средства Windows позволяют создать резервную копию (экспортировать) все установленные на компьютере сторонне драйвера в указанный каталог. Благодаря этому при установке или переустановку Windows вам не придется вручную искать и качать необходимые драйвера.
Содержание:
- Как экспортировать драйвера из командной строки Windows?
- Экспорт драйверов с помощью утилиты PNPUtil
- Установка драйверов из резервной копии в Windows
Как экспортировать драйвера из командной строки Windows?
Чтобы экспортировать все установленные сторонние (не-Microsoft) драйвера Windows в каталог C:\drivers, откройте консоль PowerShell с правами администратора и выполните команду:
Export-WindowsDriver –Online -Destination c:\drivers
Аналогичная команда DISM:
dism /online /export-driver /destination:C:\Drivers
Эти команды извлекают сторонние драйвера из хранилища драйверов (Driver Store) Windows. Каждый драйвер и все связанные с ним файлы (sys, dll, exe, и т.д.) сохраняется в собственный каталог, который называется по имени inf-файла драйвера.
Можете создать таблицу с указанием класса, производителя, версией, и датой драйвера:
$BackupDrv = Export-WindowsDriver -Online -Destination c:\drivers
$BackupDrv | Select-Object ClassName, ProviderName, Date, Version | Sort-Object ClassName
Экспортируйте список драйверов в CSV файл:
$BackupDrv| Select-Object ClassName, ProviderName, Date, Version |Export-Csv c:\drivers\drivers_list.csv -NoTypeInformation -Encoding UTF8
Если нужно извлечь драйвера из офлайн образа Windows, смонтированного в каталог c:\win_image:
Export-WindowsDriver -Path c:\win_image -Destination c:\drivers
Или
DISM /Image:C\win_image /Export-Driver /Destination:C:\drivers
Экспорт драйверов с помощью утилиты PNPUtil
Также для управления драйверами Windows можно использовать утилиту командной строки
PNPUtil.exe
(доступа даже в старых версиях Windows). Чтобы экспортировать установленные драйвера, выполните команду:
pnputil.exe /export-driver * c:\drivers
Команды Export-WindowsDriver и DISM позволяют создать резервную копию сразу всех драйверов. Утилита pnputil позволяет экспортировать только указанный драйвер.
Выведите список драйверов установленных драйверов:
pnputil.exe /enum-drivers
Или воспользуйтесь командой PowerShell для фильтра драйверов по типа (в этом примере мы планируем экспортировать драйвера сетевой карты Realtek):
Get-WindowsDriver -Online | where { ($_.ProviderName -like "Realtek") –and ($_.ClassName -like "Net")}
Скопируйте INF имя файла драйвера, который нужно экспортировать и выполните команды:
Mkdir c:\drivers\realtek
pnputil.exe /export-driver oem20.inf c:\drivers\realtek
Установка драйверов из резервной копии в Windows
После переустановки Windows вы можете использовать каталог с резервной копией драйверов для их установки в чистой системе. Можно установить драйвера по одному. Для этого щелкните правой кнопкой по INF файлу и выберите пункт меню “Установить”.
Либо вы можете установить сразу все драйвера из указанной папки (включая вложенные):
pnputil.exe /add-driver C:\drivers\*.inf /subdirs /install
Можно импортировать драйвера в офлайн образ Windows с помощью параметра Add-Driver утилиты DISM (в этом примере мы разрешаем установку неподписанных драйверов):
DISM /image:c:\win_image /Add-Driver /Driver:C:\Drivers /Recurse /ForceUnsigned
BOOL InstallDriver(SC_HANDLE SchSCManager, LPCTSTR DriverName,LPCTSTR ServiceExe);
BOOL RemoveDriver(SC_HANDLE SchSCManager, LPCTSTR DriverName);
BOOL StartDriver(SC_HANDLE SchSCManager, LPCTSTR DriverName);
BOOL StopDriver(SC_HANDLE SchSCManager, LPCTSTR DriverName);
BOOL
InstallDriver(
__in SC_HANDLE SchSCManager,
__in LPCTSTR DriverName,
__in LPCTSTR ServiceExe
)
/*++
Routine Description:
Arguments:
Return Value:
—*/
{
SC_HANDLE schService;
DWORD err;
//
// NOTE: This creates an entry for a standalone driver. If this
// is modified for use with a driver that requires a Tag,
// Group, and/or Dependencies, it may be necessary to
// query the registry for existing driver information
// (in order to determine a unique Tag, etc.).
//
//
// Create a new a service object.
//
schService = CreateService(SchSCManager, // handle of service control manager database
DriverName, // address of name of service to start
DriverName, // address of display name
SERVICE_ALL_ACCESS, // type of access to service
SERVICE_KERNEL_DRIVER, // type of service
SERVICE_DEMAND_START, // when to start service
SERVICE_ERROR_NORMAL, // severity if service fails to start
ServiceExe, // address of name of binary file
NULL, // service does not belong to a group
NULL, // no tag requested
NULL, // no dependency names
NULL, // use LocalSystem account
NULL // no password for service account
);
if (schService == NULL) {
err = GetLastError();
if (err == ERROR_SERVICE_EXISTS) {
//
// Ignore this error.
//
return TRUE;
} else {
printf(«CreateService failed! Error = %d \n», err );
//
// Indicate an error.
//
return FALSE;
}
}
//
// Close the service object.
//
if (schService) {
CloseServiceHandle(schService);
}
//
// Indicate success.
//
return TRUE;
} // InstallDriver
BOOL
RemoveDriver(
__in SC_HANDLE SchSCManager,
__in LPCTSTR DriverName
)
{
SC_HANDLE schService;
BOOL rCode;
//
// Open the handle to the existing service.
//
schService = OpenService(SchSCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if (schService == NULL) {
printf(«OpenService failed! Error = %d \n», GetLastError());
//
// Indicate error.
//
return FALSE;
}
//
// Mark the service for deletion from the service control manager database.
//
if (DeleteService(schService)) {
//
// Indicate success.
//
rCode = TRUE;
} else {
printf(«DeleteService failed! Error = %d \n», GetLastError());
//
// Indicate failure. Fall through to properly close the service handle.
//
rCode = FALSE;
}
//
// Close the service object.
//
if (schService) {
CloseServiceHandle(schService);
}
return rCode;
} // RemoveDriver
BOOL
StartDriver(
__in SC_HANDLE SchSCManager,
__in LPCTSTR DriverName
)
{
SC_HANDLE schService;
DWORD err;
//
// Open the handle to the existing service.
//
schService = OpenService(SchSCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if (schService == NULL) {
printf(«OpenService failed! Error = %d \n», GetLastError());
//
// Indicate failure.
//
return FALSE;
}
//
// Start the execution of the service (i.e. start the driver).
//
if (!StartService(schService, // service identifier
0, // number of arguments
NULL // pointer to arguments
)) {
err = GetLastError();
if (err == ERROR_SERVICE_ALREADY_RUNNING) {
//
// Ignore this error.
//
return TRUE;
} else {
printf(«StartService failure! Error = %d \n», err );
//
// Indicate failure. Fall through to properly close the service handle.
//
return FALSE;
}
}
//
// Close the service object.
//
if (schService) {
CloseServiceHandle(schService);
}
return TRUE;
} // StartDriver
BOOL
StopDriver(
__in SC_HANDLE SchSCManager,
__in LPCTSTR DriverName
)
{
BOOL rCode = TRUE;
SC_HANDLE schService;
SERVICE_STATUS serviceStatus;
//
// Open the handle to the existing service.
//
schService = OpenService(SchSCManager,
DriverName,
SERVICE_STOP | DELETE
);
if (schService == NULL) {
printf(«OpenService failed! Error = %d \n», GetLastError());
return FALSE;
}
//
// Request that the service stop.
//
if (ControlService(schService,
SERVICE_CONTROL_STOP,
&serviceStatus
)) {
//
// Indicate success.
//
rCode = TRUE;
} else {
printf(«ControlService failed! Error = %d \n», GetLastError() );
//
// Indicate failure. Fall through to properly close the service handle.
//
rCode = FALSE;
}
//
// Close the service object.
//
if (schService) {
CloseServiceHandle (schService);
}
return rCode;
} // StopDriver
#define DRIVER_NAME «DCFS»
int _tmain(int argc, _TCHAR* argv[])
{
SC_HANDLE schSCManager=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!schSCManager) {
printf(«Open SC Manager failed! Error = %d \n», GetLastError());
return -1;
}
if(!DefineDosDevice(DDD_REMOVE_DEFINITION,»K:»,NULL)) {
printf(«DefineDosDevice DDD_REMOVE_DEFINITION Error = %d \n», GetLastError());
}
StopDriver(schSCManager,DRIVER_NAME);
RemoveDriver(schSCManager,DRIVER_NAME);
char buffer[MAX_PATH];
buffer[0]=0;
GetWindowsDirectory(buffer,MAX_PATH);
strcat(buffer,»\\System32\\Drivers\\»);
strcat(buffer,DRIVER_NAME);
strcat(buffer,».sys»);
char NTMPDriver[MAX_PATH];
strcpy(NTMPDriver,DRIVER_NAME);
strcat(NTMPDriver,».sys»);
CopyFile(NTMPDriver,buffer,FALSE);
if (InstallDriver(schSCManager,DRIVER_NAME,buffer)) {
printf(«Driver DCFS install [%s]\n»,buffer);
if (StartDriver(schSCManager,DRIVER_NAME)) {
printf(«Driver DCFS start\n»);
} else {
printf(«Start: error\n»);
}
} else {
printf(«Install: error\n»);
}
if(!DefineDosDevice(DDD_RAW_TARGET_PATH,»K:»,»\\Device\\DCFS»)) {
printf(«DefineDosDevice Error = %d \n», GetLastError());
}
if (schSCManager) {
CloseServiceHandle(schSCManager);
}
return 0;
}
Каким образом можно осуществить выгрузку драйвера из ОС Windows (XP SP3 в моём случае)?
-
Вопрос задан
-
6275 просмотров
Комментировать
Подписаться
5
Оценить
Комментировать
Решения вопроса 1
Команда sc поможет Вам: sc stop <имя_драйвера>
Имя нужного драйвера, в свою очередь, можно добыть командой: sc queryex type= driver
Либо найти ветку драйвера в реестре и посмотреть имя там: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Поэтому попробуй найти службу соответствующую драйвру и останови её.
P.S.
Больше подробностей в студию.
Комментировать
если нужно сделать это программно, то есть setupapi.h в DDK
Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
Похожие вопросы
-
Показать ещё
Загружается…
Минуточку внимания
Часть 1.
Как выгрузить драйвер и первый функционал.
И снова здравствуйте, пришло время продолжить работу над нашим драйвером.
На данный момент мы:
- Настроили рабочее окружение
- Настроили тестовую машину
- Написали, скомпилировали и даже запустили наш первый драйвер
База у нас есть, теперь начнем работать над функционалом. Те, кто повторял за мной в первой статье, могли заметить, что в нашем драйвере отсутствует функция выгрузки. Поэтому, чтобы запустить наш драйвер заново, приходится перезагружать виртуальную машину, что не очень удобно. Мало того, это может быть небезопасно — ведь ядро не будет само удалять драйвер из памяти, он будет там висеть пока система не перезагрузится, что может привести к утечкам памяти. Для данной операции предусмотрена функция
Ссылка скрыта от гостей
, которая принимает в себя указатель на DriverObject и возвращает void.
Так как наш драйвер пока что не сделал ничего, чтобы потребовало дополнительных действий перед его выгрузкой, наша функция будет выглядеть крайне просто.
C++:
void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
KdPrint(("CodebyDriverUnload called.\n"));
}
В коде DriverEntry также передадим указатель на DriverObject
.
DriverObject->DriverUnload = CodebyDriverUnload;
Теперь пересобираем наш драйвер, и проверим, работает ли выгрузка. На тестовой машине вызываем службу запуска драйвера.
sc start CodebyDriver
Теперь вызовем службу остановки драйвера.
sc stop CodebyDriver
Отлично! функция CodebyDriverUnload
отработала.
Наш драйвер большой молодец: умеет загружаться и выгружаться! Однако, все понимают, да и он сам понимает, что он бесполезен.
Давайте научим его делать что-нибудь. Я бы хотел, чтобы он собирал информацию о системе, на которой он запущен.
Для этого надо проштудировать
Ссылка скрыта от гостей
.
Например, давайте определим какая версия Windows установлена на нашей машине.
Для этого нам пригодятся структура
Ссылка скрыта от гостей
и функция
Ссылка скрыта от гостей
.
Инициализируем новую структуру info в которой будут записаны данные OSVERISONINFOW
.
C++:
RTL_OSVERSIONINFOW info = { sizeof(info) };
Далее передадим функции RtlGetVersion адрес нашей структуры.
Теперь, все что нам надо — это вывести необходимую информацию.
C++:
KdPrint(("Windows Version: %d.%d.%d PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));
Пересобираем драйвер и проверяем результат.
C++:
#include <ntddk.h>
void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
KdPrint(("CodebyDriverUnload called.\n"));
}
extern "C"
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
KdPrint(("Hi Codeby, this is our first driver! Yuhu!\n"));
RTL_OSVERSIONINFOW info = { sizeof(info) };
RtlGetVersion(&info);
KdPrint(("Windows Version: %d.%d.%d PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));
DriverObject->DriverUnload = CodebyDriverUnload;
return STATUS_SUCCESS;
}
Все отработало отлично, и теперь наш драйвер стал чуточку полезнее.
На этом вторая часть закончена. Я решил не писать полотна текста, а поставлять информацию небольшими частями. Причин на это несколько:
- Материал не из легких и усвоить все сразу в больших количествах будет сложно, что может отбить интерес.
- Писать небольшие статьи проще и менее ресурсозатратно лично для меня.
В следующей части мы познакомимся с выделением памяти и последующей ее очисткой перед выгрузкой драйвера.
Всем спасибо!
ПС: Как выяснилось книгу «Windows Kernel Programming» перевели на
Ссылка скрыта от гостей
. Спасибо M0r7iF3r за наводку.
При переустановке Windows, особенно в случае, если автоматически устанавливаемые системой драйверы не подходят, либо вовсе не находятся, может иметь смысл экспорт установленных в настоящий момент драйверов для их последующей установки в новой ОС.
В этой инструкции подробно о том, как создать резервную копию драйверов Windows 11 средствами системы без использования сторонних программ, а также их последующей установке на компьютере или ноутбуке. Также может быть полезным: Как создать полную резервную копию Windows 11.
Резервная копия драйверов с помощью DISM
Первый метод — использование утилиты DISM (Deployment Image Servicing and Management). Возможно, утилита вам уже знакома в контексте проверки и восстановления целостности хранилища системных файлов, но она же может быть использована для экспорта драйверов.
Для создания резервной копии драйверов Windows 11 с помощью DISM используйте следующие шаги:
- Создайте папку, в которую будет сохраняться резервная копия драйверов, например, C:\Drivers, можно использовать и внешний накопитель.
- Запустите командную строку от имени администратора. Для этого можно начать вводить в поиске на панели задач «Командная строка», нажать по результату правой кнопкой мыши и выбрать пункт «Запуск от имени администратора». Другие способы запустить командную строку от Администратора в Windows 11.
- Введите команду
dism /online /export-driver /destination:C:\Drivers
заменив C:\Drivers на ваш путь к папке.
- Вы увидите результат экспорта установленных драйверов. В вашем случае список будет не столь коротким, как на скриншоте, будут экспортированы все сторонние драйверы устройств.
В результате драйверы будут сохранены во вложенных папках в указанной вами при экспорте папке.
Понять по имени папки, что именно в ней находится, будет не просто, но это и не обязательно — в дальнейшем, при установке драйверов, нужные будут найдены автоматически, о чём подробнее в разделе инструкции про установку.
Как создать резервную копию драйверов Windows 11 с помощью pnputil
Используя встроенный инструмент pnputil.exe также можно сохранить резервную копию драйверов Windows 11, как, впрочем, и предыдущих версий системы. Необходимые шаги:
- Как и в предыдущем случае, создайте папку для сохранения резервной копии драйверов.
- Запустите командную строку от имени администратора.
- Используйте команду
pnputil.exe /export-driver * c:\drivers
В этом примере резервная копия драйверов будет сохранена в папке C:\Drivers
Останется дождаться завершения экспорта пакетов драйверов в указанную вами папку.
Экспорт драйверов в PowerShell
Внимание: на Windows 11 актуальных версий этот способ по какой-то причине не работает, сообщая об ошибке, хотя справка Майкрософт сообщает, что должен работать именно в нижеприведенном виде. На всякий случай оставлю его здесь, если проблема будет решена в дальнейшем.
Использование команды Windows PowerShell для экспорта драйверов:
- Создайте папку, в которую вы планируете экспортировать драйверы.
- Запустите PowerShell от имени администратора, для этого можно нажать правой кнопкой мыши по кнопке «Пуск» и выбрать пункт «Терминал Windows (Администратор)».
- Введите команду
Export-WindowsDriver -Online -Destination C:\Drivers
изменив путь к папке C:\Drivers на актуальный.
Экспорт драйверов если Windows 11 не запускается: в среде восстановления или с загрузочной флешки
Если Windows не запускается, вы можете запустить командную строку в среде восстановления, либо загрузить компьютер с загрузочной флешки Windows 11 (если в программе установки нажать клавиши Shift+F10, откроется командная строка) и использовать следующий подход для экспорта драйверов:
- В командной строке определите букву диска с системой, она может отличаться от C в рассматриваемой ситуации. Для этого по порядку используйте команды
diskpart list volume exit
и посмотрите текущие буквы разделов диска.
- Создайте папку, куда следует сохранить резервную копию драйверов, для этого можно использовать команду вида: md путь_к_папке
- Используйте команду вида
dism /image:c:\ /export-driver /destination:d:\drivers
где C: следует заменить на актуальную букву диска с системой, драйверы из которой следует экспортировать, а D:\drivers — на путь к папке, созданную на 2-м шаге.
Установка драйверов из резервной копии
В дальнейшем, когда вам потребуется установить драйвер какого-либо устройства, который не установился автоматически, используя ранее созданную резервную копию, достаточно использовать следующий подход:
- Откройте диспетчер устройств (правый клик по кнопке Пуск — Диспетчер устройств).
- Нажмите правой кнопкой мыши по устройству, для которого требуется установить драйвер и выберите пункт контекстного меню «Обновить драйвер».
- Выберите пункт «Найти драйверы на этом компьютере».
- Укажите путь к папке с резервной копии драйверов в поле «Искать драйверы в следующем месте» и оставьте отметку «Включая вложенные папки» включенной.
- Нажмите «Далее» для автоматического поиска подходящего драйвера в папке и его установки.
Более подробно на тему: Как установить драйвер INF в Windows.