2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS New devices installation
4 * FILE: lib/newdev/newdev.c
5 * PURPOSE: New devices installation
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
18 IN HINSTANCE hInstance
,
19 IN LPCWSTR InstanceId
,
23 SP_DEVINFO_DATA devInfoData
;
27 SP_DRVINFO_DATA drvInfoData
;
30 devInfoData
.cbSize
= 0; /* Tell if the devInfoData is valid */
32 hDevInfo
= SetupDiCreateDeviceInfoListExW(NULL
, NULL
, NULL
, NULL
);
33 if (hDevInfo
== INVALID_HANDLE_VALUE
)
35 DPRINT("SetupDiCreateDeviceInfoListExW() failed with error 0x%lx\n", GetLastError());
40 devInfoData
.cbSize
= sizeof(SP_DEVINFO_DATA
);
41 ret
= SetupDiOpenDeviceInfoW(
49 DPRINT("SetupDiOpenDeviceInfoW() failed with error 0x%lx\n", GetLastError());
50 devInfoData
.cbSize
= 0;
54 SetLastError(ERROR_GEN_FAILURE
);
55 ret
= SetupDiGetDeviceRegistryProperty(
62 if (!ret
&& GetLastError() == ERROR_MORE_DATA
&& regDataType
== REG_SZ
)
64 buffer
= HeapAlloc(GetProcessHeap(), 0, requiredSize
);
67 DPRINT("HeapAlloc() failed\n");
68 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
72 ret
= SetupDiGetDeviceRegistryProperty(
83 DPRINT("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx\n", GetLastError());
87 DPRINT("Installing %s (%S)\n", buffer
, InstanceId
);
89 ret
= SetupDiBuildDriverInfoList(hDevInfo
, &devInfoData
, SPDIT_COMPATDRIVER
);
92 DPRINT("SetupDiBuildDriverInfoList() failed with error 0x%lx\n", GetLastError());
96 drvInfoData
.cbSize
= sizeof(SP_DRVINFO_DATA
);
97 ret
= SetupDiEnumDriverInfo(
105 DPRINT("SetupDiEnumDriverInfo() failed with error 0x%lx\n", GetLastError());
108 DPRINT("Installing driver %s: %s\n", drvInfoData
.MfgName
, drvInfoData
.Description
);
110 ret
= SetupDiCallClassInstaller(
111 DIF_SELECTBESTCOMPATDRV
,
116 DPRINT("SetupDiCallClassInstaller(DIF_SELECTBESTCOMPATDRV) failed with error 0x%lx\n", GetLastError());
120 ret
= SetupDiCallClassInstaller(
126 DPRINT("SetupDiCallClassInstaller(DIF_ALLOW_INSTALL) failed with error 0x%lx\n", GetLastError());
130 ret
= SetupDiCallClassInstaller(
131 DIF_NEWDEVICEWIZARD_PREANALYZE
,
136 DPRINT("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_PREANALYZE) failed with error 0x%lx\n", GetLastError());
140 ret
= SetupDiCallClassInstaller(
141 DIF_NEWDEVICEWIZARD_POSTANALYZE
,
146 DPRINT("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_POSTANALYZE) failed with error 0x%lx\n", GetLastError());
150 ret
= SetupDiCallClassInstaller(
151 DIF_INSTALLDEVICEFILES
,
156 DPRINT("SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES) failed with error 0x%lx\n", GetLastError());
160 ret
= SetupDiCallClassInstaller(
161 DIF_REGISTER_COINSTALLERS
,
166 DPRINT("SetupDiCallClassInstaller(DIF_REGISTER_COINSTALLERS) failed with error 0x%lx\n", GetLastError());
170 ret
= SetupDiCallClassInstaller(
171 DIF_INSTALLINTERFACES
,
176 DPRINT("SetupDiCallClassInstaller(DIF_INSTALLINTERFACES) failed with error 0x%lx\n", GetLastError());
180 ret
= SetupDiCallClassInstaller(
186 DPRINT("SetupDiCallClassInstaller(DIF_INSTALLDEVICE) failed with error 0x%lx\n", GetLastError());
190 ret
= SetupDiCallClassInstaller(
191 DIF_NEWDEVICEWIZARD_FINISHINSTALL
,
196 DPRINT("SetupDiCallClassInstaller(DIF_NEWDEVICEWIZARD_FINISHINSTALL) failed with error 0x%lx\n", GetLastError());
200 ret
= SetupDiCallClassInstaller(
201 DIF_DESTROYPRIVATEDATA
,
206 DPRINT("SetupDiCallClassInstaller(DIF_DESTROYPRIVATEDATA) failed with error 0x%lx\n", GetLastError());
211 if (devInfoData
.cbSize
!= 0)
213 if (!SetupDiDestroyDriverInfoList(hDevInfo
, &devInfoData
, SPDIT_COMPATDRIVER
))
214 DPRINT("SetupDiDestroyDriverInfoList() failed with error 0x%lx\n", GetLastError());
217 if (hDevInfo
!= INVALID_HANDLE_VALUE
)
219 if (!SetupDiDestroyDeviceInfoList(hDevInfo
))
220 DPRINT("SetupDiDestroyDeviceInfoList() failed with error 0x%lx\n", GetLastError());
224 HeapFree(GetProcessHeap(), 0, buffer
);