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

Posted

技术标签:

【中文标题】使用 INF 文件 c++ 以编程方式安装驱动程序【英文标题】:Installing a driver programmatically using INF file c++ 【发布时间】:2011-06-24 19:55:14 【问题描述】:

这里有人可以告诉我如何安装 3rd 方设备驱动程序 如果提供了所有必需的文件,即 inf 文件、.sys 等,则以编程方式提供。这 此解决方案应在 Windows2000 上运行的最低操作系统。

我尝试将.inf 文件复制到 Win Folder\INF 文件夹和 sys 文件中 进入 Win 文件夹\system32\drivers 但每次插入设备时,windows 弹出 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;

谢谢。

【问题讨论】:

右键点击inf文件,然后点击安装。 @Aristos:你甚至可以使用 Java 机器人为你做这件事 :-) Guyz 感谢您的回复,但驱动程序安装已在 C、C++ 中编程。 【参考方案1】:

是的。你先调用

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 和组。

下一步,您使用以下方式启动驱动程序:

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)

【讨论】:

关于如何从用户模式代码安装和启动驱动程序的非常好的教程 您好,我正在尝试从 SYSTEM 下运行的 Windows 服务安装我的微过滤器驱动程序。问题是我正在使用 C#。我试图调用你提到的方法,尽管我找不到如何调用 SetupInstallFileEx。您知道如何从我的 Windows 服务安装驱动程序吗? 最好使用 C++ StartService 或启动我的驱动程序通常会导致 GenuineIntel.sys 在我的 DriverEntry 因完全未知的原因被调用之前出现蓝屏【参考方案2】:

您可以使用InstallHinfSection。

【讨论】:

我使用批处理文件对其进行了快速测试,但此 API 未在 Windows Vista 上安装驱动程序。当我插入设备时,窗口会弹出 Found New Hardware UI RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection TI3410.Uni 128 C:\\Drivers_Test\\Testusb.inf【参考方案3】:

这可能是你使用的

PBOOL FileWasInUse = FALSE;

。您应该在

中更改它

BOOL FileWasInUse = FALSE;

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

【讨论】:

+1 MSDN说这个参数是必需的,传递一个NULL指针会导致错误87。 你是对的,该功能现在可以正确执行,但是一旦我插入设备,“发现新硬件”向导仍然会弹出。我什至尝试重新启动 PC 并再次插入设备,但结果相同。有没有其他方法可以用来安装驱动程序?? @newdev1:我真的不知道,我只是发现了编程错误。但在我看来,这是一个新问题的好材料!

以上是关于使用 INF 文件 c++ 以编程方式安装驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用 C、C++ 在 Linux 上指定其名称以编程方式检查特定守护程序是不是正在运行?

使用 C++ 以编程方式将新字母分配给现有驱动器

在 C++ 程序中以编程方式检测字节顺序

无法在 Windows 中以编程方式 (C++) 从其他用户帐户读取文件

如何使用 C++ 以编程方式杀死进程?

如何以编程方式访问连接到 Windows 桌面的 iOS 设备的文件系统?