Здравствуйте. Как программно установить WDM драйвер устройства, "находящегося" на шине root? Я разрабатываю программный продукт, создающий виртуальные устройства. Они размещаются на виртуальной шине. Драйвер виртуального устройства устанавливается системой автоматически при обнаружении нового виртуального устройства. А вот драйвер шины устанавливается программно при помещении виртуальной шины на шину root. Под Windows NT всё замечательно работает. Как произвести аналогичные действия в Win98? Проблема в том, что там нет хотя бы UpdateDriverForPlugAndPlayDevices(). Я полагаю, что поставленную задачу можно выполнить, потому что драйвер виртуальной шины прекрасно устанавливается при помощи апплета панели управления "Установка оборудования". Текст программы установки виртуальной шины можно посмотреть в примере TOASTER из DDK. Буду рад любым текстам на любом языке программирования, а также ссылкам и идеям.
Под Win98 вообще толком SetupAPI не функцируют... Я так понимаю устройство не определяется автоматически при подключении (хотябы на уровне Неизвестного устройства)??? Рекомендую читать вот эту статью "Programmatic Installation of Device Drivers on Windows 98 and Windows Millennium Edition Is Not Supported" http://support.microsoft.com/?kbid=324409 Я делал установщик под Win98, но у меня USB девайс подключался и определялся в процессе... как быть если не определяется пока не знаю...
Спасибо за ссылку. Прочёл. Скачал прогу, потом посмотрю её. Пояснения: 1) "Я так понимаю устройство не определяется автоматически при подключении" - не совсем так. Дело в том, что проблема в основном с устройством "Виртуальная Шина", которое виртуально, следовательно не подключается и никак не может определяться системой. Необходимо принудить систему считать, что устройство существует. Эта техника использована в примере TOSATER из DDK для WinXP. Но для Win98 это не работает, хотя бы потому, что в Win98 нет UpdateDriverForPlugAndPlayDevices(). 2) Как я и писал, сделать это возможно, так как установить драйвер для этого виртуального устройства можно используя мастер "Добавление Нового Оборудования". Ведь этот мастер вызывает какие-то функции (а именно: CFGMGR32.DLL - Plug and Play Configuration Manager), являясь процессом уровня пользователя, а значит можно написать аналогичное приложение. Статья Микрософт только подтверждает это. Как там в завершении написано "Не пользуйтесь SetupAPI под Win9X, используйте мастер 'Добавление Оборудования'"
Уверен что как то можно, но сам не пробовал. Мне было достаточно вызова той утилитки blddrv.exe, но собственно все что она делает это строит базу данных драйверов по новой и самостоятельно. Далее после подключения девайса винда лезет в эту базу и ставит нужный драйвер согласно HardwareID... По идее твою проблему это решить не должно... А должно вот что... я этот код до конца не доделал, т.к. мне небыло смысла без наличия физического девайса, а вот тебе пойдет в самый раз... особенно в куче с той утилиткой. Код (Text): int cmdInstall(int argc,TCHAR* argv[]) { HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE; SP_DEVINFO_DATA DeviceInfoData; GUID ClassGUID; TCHAR ClassName[MAX_CLASS_NAME_LEN]; TCHAR hwIdList[LINE_LEN+4]; TCHAR InfPath[MAX_PATH]; DWORD err; int failcode = EXIT_FAIL; BOOL reboot = FALSE; LPCTSTR hwid = NULL; LPCTSTR inf = NULL; DWORD flags = 0; DWORD len; if(argc<2) { // // at least HWID required // return EXIT_USAGE; } inf = argv[0]; if(!inf[0]) { return EXIT_USAGE; } hwid = argv[1]; if(!hwid[0]) { return EXIT_USAGE; } // // Inf must be a full pathname // if(GetFullPathName(inf,MAX_PATH,InfPath,NULL) >= MAX_PATH) { // // inf pathname too long // return EXIT_FAIL; } // // List of hardware ID's must be double zero-terminated // ZeroMemory(hwIdList,sizeof(hwIdList)); lstrcpyn(hwIdList,hwid,LINE_LEN); // // Use the INF File to extract the Class GUID. // if (!SetupDiGetINFClass(InfPath,&ClassGUID,ClassName,sizeof(ClassName)/sizeof(ClassName[0]),0)) { goto final; } // // Create the container for the to-be-created Device Information Element. // DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0); if(DeviceInfoSet == INVALID_HANDLE_VALUE) { goto final; } // // Now create the element. // Use the Class GUID and Name from the INF file. // DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, &ClassGUID, NULL, 0, DICD_GENERATE_ID, &DeviceInfoData)) { goto final; } // // Add the HardwareID to the Device's HardwareID property. // if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)hwIdList, (lstrlen(hwIdList)+1+1)*sizeof(TCHAR))) { goto final; } // // Transform the registry element into an actual devnode // in the PnP HW tree. // if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { goto final; } final: if (DeviceInfoSet != INVALID_HANDLE_VALUE) { SetupDiDestroyDeviceInfoList(DeviceInfoSet); } return failcode; } а вызывать его Код (Text): LPTSTR DevList[2]; strcpy(DevList[0], szInfFileName); //<- full path+name to inf file DevList[1] = "BUS\\VID_xxxx&PID_xxxx"; //<- Full Device/Vendor ID cmdInstall(2,DevList); PS. Могу жестоко ошибаться, но помойму этот код у меня работал в Win98 без проблем
Спасибо, попробую посмотреть, чем приведённый здесь текст отличается от используемого мной И ещё, "ставит нужный драйвер согласно HardwareID" - это как раз то, что нужно запрограммировать. Но в 98 UpdateDriverForPlugAndPlayDevices() нет. Так что буду разбираться.
Этот текст такой же, как и у меня. Он работает, но не совсем так, как надо (показывает окна "Обнаружено новое устройство, выберите драйвер и т.п."). После долгого ковыряния в Win98 решение было найдено мной самостоятельно.