Программная установка драйвера с использованием INF-файла С++

Может кто-нибудь здесь, пожалуйста, дайте мне знать, как программно установить сторонние драйверы устройств, если предоставлены все необходимые файлы, т.е. файл inf, .sys и т. д. Минимальная операционная система, в которой это решение ДОЛЖНО работать, — Windows2000.

Я попытался скопировать файл .inf в папку Win Folder\INF и файл sys в папку Win\system32\drivers, но каждый раз при подключении устройства всплывает окно Found New Hardware user interface, чего я пытаюсь избежать.

Ниже то, что я пробовал, но функция возвращает error 87 (The parameter is incorrect).

HINF HInf;                
UINT ErrorLine;            
BOOL bRes = FALSE;
PBOOL FileWasInUse = FALSE;

LPCSTR szSourceFileName = _T("C:\\Drivers_HypercomP1320\\hypvcpusb.inf");
LPCSTR szInfFileName  = _T("hypvcpusb.inf");
PVOID Context = NULL;

HInf = SetupOpenInfFile ( szSourceFileName, NULL, INF_STYLE_WIN4, &ErrorLine);          

LPCSTR  SourceFile = ("hypvcp.sys");
LPCSTR SourcePathRoot = _T("C:\\Drivers_HypercomP1320");
LPCSTR DestinationName = _T("C:\\WINDOWS\\system32\\drivers\\hypvcp.sys");

bRes = SetupInstallFileEx ( HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_FORCE_IN_USE,
                            (PSP_FILE_CALLBACK)CopyMsgHandler, Context, FileWasInUse);   

DWORD dwVal = GetLastError();

SetupCloseInfFile(HInf);


// Callback function
UINT CopyMsgHandler (UINT Context, UINT Notification,UINT_PTR Param1, UINT_PTR Param2)
{
    UINT rtnValue = NO_ERROR;
    return rtnValue;
}

Спасибо.


person newdev1    schedule 24.06.2011    source источник
comment
Щелкните правой кнопкой мыши файл inf, затем нажмите «Установить».   -  person Aristos    schedule 24.06.2011
comment
@Aristos: Вы даже можете использовать Java-робота, чтобы сделать это за вас :-)   -  person    schedule 25.06.2011
comment
Гайз, спасибо за ответ, но установка драйверов была программной на C, C++.   -  person newdev1    schedule 25.06.2011


Ответы (3)


Вы можете использовать InstallHinfSection.

person Luke    schedule 24.06.2011
comment
Я быстро протестировал его с помощью пакетного файла, но этот API не устанавливает драйверы в Windows Vista. Когда я подключаю устройство, появляется всплывающее окно Found New Hardware UI RUNDLL32.EXE SETUPAPI.DLL, InstallHinfSection TI3410.Uni 128 C:\\Drivers_Test\\Testusb.inf - person newdev1; 25.06.2011

Это может быть ваше использование

PBOOL FileWasInUse = ЛОЖЬ;

. Вы должны изменить его в

BOOL FileWasInUse = ЛОЖЬ;

и используйте его в вызове функции с &FileWasInUse (обратите внимание на символ &).

person engf-010    schedule 25.06.2011
comment
+1 MSDN говорит, что этот параметр является обязательным, передача указателя NULL вызовет ошибку 87. - person Ben Voigt; 25.06.2011
comment
вы правы, функция теперь выполняется правильно, но как только я подключаю устройство, мастер «Найдено новое оборудование» все равно появляется. Я даже пытался перезагрузить компьютер и снова подключить устройство, но результат тот же. Есть ли другой подход к тому, что можно использовать для установки драйверов?? - person newdev1; 27.06.2011
comment
@newdev1: я действительно не знаю, я только что заметил ошибку программирования. Но мне кажется, это хороший материал для нового вопроса! - person engf-010; 30.06.2011

да. Вы начинаете со звонка

SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (manager)
{
    wprintf(L"Opened SC Manager\n");
}
else
{
    wprintf(L"Open SC Manager failed\n");
    return;
}

Затем, имея файл .inf, сохраненный в szInfFileName, вы вызываете:

HInf = SetupOpenInfFile(szInfFileName.c_str(), NULL, INF_STYLE_WIN4, &ErrorLine);

Затем вы звоните

if (SetupInstallFileEx(HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_NEWER_OR_SAME, NULL, Context, &FileWasInUse) == NULL)

SourceFile = имя файла драйвера (оканчивающееся на .sys) SourcePathRoot = расположение файла драйвера (это может быть путь, по которому запускается ваша программа) DestinationName< /strong> = полный путь к устанавливаемому драйверу (например:

c:\windows\system32\drivers\yourdriver.sys 

Тогда есть Реестр. Вам необходимо добавить запись для вашего водителя в разделе

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\

эта запись (ключ) должна иметь: имя драйвера, отображаемое имя, описание, ErrorControl и группу.

Следующим шагом вы запускаете драйвер, используя:

SC_HANDLE service = CreateService(manager,
                    DRIVER_NAME,
                    DRIVER_NAME,
                    SERVICE_ALL_ACCESS,
                    SERVICE_KERNEL_DRIVER,
                    SERVICE_AUTO_START,
                    SERVICE_ERROR_NORMAL,
                    KeyName,
                    NULL, NULL, NULL, NULL, NULL);

Когда KeyName — это путь к драйверу в System32, как показано в записи реестра. Например:

system32\drivers\yourdriver.sys

Последний шаг:

BOOL result = StartService(service, 0, NULL);

и уборка

CloseServiceHandle(manager)
person Michael Haephrati    schedule 06.11.2016
comment
Действительно хороший учебник о том, как установить и запустить драйвер из кода пользовательского режима. - person Lewis Kelsey; 01.05.2020
comment
Здравствуйте, я пытаюсь установить драйвер минифильтра из службы Windows, работающей в системе. Проблема в том, что я использую С#. Я пытался подключить методы, которые вы упомянули, хотя я не могу найти, как подключить SetupInstallFileEx. У вас есть идеи, как я могу установить драйвер из моей службы Windows? - person Darksody; 07.02.2021
comment
Лучше всего, если вы используете C++ - person Michael Haephrati; 07.02.2021
comment
StartService или запуск моего драйвера в целом вызывает синий экран в GenuineIntel.sys до того, как мой DriverEntry когда-либо вызывается по совершенно неизвестной причине. - person Lewis Kelsey; 14.04.2021