SlavaI
Главный специалист
Offline
|
|
« Ответ #32 : 01-07-2003 12:39 » |
|
А вот новая инфа про установку драйвера- есть в DDK пример Devcon там есть ф-ция cmdInstall, которая позволяет при наличии inf файла загрузить драйвер для устройства даже при отсутствиии этого устройства и даже вроде как создать стек для устройства. Вот ее текст, полный пример смотрите в DDK
int cmdInstall(LPCTSTR BaseName,LPCTSTR Machine,int argc,TCHAR* argv[]) /*++
Routine Description:
INSTALL install a device manually
Arguments:
BaseName - name of executable Machine - machine name, must be NULL argc/argv - remaining parameters
Return Value:
EXIT_xxxx
--*/ { 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(Machine) { // // must be local machine // return EXIT_USAGE; } 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; }
FormatToStream(stdout,MSG_INSTALL_UPDATE); // // update the driver for the device we just created // failcode = cmdUpdate(BaseName,Machine,argc,argv);
final:
if (DeviceInfoSet != INVALID_HANDLE_VALUE) { SetupDiDestroyDeviceInfoList(DeviceInfoSet); }
return failcode; }
|