Windows выгрузить драйвер из памяти

Встроенные средства Windows позволяют создать резервную копию (экспортировать) все установленные на компьютере сторонне драйвера в указанный каталог. Благодаря этому при установке или переустановку Windows вам не придется вручную искать и качать необходимые драйвера.

Содержание:

  • Как экспортировать драйвера из командной строки Windows?
  • Экспорт драйверов с помощью утилиты PNPUtil
  • Установка драйверов из резервной копии в Windows

Как экспортировать драйвера из командной строки Windows?

Чтобы экспортировать все установленные сторонние (не-Microsoft) драйвера Windows в каталог C:\drivers, откройте консоль PowerShell с правами администратора и выполните команду:

Export-WindowsDriver –Online -Destination c:\drivers

Export-WindowsDriver - powershell команда выгрузить все установленные драйвера

Аналогичная команда DISM:

dism /online /export-driver /destination:C:\Drivers

Эти команды извлекают сторонние драйвера из хранилища драйверов (Driver Store) Windows. Каждый драйвер и все связанные с ним файлы (sys, dll, exe, и т.д.) сохраняется в собственный каталог, который называется по имени inf-файла драйвера.

Export-WindowsDriver powershell командлет для создания резервной копии драйверов в Windows со всеми 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

Если нужно извлечь драйвера из офлайн образа 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

pnputil.exe export-driver (сохранить все драйвера в каталог 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

pnputil экспортировать в каталог установленный драйвер windows

Установка драйверов из резервной копии в Windows

После переустановки Windows вы можете использовать каталог с резервной копией драйверов для их установки в чистой системе. Можно установить драйвера по одному. Для этого щелкните правой кнопкой по INF файлу и выберите пункт меню “Установить”.

установить драйвер из 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 отработала.

1.png

Наш драйвер большой молодец: умеет загружаться и выгружаться! Однако, все понимают, да и он сам понимает, что он бесполезен.
Давайте научим его делать что-нибудь. Я бы хотел, чтобы он собирал информацию о системе, на которой он запущен.
Для этого надо проштудировать

Ссылка скрыта от гостей

.
Например, давайте определим какая версия 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 ));

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

2.png

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;
}

Все отработало отлично, и теперь наш драйвер стал чуточку полезнее.
На этом вторая часть закончена. Я решил не писать полотна текста, а поставлять информацию небольшими частями. Причин на это несколько:

  1. Материал не из легких и усвоить все сразу в больших количествах будет сложно, что может отбить интерес.
  2. Писать небольшие статьи проще и менее ресурсозатратно лично для меня.

В следующей части мы познакомимся с выделением памяти и последующей ее очисткой перед выгрузкой драйвера.

Всем спасибо!

ПС: Как выяснилось книгу «Windows Kernel Programming» перевели на

Ссылка скрыта от гостей

. Спасибо M0r7iF3r за наводку.

При переустановке Windows, особенно в случае, если автоматически устанавливаемые системой драйверы не подходят, либо вовсе не находятся, может иметь смысл экспорт установленных в настоящий момент драйверов для их последующей установки в новой ОС.

В этой инструкции подробно о том, как создать резервную копию драйверов Windows 11 средствами системы без использования сторонних программ, а также их последующей установке на компьютере или ноутбуке. Также может быть полезным: Как создать полную резервную копию Windows 11.

Резервная копия драйверов с помощью DISM

Первый метод — использование утилиты DISM (Deployment Image Servicing and Management). Возможно, утилита вам уже знакома в контексте проверки и восстановления целостности хранилища системных файлов, но она же может быть использована для экспорта драйверов.

Для создания резервной копии драйверов Windows 11 с помощью DISM используйте следующие шаги:

  1. Создайте папку, в которую будет сохраняться резервная копия драйверов, например, C:\Drivers, можно использовать и внешний накопитель.
  2. Запустите командную строку от имени администратора. Для этого можно начать вводить в поиске на панели задач «Командная строка», нажать по результату правой кнопкой мыши и выбрать пункт «Запуск от имени администратора». Другие способы запустить командную строку от Администратора в Windows 11.
  3. Введите команду
    dism /online /export-driver /destination:C:\Drivers

    заменив C:\Drivers на ваш путь к папке.

  4. Вы увидите результат экспорта установленных драйверов. В вашем случае список будет не столь коротким, как на скриншоте, будут экспортированы все сторонние драйверы устройств.
    Резервная копия драйверов Windows 11 в DISM

В результате драйверы будут сохранены во вложенных папках в указанной вами при экспорте папке.

Папка с резервной копией драйверов Windows 11

Понять по имени папки, что именно в ней находится, будет не просто, но это и не обязательно — в дальнейшем, при установке драйверов, нужные будут найдены автоматически, о чём подробнее в разделе инструкции про установку.

Как создать резервную копию драйверов Windows 11 с помощью pnputil

Используя встроенный инструмент pnputil.exe также можно сохранить резервную копию драйверов Windows 11, как, впрочем, и предыдущих версий системы. Необходимые шаги:

  1. Как и в предыдущем случае, создайте папку для сохранения резервной копии драйверов.
  2. Запустите командную строку от имени администратора.
  3. Используйте команду
    pnputil.exe /export-driver * c:\drivers

    В этом примере резервная копия драйверов будет сохранена в папке C:\Drivers

    Экспорт драйверов Windows 11 с помощью pnputil

Останется дождаться завершения экспорта пакетов драйверов в указанную вами папку.

Экспорт драйверов в PowerShell

Внимание: на Windows 11 актуальных версий этот способ по какой-то причине не работает, сообщая об ошибке, хотя справка Майкрософт сообщает, что должен работать именно в нижеприведенном виде. На всякий случай оставлю его здесь, если проблема будет решена в дальнейшем.

Использование команды Windows PowerShell для экспорта драйверов:

  1. Создайте папку, в которую вы планируете экспортировать драйверы.
  2. Запустите PowerShell от имени администратора, для этого можно нажать правой кнопкой мыши по кнопке «Пуск» и выбрать пункт «Терминал Windows (Администратор)».
  3. Введите команду
    Export-WindowsDriver -Online -Destination C:\Drivers

    изменив путь к папке C:\Drivers на актуальный.

Экспорт драйверов если Windows 11 не запускается: в среде восстановления или с загрузочной флешки

Если Windows не запускается, вы можете запустить командную строку в среде восстановления, либо загрузить компьютер с загрузочной флешки Windows 11 (если в программе установки нажать клавиши Shift+F10, откроется командная строка) и использовать следующий подход для экспорта драйверов:

  1. В командной строке определите букву диска с системой, она может отличаться от C в рассматриваемой ситуации. Для этого по порядку используйте команды
    diskpart
    list volume
    exit

    и посмотрите текущие буквы разделов диска.

  2. Создайте папку, куда следует сохранить резервную копию драйверов, для этого можно использовать команду вида: md путь_к_папке
  3. Используйте команду вида
    dism /image:c:\ /export-driver /destination:d:\drivers

    где C: следует заменить на актуальную букву диска с системой, драйверы из которой следует экспортировать, а D:\drivers ­— на путь к папке, созданную на 2-м шаге.

Установка драйверов из резервной копии

В дальнейшем, когда вам потребуется установить драйвер какого-либо устройства, который не установился автоматически, используя ранее созданную резервную копию, достаточно использовать следующий подход:

  1. Откройте диспетчер устройств (правый клик по кнопке Пуск — Диспетчер устройств).
  2. Нажмите правой кнопкой мыши по устройству, для которого требуется установить драйвер и выберите пункт контекстного меню «Обновить драйвер».
  3. Выберите пункт «Найти драйверы на этом компьютере».
    Найти драйверы на этом компьютере Windows 11

  4. Укажите путь к папке с резервной копии драйверов в поле «Искать драйверы в следующем месте» и оставьте отметку «Включая вложенные папки» включенной.
    Установка драйверов из папки с резервной копией

  5. Нажмите «Далее» для автоматического поиска подходящего драйвера в папке и его установки.

Более подробно на тему: Как установить драйвер INF в Windows.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Долго появляются значки на рабочем столе windows 10
  • Парсер сайтов для windows
  • Выключается интернет на пару секунд windows 10
  • Все сочетания клавиш на клавиатуре windows 10
  • Usb cdc device driver windows 7