Ошибка 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.