Ошибка UpdateDriverForPlugAndPlayDevices говорит мне, что я * не * делаю то, что я

Я работаю над средством установки драйвера. Из-за множества платформ, на которых это должно работать, я рекомендую devcon и dpinst выполнять работу по установке / обновлению / удалению драйверов, когда это необходимо. Во время тестирования у меня возникают проблемы с обстрелом для devcon. Чтобы изолировать, я написал небольшое приложение, чтобы сделать то, что devcon делает в обновлении, смотрите здесь, используя источник devcon из WinDDK для справки. У меня возникли некоторые проблемы с UpdateDriverForPlugAndPlayDevices() из Setup API (на самом деле часть Newdev.dll), смотрите здесь. Исходный код здесь:

#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 ". Из моего кода вы заметите, что я указал этот флаг.

Я не знаю, куда идти отсюда. Может кто-нибудь определить из этого кода, что мне не хватает? Это просто "ощущение" чего-то простого, но я полностью упускаю это.

Спасибо энди

1 ответ

Решение

Проблема оказалась не с кодом, а с файлом INF. Интересно, что в документации по функции сказано, что использование этого флага приведет к принудительной установке, но этого не произошло, когда INF-файл не "перечислил" какие-либо классы устройств в разделе моделей. Вот как я смог установить в конце концов. Я добавил правильный класс устройства в раздел моделей в INF.

Другие вопросы по тегам