windows - UpdateDriverForPlugAndPlayDevices 错误告诉我我*没有*做我正在做的事情

标签 windows setupapi

我正在研究一种安装驱动程序的方法。由于这必须在多个平台上工作,所以我正在向 devcon 和 dpinst 支付费用,以便在需要时完成驱动程序安装/更新/删除的工作。在测试时,我在向 devcon 进行炮击时遇到了问题。为了隔离,我编写了一个小应用程序来执行 devcon 在更新 see here 中执行的操作,使用 WinDDK 中的 devcon 源作为引用。我在使用 Setup API(实际上是 Newdev.dll 的一部分)的 UpdateDriverForPlugAndPlayDevices() 时遇到一些问题 see here .源代码在这里:

#include <iostream>
#include <Windows.h>
#include <newdev.h>

int main(int argc, char** argv) {
    // Go through the same steps as does dev con for this update crap
    char infFile[MAX_PATH];

    if(3 > argc) {
        std::cerr << "an INF and HW ID must be specified" << std::endl;
        return 1;
    }

    DWORD result(GetFullPathName(argv[1], MAX_PATH, infFile, NULL));
    if((result >= MAX_PATH) || (0 == result)) {
        std::cerr << "path is too long for buffer" << std::endl;
        return 1;
    }

    if(GetFileAttributes(infFile) == -1) {
        std::cerr << "file doesn't exist" << std::endl;
        return 1;
}

    BOOL reboot(FALSE);
    if(!UpdateDriverForPlugAndPlayDevices(NULL, argv[2], infFile, INSTALLFLAG_FORCE, &reboot)) {
        std::cerr << "Failed to install the driver.  Code: "
                  << GetLastError()
                  << std::endl;
        return 2;
}

    if(reboot) {
        std::cout << "A reboot is needed to complete driver install"
                  << std::endl;
    }

    return 0;
}

当 UpdateDriverForPlugAndPlayDevices() 返回 false 时程序失败。然后打印由 GetLastError() 返回的错误代码,这样我就知道出了什么问题。返回的错误代码:259。根据this资源说这是 ERROR_NO_MORE_ITEMS。根据 UpdateDriverForPlugAndPlayDevices() 的链接,此函数在以下情况下返回此错误代码:“函数找到了 HardwareId 值的匹配项,但指定的驱动程序并不比当前驱动程序更匹配,调用者做了 指定 INSTALLFLAG_FORCE 标志。”您会从我的代码中注意到我确实指定了这个标志。

我不知道从这里去哪里。有人可以从这段代码中识别出我缺少的是什么吗?这只是简单的“感觉”,但我完全想念它。

谢谢, 安迪

最佳答案

问题似乎与代码无关,而与 INF 文件有关。有趣的是,该函数的文档说使用该标志将强制安装,但当 INF 文件没有“列出”模型部分中的任何设备类时却没有。这就是我最终能够安装的方式。我将正确的设备类添加到 INF 中的模型部分。


编辑 2020 年 9 月 17 日 就在今天(编辑)有人要求添加 INF 中的示例。我遇到这个问题已经 8 年了,我不再为这个团队工作。然而,尽我所能记忆起,并大量借鉴了 INF Models Section 的文档。和 INF Manufacturers Section ,我希望这会有所帮助。

本质上,类由模型部分指定,而模型由制造商部分指定。

[Manufacturer]
%MfgName%=Standard,NTamd64

[Standard.NTamd64]
%DeviceString%=<class path or GUID>\<device>

[Strings]
MfgName=ACME
DeviceString="Device Type"

关于windows - UpdateDriverForPlugAndPlayDevices 错误告诉我我*没有*做我正在做的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474317/

相关文章:

windows - 如何将 git 添加到 PATH(Windows 上的 Bash)

java - 对于少量 (16 < x < 24) 的同时客户端连接尝试,Windows 主机上的服务器拒绝客户端套接字连接

windows - 更正 Windows API 以查找 CurrentControlSet\Control\MediaProperties?

c - 设置DiGetDeviceRegistryProperty : "The data area passed to a system call is too small" error

c++ - 在Windows下通过system()调用多个命令不起作用

Python Change Master/Application Volume

Windows 帮助文件

cmd - 通过 .inf 以编程方式安装驱动程序导致重启

c++ - SCardGetReaderDeviceInstanceId 的实现

windows - SetupAPI(setupdi 函数)不链接