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

时间:2011-06-24 19:55:15

标签: c++ windows drivers

有人可以告诉我如何安装第三方设备驱动程序 以编程方式,如果提供了所有必需的文件,即inf文件,.sys等。该 这个解决方案最小的操作系统应该是Windows2000。

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

以下是我尝试过但该函数返回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 个答案:

答案 0 :(得分:2)

您可以使用InstallHinfSection

答案 1 :(得分:2)

可能是你使用

  

PBOOL FileWasInUse = FALSE;

。您应该在

中进行更改
  

BOOL FileWasInUse = FALSE;

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

答案 2 :(得分:0)

是。首先打电话给

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 \系统\ CurrentControlSet \服务\

此条目(密钥)应具有: 驱动程序名称,显示名称,描述,ErrorControl和Group。

下一步,使用以下命令启动驱动程序:

SC_HANDLE服务= CreateService(经理,                     DRIVER_NAME,                     DRIVER_NAME,                     SERVICE_ALL_ACCESS,                     SERVICE_KERNEL_DRIVER,                     SERVICE_AUTO_START,                     SERVICE_ERROR_NORMAL,                     键名,                     NULL,NULL,NULL,NULL,NULL);

当KeyName是System32下的驱动程序路径时,如注册表项中所示。例如:

system32\drivers\yourdriver.sys

最后一步:

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

并清理

CloseServiceHandle(manager)