使用INF文件c++以编程方式安装驱动程序

Installing a driver programmatically using INF file c++

本文关键字:方式 安装 驱动程序 编程 INF 文件 c++ 使用      更新时间:2023-10-16

这里有人能告诉我如何安装第三方设备驱动程序吗如果提供了所有所需的文件,即inf文件、.sys等,则以编程方式。这个此解决方案应使用的最低操作系统是Windows2000。

我尝试将.inf文件复制到Win Folder\INF文件夹和sys文件中进入Win文件夹\system32\drivers,但每次插入设备时,窗口弹出"找到新硬件"用户界面,这正是我试图避免的。

以下是我尝试过的内容,但函数返回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;
}

谢谢。

是。你首先打电话给

SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (manager)
{
    wprintf(L"Opened SC Managern");
}
else
{
    wprintf(L"Open SC Manager failedn");
    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:windowssystem32driversyourdriver.sys 

然后是注册表。你需要在下为你的司机添加一个条目

HKEY_LOCAL_MACHINESystemCurrentControlSetServices

此条目(密钥)应具有:驱动程序名称、显示名称、说明、ErrorControl和Group。

下一步,您使用启动驱动程序

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下的驱动程序路径时,如注册表项中所示。例如:

system32driversyourdriver.sys

最后一步:

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

和清理

CloseServiceHandle(manager)

您可以使用InstallHinfSection。

这可能是您使用

PBOOL FileWasInUse=FALSE;

你应该在中更改它

BOOL FileWasInUse=FALSE;

并在函数调用中使用&FileWasInUse(注意&-字符)。