Установка драйвера программно с использованием INF-файла c ++ - PullRequest
5 голосов
/ 24 июня 2011

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

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

Ниже я кое-что попробовал, но функция возвращает 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;
}

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Возможно, вы используете

PBOOL FileWasInUse = FALSE;

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

BOOL FileWasInUse = FALSE;

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

2 голосов
/ 25 июня 2011

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

0 голосов
/ 06 ноября 2016

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

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 = полный путь кустанавливаемый драйвер (например:

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

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

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \

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

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

SC_HANDLE service = CreateService (менеджер, DRIVER_NAME, DRIVER_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, KeyName, NULL, NULL, NULL, NULL, NULL);

, когда путь к ключу в системе равен KeyNameпоявился в записи реестра.Например:

system32\drivers\yourdriver.sys

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

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

и очистка

CloseServiceHandle(manager)
...