2 * SetupAPI device installer
4 * Copyright 2000 Andreas Mohr for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "wine/port.h"
35 #include "wine/debug.h"
36 #include "wine/unicode.h"
41 #include "setupapi_private.h"
44 WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
46 /* Unicode constants */
47 static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
48 static const WCHAR Class[] = {'C','l','a','s','s',0};
49 static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
50 static const WCHAR NoDisplayClass[] = {'N','o','D','i','s','p','l','a','y','C','l','a','s','s',0};
51 static const WCHAR NoInstallClass[] = {'N','o','I','s','t','a','l','l','C','l','a','s','s',0};
52 static const WCHAR NoUseClass[] = {'N','o','U','s','e','C','l','a','s','s',0};
53 static const WCHAR NtExtension[] = {'.','N','T',0};
54 static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',0};
55 static const WCHAR Version[] = {'V','e','r','s','i','o','n',0};
56 static const WCHAR WinExtension[] = {'.','W','i','n',0};
58 /* Registry key and value names */
59 static const WCHAR ControlClass[] = {'S','y','s','t','e','m','\\',
60 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
61 'C','o','n','t','r','o','l','\\',
62 'C','l','a','s','s',0};
64 static const WCHAR DeviceClasses[] = {'S','y','s','t','e','m','\\',
65 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
66 'C','o','n','t','r','o','l','\\',
67 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
69 /***********************************************************************
70 * SetupDiBuildClassInfoList (SETUPAPI.@)
72 BOOL WINAPI SetupDiBuildClassInfoList(
75 DWORD ClassGuidListSize,
79 return SetupDiBuildClassInfoListExW(Flags, ClassGuidList,
80 ClassGuidListSize, RequiredSize,
84 /***********************************************************************
85 * SetupDiBuildClassInfoListExA (SETUPAPI.@)
87 BOOL WINAPI SetupDiBuildClassInfoListExA(
90 DWORD ClassGuidListSize,
95 LPWSTR MachineNameW = NULL;
102 MachineNameW = MultiByteToUnicode(MachineName, CP_ACP);
103 if (MachineNameW == NULL) return FALSE;
106 bResult = SetupDiBuildClassInfoListExW(Flags, ClassGuidList,
107 ClassGuidListSize, RequiredSize,
108 MachineNameW, Reserved);
111 MyFree(MachineNameW);
116 /***********************************************************************
117 * SetupDiBuildClassInfoListExW (SETUPAPI.@)
119 BOOL WINAPI SetupDiBuildClassInfoListExW(
121 LPGUID ClassGuidList,
122 DWORD ClassGuidListSize,
133 DWORD dwGuidListIndex = 0;
137 if (RequiredSize != NULL)
140 hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
145 if (hClassesKey == INVALID_HANDLE_VALUE)
150 for (dwIndex = 0; ; dwIndex++)
153 lError = RegEnumKeyExW(hClassesKey,
161 TRACE("RegEnumKeyExW() returns %ld\n", lError);
162 if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
164 TRACE("Key name: %p\n", szKeyName);
166 if (RegOpenKeyExW(hClassesKey,
172 RegCloseKey(hClassesKey);
176 if (!RegQueryValueExW(hClassKey,
183 TRACE("'NoUseClass' value found!\n");
184 RegCloseKey(hClassKey);
188 if ((Flags & DIBCI_NOINSTALLCLASS) &&
189 (!RegQueryValueExW(hClassKey,
196 TRACE("'NoInstallClass' value found!\n");
197 RegCloseKey(hClassKey);
201 if ((Flags & DIBCI_NODISPLAYCLASS) &&
202 (!RegQueryValueExW(hClassKey,
209 TRACE("'NoDisplayClass' value found!\n");
210 RegCloseKey(hClassKey);
214 RegCloseKey(hClassKey);
216 TRACE("Guid: %p\n", szKeyName);
217 if (dwGuidListIndex < ClassGuidListSize)
219 if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
223 TRACE("Guid: %p\n", &szKeyName[1]);
225 UuidFromStringW(&szKeyName[1],
226 &ClassGuidList[dwGuidListIndex]);
232 if (lError != ERROR_SUCCESS)
236 RegCloseKey(hClassesKey);
238 if (RequiredSize != NULL)
239 *RequiredSize = dwGuidListIndex;
241 if (ClassGuidListSize < dwGuidListIndex)
243 SetLastError(ERROR_INSUFFICIENT_BUFFER);
250 /***********************************************************************
251 * SetupDiClassGuidsFromNameA (SETUPAPI.@)
253 BOOL WINAPI SetupDiClassGuidsFromNameA(
255 LPGUID ClassGuidList,
256 DWORD ClassGuidListSize,
259 return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList,
260 ClassGuidListSize, RequiredSize,
264 /***********************************************************************
265 * SetupDiClassGuidsFromNameW (SETUPAPI.@)
267 BOOL WINAPI SetupDiClassGuidsFromNameW(
269 LPGUID ClassGuidList,
270 DWORD ClassGuidListSize,
273 return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList,
274 ClassGuidListSize, RequiredSize,
278 /***********************************************************************
279 * SetupDiClassGuidsFromNameExA (SETUPAPI.@)
281 BOOL WINAPI SetupDiClassGuidsFromNameExA(
283 LPGUID ClassGuidList,
284 DWORD ClassGuidListSize,
289 LPWSTR ClassNameW = NULL;
290 LPWSTR MachineNameW = NULL;
295 ClassNameW = MultiByteToUnicode(ClassName, CP_ACP);
296 if (ClassNameW == NULL)
301 MachineNameW = MultiByteToUnicode(MachineName, CP_ACP);
302 if (MachineNameW == NULL)
309 bResult = SetupDiClassGuidsFromNameExW(ClassNameW, ClassGuidList,
310 ClassGuidListSize, RequiredSize,
311 MachineNameW, Reserved);
314 MyFree(MachineNameW);
321 /***********************************************************************
322 * SetupDiClassGuidsFromNameExW (SETUPAPI.@)
324 BOOL WINAPI SetupDiClassGuidsFromNameExW(
326 LPGUID ClassGuidList,
327 DWORD ClassGuidListSize,
333 WCHAR szClassName[256];
339 DWORD dwGuidListIndex = 0;
341 if (RequiredSize != NULL)
344 hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
349 if (hClassesKey == INVALID_HANDLE_VALUE)
354 for (dwIndex = 0; ; dwIndex++)
357 lError = RegEnumKeyExW(hClassesKey,
365 TRACE("RegEnumKeyExW() returns %ld\n", lError);
366 if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
368 TRACE("Key name: %p\n", szKeyName);
370 if (RegOpenKeyExW(hClassesKey,
376 RegCloseKey(hClassesKey);
380 dwLength = 256 * sizeof(WCHAR);
381 if (!RegQueryValueExW(hClassKey,
388 TRACE("Class name: %p\n", szClassName);
390 if (strcmpiW(szClassName, ClassName) == 0)
392 TRACE("Found matching class name\n");
394 TRACE("Guid: %p\n", szKeyName);
395 if (dwGuidListIndex < ClassGuidListSize)
397 if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
401 TRACE("Guid: %p\n", &szKeyName[1]);
403 UuidFromStringW(&szKeyName[1],
404 &ClassGuidList[dwGuidListIndex]);
411 RegCloseKey(hClassKey);
414 if (lError != ERROR_SUCCESS)
418 RegCloseKey(hClassesKey);
420 if (RequiredSize != NULL)
421 *RequiredSize = dwGuidListIndex;
423 if (ClassGuidListSize < dwGuidListIndex)
425 SetLastError(ERROR_INSUFFICIENT_BUFFER);
432 /***********************************************************************
433 * SetupDiClassNameFromGuidA (SETUPAPI.@)
435 BOOL WINAPI SetupDiClassNameFromGuidA(
436 const GUID* ClassGuid,
441 return SetupDiClassNameFromGuidExA(ClassGuid, ClassName,
442 ClassNameSize, RequiredSize,
446 /***********************************************************************
447 * SetupDiClassNameFromGuidW (SETUPAPI.@)
449 BOOL WINAPI SetupDiClassNameFromGuidW(
450 const GUID* ClassGuid,
455 return SetupDiClassNameFromGuidExW(ClassGuid, ClassName,
456 ClassNameSize, RequiredSize,
460 /***********************************************************************
461 * SetupDiClassNameFromGuidExA (SETUPAPI.@)
463 BOOL WINAPI SetupDiClassNameFromGuidExA(
464 const GUID* ClassGuid,
475 /***********************************************************************
476 * SetupDiClassNameFromGuidExW (SETUPAPI.@)
478 BOOL WINAPI SetupDiClassNameFromGuidExW(
479 const GUID* ClassGuid,
489 hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
494 if (hKey == INVALID_HANDLE_VALUE)
499 if (RequiredSize != NULL)
502 if (RegQueryValueExW(hKey,
513 *RequiredSize = dwLength / sizeof(WCHAR);
516 dwLength = ClassNameSize * sizeof(WCHAR);
517 if (RegQueryValueExW(hKey,
533 /***********************************************************************
534 * SetupDiCreateDeviceInfoList (SETUPAPI.@)
537 SetupDiCreateDeviceInfoList(const GUID *ClassGuid,
540 return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL);
543 /***********************************************************************
544 * SetupDiCreateDeviceInfoListExA (SETUPAPI.@)
547 SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid,
552 LPWSTR MachineNameW = NULL;
559 MachineNameW = MultiByteToUnicode(MachineName, CP_ACP);
560 if (MachineNameW == NULL)
561 return (HDEVINFO)INVALID_HANDLE_VALUE;
564 hDevInfo = SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent,
565 MachineNameW, Reserved);
568 MyFree(MachineNameW);
573 /***********************************************************************
574 * SetupDiCreateDeviceInfoListExW (SETUPAPI.@)
577 SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid,
583 return (HDEVINFO)INVALID_HANDLE_VALUE;
586 /***********************************************************************
587 * SetupDiDestroyDeviceInfoList (SETUPAPI.@)
589 BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
591 FIXME("%p\n", devinfo);
595 /***********************************************************************
596 * SetupDiEnumDeviceInfo (SETUPAPI.@)
598 BOOL WINAPI SetupDiEnumDeviceInfo(
601 PSP_DEVINFO_DATA info)
603 FIXME("%p %ld %p\n", devinfo, index, info);
607 if(info->cbSize < sizeof(*info))
613 /***********************************************************************
614 * SetupDiEnumDeviceInterfaces (SETUPAPI.@)
616 BOOL WINAPI SetupDiEnumDeviceInterfaces(
617 HDEVINFO DeviceInfoSet,
618 PSP_DEVINFO_DATA DeviceInfoData,
619 CONST GUID * InterfaceClassGuid,
621 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
627 /***********************************************************************
628 * SetupDiGetActualSectionToInstallA (SETUPAPI.@)
630 BOOL WINAPI SetupDiGetActualSectionToInstallA(
632 PCSTR InfSectionName,
633 PSTR InfSectionWithExt,
634 DWORD InfSectionWithExtSize,
642 /***********************************************************************
643 * SetupDiGetActualSectionToInstallW (SETUPAPI.@)
645 BOOL WINAPI SetupDiGetActualSectionToInstallW(
647 PCWSTR InfSectionName,
648 PWSTR InfSectionWithExt,
649 DWORD InfSectionWithExtSize,
653 WCHAR szBuffer[MAX_PATH];
656 LONG lLineCount = -1;
658 lstrcpyW(szBuffer, InfSectionName);
659 dwLength = lstrlenW(szBuffer);
661 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
663 /* Test section name with '.NTx86' extension */
664 lstrcpyW(&szBuffer[dwLength], NtPlatformExtension);
665 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
667 if (lLineCount == -1)
669 /* Test section name with '.NT' extension */
670 lstrcpyW(&szBuffer[dwLength], NtExtension);
671 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
676 /* Test section name with '.Win' extension */
677 lstrcpyW(&szBuffer[dwLength], WinExtension);
678 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
681 if (lLineCount == -1)
683 /* Test section name without extension */
684 szBuffer[dwLength] = 0;
685 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
688 if (lLineCount == -1)
690 SetLastError(ERROR_INVALID_PARAMETER);
694 dwFullLength = lstrlenW(szBuffer);
696 if (InfSectionWithExt != NULL && InfSectionWithExtSize != 0)
698 if (InfSectionWithExtSize < (dwFullLength + 1))
700 SetLastError(ERROR_INSUFFICIENT_BUFFER);
704 lstrcpyW(InfSectionWithExt, szBuffer);
705 if (Extension != NULL)
707 *Extension = (dwLength == dwFullLength) ? NULL : &InfSectionWithExt[dwLength];
711 if (RequiredSize != NULL)
713 *RequiredSize = dwFullLength + 1;
719 /***********************************************************************
720 * SetupDiGetClassDescriptionA (SETUPAPI.@)
722 BOOL WINAPI SetupDiGetClassDescriptionA(
723 const GUID* ClassGuid,
724 PSTR ClassDescription,
725 DWORD ClassDescriptionSize,
728 return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription,
729 ClassDescriptionSize,
730 RequiredSize, NULL, NULL);
733 /***********************************************************************
734 * SetupDiGetClassDescriptionW (SETUPAPI.@)
736 BOOL WINAPI SetupDiGetClassDescriptionW(
737 const GUID* ClassGuid,
738 PWSTR ClassDescription,
739 DWORD ClassDescriptionSize,
742 return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription,
743 ClassDescriptionSize,
744 RequiredSize, NULL, NULL);
747 /***********************************************************************
748 * SetupDiGetClassDescriptionExA (SETUPAPI.@)
750 BOOL WINAPI SetupDiGetClassDescriptionExA(
751 const GUID* ClassGuid,
752 PSTR ClassDescription,
753 DWORD ClassDescriptionSize,
762 /***********************************************************************
763 * SetupDiGetClassDescriptionExW (SETUPAPI.@)
765 BOOL WINAPI SetupDiGetClassDescriptionExW(
766 const GUID* ClassGuid,
767 PWSTR ClassDescription,
768 DWORD ClassDescriptionSize,
776 hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
781 if (hKey == INVALID_HANDLE_VALUE)
783 WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
787 if (RequiredSize != NULL)
790 if (RegQueryValueExW(hKey,
801 *RequiredSize = dwLength / sizeof(WCHAR);
804 dwLength = ClassDescriptionSize * sizeof(WCHAR);
805 if (RegQueryValueExW(hKey,
809 (LPBYTE)ClassDescription,
821 /***********************************************************************
822 * SetupDiGetClassDevsA (SETUPAPI.@)
824 HDEVINFO WINAPI SetupDiGetClassDevsA(
830 FIXME("%s %s %p %08lx\n",debugstr_guid(class),enumstr,parent,flags);
832 return (HDEVINFO) INVALID_HANDLE_VALUE;
835 /***********************************************************************
836 * SetupDiGetClassDevsW (SETUPAPI.@)
838 HDEVINFO WINAPI SetupDiGetClassDevsW(
844 FIXME("%s %s %p %08lx\n",debugstr_guid(class),debugstr_w(enumstr),parent,flags);
846 return (HDEVINFO) INVALID_HANDLE_VALUE;
849 /***********************************************************************
850 * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@)
852 BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(
853 HDEVINFO DeviceInfoSet,
854 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
855 PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData,
856 DWORD DeviceInterfaceDetailDataSize,
858 PSP_DEVINFO_DATA DeviceInfoData)
864 /***********************************************************************
865 * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@)
867 BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(
868 HDEVINFO DeviceInfoSet,
869 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
870 PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData,
871 DWORD DeviceInterfaceDetailDataSize,
873 PSP_DEVINFO_DATA DeviceInfoData)
879 /***********************************************************************
880 * SetupDiGetDeviceRegistryPropertyA (SETUPAPI.@)
882 BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(
884 PSP_DEVINFO_DATA DeviceInfoData,
886 PDWORD PropertyRegDataType,
887 PBYTE PropertyBuffer,
888 DWORD PropertyBufferSize,
891 FIXME("%04lx %p %ld %p %p %ld %p\n", (DWORD)devinfo, DeviceInfoData,
892 Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize,
897 /***********************************************************************
898 * SetupDiInstallClassA (SETUPAPI.@)
900 BOOL WINAPI SetupDiInstallClassA(
906 UNICODE_STRING FileNameW;
909 if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName))
911 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
915 Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue);
917 RtlFreeUnicodeString(&FileNameW);
922 static HKEY CreateClassKey(HINF hInf)
924 WCHAR FullBuffer[MAX_PATH];
925 WCHAR Buffer[MAX_PATH];
929 if (!SetupGetLineTextW(NULL,
937 return INVALID_HANDLE_VALUE;
940 lstrcpyW(FullBuffer, ControlClass);
941 lstrcatW(FullBuffer, Buffer);
943 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
949 if (!SetupGetLineTextW(NULL,
957 return INVALID_HANDLE_VALUE;
960 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
964 REG_OPTION_NON_VOLATILE,
970 return INVALID_HANDLE_VALUE;
975 if (RegSetValueExW(hClassKey,
980 RequiredSize * sizeof(WCHAR)))
982 RegCloseKey(hClassKey);
983 RegDeleteKeyW(HKEY_LOCAL_MACHINE,
985 return INVALID_HANDLE_VALUE;
991 /***********************************************************************
992 * SetupDiInstallClassW (SETUPAPI.@)
994 BOOL WINAPI SetupDiInstallClassW(
1000 WCHAR SectionName[MAX_PATH];
1001 DWORD SectionNameLength = 0;
1003 BOOL bFileQueueCreated = FALSE;
1009 if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
1011 SetLastError(ERROR_INVALID_PARAMETER);
1015 /* Open the .inf file */
1016 hInf = SetupOpenInfFileW(InfFileName,
1020 if (hInf == INVALID_HANDLE_VALUE)
1026 /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */
1027 hClassKey = CreateClassKey(hInf);
1028 if (hClassKey == INVALID_HANDLE_VALUE)
1030 SetupCloseInfFile(hInf);
1035 /* Try to append a layout file */
1037 SetupOpenAppendInfFileW(NULL, hInf, NULL);
1040 /* Retrieve the actual section name */
1041 SetupDiGetActualSectionToInstallW(hInf,
1049 if (!(Flags & DI_NOVCP))
1051 FileQueue = SetupOpenFileQueue();
1052 if (FileQueue == INVALID_HANDLE_VALUE)
1054 SetupCloseInfFile(hInf);
1058 bFileQueueCreated = TRUE;
1063 SetupInstallFromInfSectionW(NULL,
1072 INVALID_HANDLE_VALUE,
1075 /* FIXME: More code! */
1077 if (bFileQueueCreated)
1078 SetupCloseFileQueue(FileQueue);
1080 SetupCloseInfFile(hInf);
1086 /***********************************************************************
1087 * SetupDiOpenClassRegKey (SETUPAPI.@)
1089 HKEY WINAPI SetupDiOpenClassRegKey(
1090 const GUID* ClassGuid,
1093 return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired,
1094 DIOCR_INSTALLER, NULL, NULL);
1098 /***********************************************************************
1099 * SetupDiOpenClassRegKeyExA (SETUPAPI.@)
1101 HKEY WINAPI SetupDiOpenClassRegKeyExA(
1102 const GUID* ClassGuid,
1108 PWSTR MachineNameW = NULL;
1115 MachineNameW = MultiByteToUnicode(MachineName, CP_ACP);
1116 if (MachineNameW == NULL)
1117 return INVALID_HANDLE_VALUE;
1120 hKey = SetupDiOpenClassRegKeyExW(ClassGuid, samDesired,
1121 Flags, MachineNameW, Reserved);
1124 MyFree(MachineNameW);
1130 /***********************************************************************
1131 * SetupDiOpenClassRegKeyExW (SETUPAPI.@)
1133 HKEY WINAPI SetupDiOpenClassRegKeyExW(
1134 const GUID* ClassGuid,
1140 LPWSTR lpGuidString;
1145 if (MachineName != NULL)
1147 FIXME("Remote access not supported yet!\n");
1148 return INVALID_HANDLE_VALUE;
1151 if (Flags == DIOCR_INSTALLER)
1153 lpKeyName = ControlClass;
1155 else if (Flags == DIOCR_INTERFACE)
1157 lpKeyName = DeviceClasses;
1161 ERR("Invalid Flags parameter!\n");
1162 SetLastError(ERROR_INVALID_PARAMETER);
1163 return INVALID_HANDLE_VALUE;
1166 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
1172 return INVALID_HANDLE_VALUE;
1175 if (ClassGuid == NULL)
1178 if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK)
1180 RegCloseKey(hClassesKey);
1184 if (RegOpenKeyExW(hClassesKey,
1190 RpcStringFreeW(&lpGuidString);
1191 RegCloseKey(hClassesKey);
1195 RpcStringFreeW(&lpGuidString);
1196 RegCloseKey(hClassesKey);
1201 /***********************************************************************
1202 * SetupDiOpenDeviceInterfaceW (SETUPAPI.@)
1204 BOOL WINAPI SetupDiOpenDeviceInterfaceW(
1205 HDEVINFO DeviceInfoSet,
1208 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
1210 FIXME("%p %s %08lx %p\n",
1211 DeviceInfoSet, debugstr_w(DevicePath), OpenFlags, DeviceInterfaceData);
1215 /***********************************************************************
1216 * SetupDiOpenDeviceInterfaceA (SETUPAPI.@)
1218 BOOL WINAPI SetupDiOpenDeviceInterfaceA(
1219 HDEVINFO DeviceInfoSet,
1222 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
1224 FIXME("%p %s %08lx %p\n", DeviceInfoSet,
1225 debugstr_a(DevicePath), OpenFlags, DeviceInterfaceData);
1229 /***********************************************************************
1230 * SetupDiSetClassInstallParamsA (SETUPAPI.@)
1232 BOOL WINAPI SetupDiSetClassInstallParamsA(
1233 HDEVINFO DeviceInfoSet,
1234 PSP_DEVINFO_DATA DeviceInfoData,
1235 PSP_CLASSINSTALL_HEADER ClassInstallParams,
1236 DWORD ClassInstallParamsSize)
1238 FIXME("%p %p %x %lu\n",DeviceInfoSet, DeviceInfoData,
1239 ClassInstallParams->InstallFunction, ClassInstallParamsSize);
1243 /***********************************************************************
1244 * SetupDiCallClassInstaller (SETUPAPI.@)
1246 BOOL WINAPI SetupDiCallClassInstaller(
1247 DWORD InstallFunction,
1248 HDEVINFO DeviceInfoSet,
1249 PSP_DEVINFO_DATA DeviceInfoData)
1251 FIXME("%ld %p %p\n", InstallFunction, DeviceInfoSet, DeviceInfoData);
1255 /***********************************************************************
1256 * SetupDiGetDeviceInstallParamsA (SETUPAPI.@)
1258 BOOL WINAPI SetupDiGetDeviceInstallParamsA(
1259 HDEVINFO DeviceInfoSet,
1260 PSP_DEVINFO_DATA DeviceInfoData,
1261 PSP_DEVINSTALL_PARAMS_A DeviceInstallParams)
1263 FIXME("%p %p %p\n", DeviceInfoSet, DeviceInfoData, DeviceInstallParams);
1267 /***********************************************************************
1268 * SetupDiOpenDevRegKey (SETUPAPI.@)
1270 HKEY WINAPI SetupDiOpenDevRegKey(
1271 HDEVINFO DeviceInfoSet,
1272 PSP_DEVINFO_DATA DeviceInfoData,
1278 FIXME("%p %p %ld %ld %ld %lx\n", DeviceInfoSet, DeviceInfoData,
1279 Scope, HwProfile, KeyType, samDesired);
1280 return INVALID_HANDLE_VALUE;