4

我正在研究一种安装驱动程序的方法。由于这必须在多个平台上工作,因此我会在需要时让 devcon 和 dpinst 完成驱动程序安装/更新/删除的工作。在测试时,我遇到了对 devcon 的炮击问题。为了隔离,我编写了一个小应用程序来执行 devcon 在更新中所做的事情,请参阅此处,使用 WinDDK 中的 devcon 源代码作为参考。我在使用 Setup API(实际上是 Newdev.dll 的一部分)的 UpdateDriverForPlugAndPlayDevices() 时遇到了一些问题,请参见此处。源代码在这里:

#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。根据这个资源说这是ERROR_NO_MORE_ITEMS。根据 UpdateDriverForPlugAndPlayDevices() 的链接,此函数在以下情况下返回此错误代码:“函数找到了 HardwareId 值的匹配项,但指定的驱动程序不是比当前驱动程序更好的匹配,并且调用者没有指定INSTALLFLAG_FORCE 标志。” 你会从我的代码中注意到我确实指定了这个标志。

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

谢谢你,安迪

4

1 回答 1

3

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


编辑 2020 年 9 月 17 日(编辑)今天有人要求添加 INF 中的示例。我遇到这个问题已经 8 年了,我不再为这个团队工作。但是,据我所知,并大量参考INF 模型部分INF 制造商部分的文档,我希望这会有所帮助。

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

[Manufacturer]
%MfgName%=Standard,NTamd64

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

[Strings]
MfgName=ACME
DeviceString="Device Type"
于 2012-07-17T15:43:54.840 回答