Пытаюсь программно установить драйвер из первого примера Солдатова (есть inf и sys) Ниже код на Delphi. Здесь ошибка возвращается функцией SetupDiSetDeviceRegistryProperty Код (Text): unit setupinf; interface uses Windows, kol, logging; function InstallRootEnumeratedDriver(HardwareId, INFFile: Pchar; RebootRequired: PBOOL): DWORD; function LoadSetupApi: Boolean; procedure UnloadSetupApi; function LoadNewDev: Boolean; procedure UnloadNewDev; implementation const MAX_CLASS_NAME_LEN = 32; DIGCF_PRESENT = $00000002; DIGCF_ALLCLASSES = $00000004; SPDRP_DEVICEDESC = $00000000; // DeviceDesc (R/W) SPDRP_HARDWAREID = $00000001; // HardwareID (R/W) SPDRP_COMPATIBLEIDS = $00000002; // CompatibleIDs (R/W) SPDRP_UNUSED0 = $00000003; // unused SPDRP_SERVICE = $00000004; // Service (R/W) SPDRP_UNUSED1 = $00000005; // unused SPDRP_UNUSED2 = $00000006; // unused SPDRP_CLASS = $00000007; // Class (R--tied to ClassGUID) SPDRP_CLASSGUID = $00000008; // ClassGUID (R/W) SPDRP_DRIVER = $00000009; // Driver (R/W) SPDRP_CONFIGFLAGS = $0000000A; // ConfigFlags (R/W) SPDRP_MFG = $0000000B; // Mfg (R/W) SPDRP_FRIENDLYNAME = $0000000C; // FriendlyName (R/W) SPDRP_LOCATION_INFORMATION = $0000000D; // LocationInformation (R/W) SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = $0000000E; // PhysicalDeviceObjectName (R) SPDRP_CAPABILITIES = $0000000F; // Capabilities (R) SPDRP_UI_NUMBER = $00000010; // UiNumber (R) SPDRP_UPPERFILTERS = $00000011; // UpperFilters (R/W) SPDRP_LOWERFILTERS = $00000012; // LowerFilters (R/W) SPDRP_BUSTYPEGUID = $00000013; // BusTypeGUID (R) SPDRP_LEGACYBUSTYPE = $00000014; // LegacyBusType (R) SPDRP_BUSNUMBER = $00000015; // BusNumber (R) SPDRP_ENUMERATOR_NAME = $00000016; // Enumerator Name (R) SPDRP_SECURITY = $00000017; // Security (R/W, binary form) SPDRP_SECURITY_SDS = $00000018; // Security (W, SDS form) SPDRP_DEVTYPE = $00000019; // Device Type (R/W) SPDRP_EXCLUSIVE = $0000001A; // Device is exclusive-access (R/W) SPDRP_CHARACTERISTICS = $0000001B; // Device Characteristics (R/W) DICD_GENERATE_ID = $00000001; DIF_REGISTERDEVICE = $00000019; DIF_REMOVE = $00000005; INSTALLFLAG_FORCE = $00000001; type ULONG_PTR = DWORD; DI_FUNCTION = UINT; // Function type for device installer // // Define type for reference to device information set // HDEVINFO = Pointer; // // Device information structure (references a device instance // that is a member of a device information set) // PSPDevInfoData = ^TSPDevInfoData; SP_DEVINFO_DATA = packed record cbSize: DWORD; ClassGuid: TGUID; DevInst: DWORD; // DEVINST handle Reserved: ULONG_PTR; end; {$EXTERNALSYM SP_DEVINFO_DATA} TSPDevInfoData = SP_DEVINFO_DATA; TSetupDiGetClassDevsA = function(ClassGuid: PGUID; const Enumerator: PAnsiChar; hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; TSetupDiGetClassDevs = TSetupDiGetClassDevsA; TSetupDiEnumDeviceInfo = function(DeviceInfoSet: HDEVINFO; MemberIndex: DWORD; var DeviceInfoData: TSPDevInfoData): LongBool; stdcall; TSetupDiGetDeviceRegistryPropertyA = function(DeviceInfoSet: HDEVINFO; const DeviceInfoData: TSPDevInfoData; Property_: DWORD; var PropertyRegDataType: DWORD; PropertyBuffer: PBYTE; PropertyBufferSize: DWORD; var RequiredSize: DWORD): LongBool; stdcall; TSetupDiGetDeviceRegistryProperty = TSetupDiGetDeviceRegistryPropertyA; TSetupDiDestroyDeviceInfoList = function(DeviceInfoSet: HDEVINFO): LongBool; stdcall; TSetupDiGetINFClassA = function(const InfName: PAnsiChar; var ClassGuid: TGUID; ClassName: PAnsiChar; ClassNameSize: DWORD; RequiredSize: PDWORD): LongBool; stdcall; TSetupDiGetINFClass = TSetupDiGetINFClassA; TSetupDiCreateDeviceInfoList = function(ClassGuid: PGUID; hwndParent: HWND): HDEVINFO; stdcall; TSetupDiCreateDeviceInfoA = function(DeviceInfoSet: HDEVINFO; const DeviceName: PAnsiChar; var ClassGuid: TGUID; const DeviceDescription: PAnsiChar; hwndParent: HWND; CreationFlags: DWORD; DeviceInfoData: PSPDevInfoData): LongBool; stdcall; TSetupDiCreateDeviceInfo = TSetupDiCreateDeviceInfoA; TSetupDiSetDeviceRegistryPropertyA = function(DeviceInfoSet: HDEVINFO; var DeviceInfoData: TSPDevInfoData; Property_: DWORD; const PropertyBuffer: PBYTE; PropertyBufferSize: DWORD): LongBool; stdcall; TSetupDiSetDeviceRegistryProperty = TSetupDiSetDeviceRegistryPropertyA; TSetupDiCallClassInstaller = function(InstallFunction: DI_FUNCTION; DeviceInfoSet: HDEVINFO; DeviceInfoData: PSPDevInfoData): LongBool; stdcall; TUpdateDriverForPlugAndPlayDevicesA = function(hwndParent: THandle; HardwareId: Pchar; FullInfPath: Pchar; InstallFlags: DWORD; bRebootRequired: PBOOL ): BOOL; stdcall; var SetupDiGetClassDevs: TSetupDiGetClassDevs; SetupDiEnumDeviceInfo: TSetupDiEnumDeviceInfo; SetupDiGetDeviceRegistryProperty: TSetupDiGetDeviceRegistryProperty; SetupDiDestroyDeviceInfoList: TSetupDiDestroyDeviceInfoList; SetupDiGetINFClass: TSetupDiGetINFClass; SetupDiCreateDeviceInfoList: TSetupDiCreateDeviceInfoList; SetupDiCreateDeviceInfo: TSetupDiCreateDeviceInfo; SetupDiSetDeviceRegistryProperty: TSetupDiSetDeviceRegistryProperty; SetupDiCallClassInstaller: TSetupDiCallClassInstaller; UpdateDriverForPlugAndPlayDevices: TUpdateDriverForPlugAndPlayDevicesA; const SetupApiModuleName = 'SetupApi.dll'; NewDevModuleName = 'newdev.dll'; var SetupApiLib: THandle = 0; NewDevLib: THandle = 0; function LoadSetupApi: Boolean; begin Result := False; if SetupApiLib = 0 then SetupApiLib := LoadLibrary(SetupApiModuleName); if SetupApiLib = 0 then Exit; try @SetupDiGetClassDevs := GetProcAddress(SetupApiLib, 'SetupDiGetClassDevsA'); @SetupDiEnumDeviceInfo := GetProcAddress(SetupApiLib, 'SetupDiEnumDeviceInfo'); @SetupDiGetDeviceRegistryProperty := GetProcAddress(SetupApiLib, 'SetupDiGetDeviceRegistryPropertyA'); @SetupDiDestroyDeviceInfoList := GetProcAddress(SetupApiLib, 'SetupDiDestroyDeviceInfoList'); @SetupDiGetINFClass := GetProcAddress(SetupApiLib, 'SetupDiGetINFClassA'); @SetupDiCreateDeviceInfoList := GetProcAddress(SetupApiLib, 'SetupDiCreateDeviceInfoList'); @SetupDiCreateDeviceInfo := GetProcAddress(SetupApiLib, 'SetupDiCreateDeviceInfoA'); @SetupDiSetDeviceRegistryProperty := GetProcAddress(SetupApiLib, 'SetupDiSetDeviceRegistryPropertyA'); @SetupDiCallClassInstaller := GetProcAddress(SetupApiLib, 'SetupDiCallClassInstaller'); except if SetupApiLib <> 0 then FreeLibrary(SetupApiLib); Exit; end; Result := True; end; procedure UnloadSetupApi; begin if SetupApiLib <> 0 then FreeLibrary(SetupApiLib); @SetupDiGetClassDevs := nil; @SetupDiEnumDeviceInfo := nil; @SetupDiGetDeviceRegistryProperty := nil; @SetupDiDestroyDeviceInfoList := nil; @SetupDiGetINFClass := nil; @SetupDiCreateDeviceInfoList := nil; @SetupDiCreateDeviceInfo := nil; @SetupDiSetDeviceRegistryProperty := nil; @SetupDiCallClassInstaller := nil; end; function LoadNewDev: Boolean; begin Result := False; if NewDevLib = 0 then NewDevLib := LoadLibrary(NewDevModuleName); if NewDevLib = 0 then Exit; try @UpdateDriverForPlugAndPlayDevices := GetProcAddress(NewDevLib, 'UpdateDriverForPlugAndPlayDevicesA'); except if NewDevLib <> 0 then FreeLibrary(NewDevLib); Exit; end; end; procedure UnloadNewDev; begin if NewDevLib <> 0 then FreeLibrary(NewDevLib); @UpdateDriverForPlugAndPlayDevices := nil; end; function InstallRootEnumeratedDriver(HardwareId, INFFile: Pchar; RebootRequired: PBOOL): DWORD; var r: DWORD; DeviceInfoSet: HDEVINFO; DeviceInfoData: SP_DEVINFO_DATA; ClassGUID: TGUID; ClassName: array[0..MAX_CLASS_NAME_LEN - 1] of char; label TheEnd; begin r := 0; DeviceInfoSet := nil; // ïîëó÷åíèå èìåíè è guid êëàññà óñòðîéñòâà èç inf-ôàéëà if (not SetupDiGetINFClass(INFFile, ClassGUID, ClassName, sizeof(ClassName), nil)) then begin r := GetLastError(); goto TheEnd; end; // ñîçäàíèå ïóñòîãî íàáîðà èíôîðìàöèè îá óñòðîéñòâå (ñïèñîê ýëåìåíòîâ) DeviceInfoSet := SetupDiCreateDeviceInfoList(@ClassGUID, 0); if (DWORD(DeviceInfoSet) = INVALID_HANDLE_VALUE) then begin LogFile('SetupDiCreateDeviceInfoList'); r := GetLastError(); goto TheEnd; end; // ñîçäàíèå íîâîãî ýëåìåíòà (õýíäë óñòðîéñòâà è ñïèñîê âñåõ èíòåðôåéñîâ // äëÿ íåãî), èñïîëüçóÿ èìÿ è GUID óñòðîéñòâà DeviceInfoData.cbSize := sizeof(SP_DEVINFO_DATA); if (not SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, ClassGUID, nil, 0, DICD_GENERATE_ID, @DeviceInfoData)) then begin LogFile('SetupDiCreateDeviceInfo'); r := GetLastError(); goto TheEnd; end; // äîáàâëåíèå â ðååñòð èíôîðìàöèè îá óñòðîéñòâå ïî åãî ñâîéñòâó HardwareID if (not SetupDiSetDeviceRegistryProperty(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, PBYTE(HardwareId), (lstrlen(HardwareId) + 1 + 1) * sizeof(CHAR))) then begin r := GetLastError(); LogFile('SetupDiSetDeviceRegistryProperty: %s', [SysErrorMessage(r)]); goto TheEnd; end; // Transform the registry element into an actual devnode in the PnP HW tree. if (not SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, @DeviceInfoData)) then begin LogFile('SetupDiCallClassInstaller'); r := GetLastError(); goto TheEnd; end; // The element is now registered. We must explicitly remove the // device using DIF_REMOVE, if we encounter any failure from now on. // Install the Driver. if (not UpdateDriverForPlugAndPlayDevices(0, HardwareId, INFFile, INSTALLFLAG_FORCE, RebootRequired)) then begin r := GetLastError(); LogFile('UpdateDriverForPlugAndPlayDevices: %s', [SysErrorMessage(r)]); if (not SetupDiCallClassInstaller( DIF_REMOVE, DeviceInfoSet, @DeviceInfoData)) then begin LogFile('SetupDiCallClassInstaller: %s', [SysErrorMessage(GetLastError())]); end; SetLastError(r); goto TheEnd; end; TheEnd: SetupDiDestroyDeviceInfoList(DeviceInfoSet); Result := r; end; end. А вот сама установка: Код (Text): var bReboot: BOOL = true; .... LoadSetupApi(); LoadNewDev; InstallRootEnumeratedDriver('Example', 'C:\test\Example.inf' ,@bReboot); UnloadNewDev; UnloadSetupApi(); C драйверами только начал разбираться. Помогите разобраться с примером...
Ну зачем вываливать тут эту груду кода? Надо маленький кусочек, что именно Вам не понятно или где ошибочный вызов функции. А тут люди занятые все, и некогда им читать горы делфийского кода, который должен быть написан на сях.
Все, разобрался. Это оказывается inf файл был какой-то не такой. devcon тоже не мог его установить, хотя Мастер нового оборудования нормально ставит. Сгенерировал новый программой GenInf и все стало нормально. И еще исправил SetupDiSetDeviceRegistryProperty(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, PBYTE(HardwareId), (lstrlen(HardwareId) + 1 + 1) * sizeof(CHAR)) на SetupDiSetDeviceRegistryProperty(DeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, PBYTE(HardwareId), (lstrlen(HardwareId) + 1 + 1) * sizeof(CHAR) * 2)