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"
42 WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
44 /* Unicode constants */
45 static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
46 static const WCHAR Class[] = {'C','l','a','s','s',0};
47 static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
48 static const WCHAR NoDisplayClass[] = {'N','o','D','i','s','p','l','a','y','C','l','a','s','s',0};
49 static const WCHAR NoInstallClass[] = {'N','o','I','s','t','a','l','l','C','l','a','s','s',0};
50 static const WCHAR NoUseClass[] = {'N','o','U','s','e','C','l','a','s','s',0};
51 static const WCHAR NtExtension[] = {'.','N','T',0};
52 static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',0};
53 static const WCHAR Version[] = {'V','e','r','s','i','o','n',0};
54 static const WCHAR WinExtension[] = {'.','W','i','n',0};
56 /* Registry key and value names */
57 static const WCHAR ControlClass[] = {'S','y','s','t','e','m','\\',
58 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
59 'C','o','n','t','r','o','l','\\',
60 'C','l','a','s','s',0};
62 static const WCHAR DeviceClasses[] = {'S','y','s','t','e','m','\\',
63 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
64 'C','o','n','t','r','o','l','\\',
65 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
67 /***********************************************************************
68 * SetupDiBuildClassInfoList (SETUPAPI.@)
70 BOOL WINAPI SetupDiBuildClassInfoList(
73 DWORD ClassGuidListSize,
77 return SetupDiBuildClassInfoListExW(Flags, ClassGuidList,
78 ClassGuidListSize, RequiredSize,
82 /***********************************************************************
83 * SetupDiBuildClassInfoListExA (SETUPAPI.@)
85 BOOL WINAPI SetupDiBuildClassInfoListExA(
88 DWORD ClassGuidListSize,
97 /***********************************************************************
98 * SetupDiBuildClassInfoListExW (SETUPAPI.@)
100 BOOL WINAPI SetupDiBuildClassInfoListExW(
102 LPGUID ClassGuidList,
103 DWORD ClassGuidListSize,
114 DWORD dwGuidListIndex = 0;
118 if (RequiredSize != NULL)
121 hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
126 if (hClassesKey == INVALID_HANDLE_VALUE)
131 for (dwIndex = 0; ; dwIndex++)
134 lError = RegEnumKeyExW(hClassesKey,
142 TRACE("RegEnumKeyExW() returns %ld\n", lError);
143 if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
145 TRACE("Key name: %p\n", szKeyName);
147 if (RegOpenKeyExW(hClassesKey,
153 RegCloseKey(hClassesKey);
157 if (!RegQueryValueExW(hClassKey,
164 TRACE("'NoUseClass' value found!\n");
165 RegCloseKey(hClassKey);
169 if ((Flags & DIBCI_NOINSTALLCLASS) &&
170 (!RegQueryValueExW(hClassKey,
177 TRACE("'NoInstallClass' value found!\n");
178 RegCloseKey(hClassKey);
182 if ((Flags & DIBCI_NODISPLAYCLASS) &&
183 (!RegQueryValueExW(hClassKey,
190 TRACE("'NoDisplayClass' value found!\n");
191 RegCloseKey(hClassKey);
195 RegCloseKey(hClassKey);
197 TRACE("Guid: %p\n", szKeyName);
198 if (dwGuidListIndex < ClassGuidListSize)
200 if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
204 TRACE("Guid: %p\n", &szKeyName[1]);
206 UuidFromStringW(&szKeyName[1],
207 &ClassGuidList[dwGuidListIndex]);
213 if (lError != ERROR_SUCCESS)
217 RegCloseKey(hClassesKey);
219 if (RequiredSize != NULL)
220 *RequiredSize = dwGuidListIndex;
222 if (ClassGuidListSize < dwGuidListIndex)
224 SetLastError(ERROR_INSUFFICIENT_BUFFER);
231 /***********************************************************************
232 * SetupDiClassGuidsFromNameA (SETUPAPI.@)
234 BOOL WINAPI SetupDiClassGuidsFromNameA(
236 LPGUID ClassGuidList,
237 DWORD ClassGuidListSize,
240 return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList,
241 ClassGuidListSize, RequiredSize,
245 /***********************************************************************
246 * SetupDiClassGuidsFromNameW (SETUPAPI.@)
248 BOOL WINAPI SetupDiClassGuidsFromNameW(
250 LPGUID ClassGuidList,
251 DWORD ClassGuidListSize,
254 return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList,
255 ClassGuidListSize, RequiredSize,
259 /***********************************************************************
260 * SetupDiClassGuidsFromNameExA (SETUPAPI.@)
262 BOOL WINAPI SetupDiClassGuidsFromNameExA(
264 LPGUID ClassGuidList,
265 DWORD ClassGuidListSize,
274 /***********************************************************************
275 * SetupDiClassGuidsFromNameExW (SETUPAPI.@)
277 BOOL WINAPI SetupDiClassGuidsFromNameExW(
279 LPGUID ClassGuidList,
280 DWORD ClassGuidListSize,
286 WCHAR szClassName[256];
292 DWORD dwGuidListIndex = 0;
294 if (RequiredSize != NULL)
297 hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
302 if (hClassesKey == INVALID_HANDLE_VALUE)
307 for (dwIndex = 0; ; dwIndex++)
310 lError = RegEnumKeyExW(hClassesKey,
318 TRACE("RegEnumKeyExW() returns %ld\n", lError);
319 if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
321 TRACE("Key name: %p\n", szKeyName);
323 if (RegOpenKeyExW(hClassesKey,
329 RegCloseKey(hClassesKey);
333 dwLength = 256 * sizeof(WCHAR);
334 if (!RegQueryValueExW(hClassKey,
341 TRACE("Class name: %p\n", szClassName);
343 if (strcmpiW(szClassName, ClassName) == 0)
345 TRACE("Found matching class name\n");
347 TRACE("Guid: %p\n", szKeyName);
348 if (dwGuidListIndex < ClassGuidListSize)
350 if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
354 TRACE("Guid: %p\n", &szKeyName[1]);
356 UuidFromStringW(&szKeyName[1],
357 &ClassGuidList[dwGuidListIndex]);
364 RegCloseKey(hClassKey);
367 if (lError != ERROR_SUCCESS)
371 RegCloseKey(hClassesKey);
373 if (RequiredSize != NULL)
374 *RequiredSize = dwGuidListIndex;
376 if (ClassGuidListSize < dwGuidListIndex)
378 SetLastError(ERROR_INSUFFICIENT_BUFFER);
385 /***********************************************************************
386 * SetupDiClassNameFromGuidA (SETUPAPI.@)
388 BOOL WINAPI SetupDiClassNameFromGuidA(
389 const GUID* ClassGuid,
394 return SetupDiClassNameFromGuidExA(ClassGuid, ClassName,
395 ClassNameSize, RequiredSize,
399 /***********************************************************************
400 * SetupDiClassNameFromGuidW (SETUPAPI.@)
402 BOOL WINAPI SetupDiClassNameFromGuidW(
403 const GUID* ClassGuid,
408 return SetupDiClassNameFromGuidExW(ClassGuid, ClassName,
409 ClassNameSize, RequiredSize,
413 /***********************************************************************
414 * SetupDiClassNameFromGuidExA (SETUPAPI.@)
416 BOOL WINAPI SetupDiClassNameFromGuidExA(
417 const GUID* ClassGuid,
428 /***********************************************************************
429 * SetupDiClassNameFromGuidExW (SETUPAPI.@)
431 BOOL WINAPI SetupDiClassNameFromGuidExW(
432 const GUID* ClassGuid,
442 hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
447 if (hKey == INVALID_HANDLE_VALUE)
452 if (RequiredSize != NULL)
455 if (RegQueryValueExW(hKey,
466 *RequiredSize = dwLength / sizeof(WCHAR);
469 dwLength = ClassNameSize * sizeof(WCHAR);
470 if (RegQueryValueExW(hKey,
486 /***********************************************************************
487 * SetupDiCreateDeviceInfoList (SETUPAPI.@)
490 SetupDiCreateDeviceInfoList(const GUID *ClassGuid,
493 return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL);
496 /***********************************************************************
497 * SetupDiCreateDeviceInfoListExA (SETUPAPI.@)
500 SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid,
506 return (HDEVINFO)INVALID_HANDLE_VALUE;
509 /***********************************************************************
510 * SetupDiCreateDeviceInfoListExW (SETUPAPI.@)
513 SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid,
519 return (HDEVINFO)INVALID_HANDLE_VALUE;
522 /***********************************************************************
523 * SetupDiDestroyDeviceInfoList (SETUPAPI.@)
525 BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
527 FIXME("%p\n", devinfo);
531 /***********************************************************************
532 * SetupDiEnumDeviceInfo (SETUPAPI.@)
534 BOOL WINAPI SetupDiEnumDeviceInfo(
537 PSP_DEVINFO_DATA info)
539 FIXME("%p %ld %p\n", devinfo, index, info);
543 if(info->cbSize < sizeof(*info))
549 /***********************************************************************
550 * SetupDiEnumDeviceInterfaces (SETUPAPI.@)
552 BOOL WINAPI SetupDiEnumDeviceInterfaces(
553 HDEVINFO DeviceInfoSet,
554 PSP_DEVINFO_DATA DeviceInfoData,
555 CONST GUID * InterfaceClassGuid,
557 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
563 /***********************************************************************
564 * SetupDiGetActualSectionToInstallA (SETUPAPI.@)
566 BOOL WINAPI SetupDiGetActualSectionToInstallA(
568 PCSTR InfSectionName,
569 PSTR InfSectionWithExt,
570 DWORD InfSectionWithExtSize,
578 /***********************************************************************
579 * SetupDiGetActualSectionToInstallW (SETUPAPI.@)
581 BOOL WINAPI SetupDiGetActualSectionToInstallW(
583 PCWSTR InfSectionName,
584 PWSTR InfSectionWithExt,
585 DWORD InfSectionWithExtSize,
589 WCHAR szBuffer[MAX_PATH];
590 OSVERSIONINFOW OsVersionInfo;
593 LONG lLineCount = -1;
595 OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
596 if (!GetVersionExW(&OsVersionInfo))
601 lstrcpyW(szBuffer, InfSectionName);
602 dwLength = lstrlenW(szBuffer);
604 if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
606 /* Test section name with '.NTx86' extension */
607 lstrcpyW(&szBuffer[dwLength], NtPlatformExtension);
608 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
610 if (lLineCount == -1)
612 /* Test section name with '.NT' extension */
613 lstrcpyW(&szBuffer[dwLength], NtExtension);
614 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
619 /* Test section name with '.Win' extension */
620 lstrcpyW(&szBuffer[dwLength], WinExtension);
621 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
624 if (lLineCount == -1)
626 /* Test section name without extension */
627 szBuffer[dwLength] = 0;
628 lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
631 if (lLineCount == -1)
633 SetLastError(ERROR_INVALID_PARAMETER);
637 dwFullLength = lstrlenW(szBuffer);
639 if (InfSectionWithExt != NULL && InfSectionWithExtSize != 0)
641 if (InfSectionWithExtSize < (dwFullLength + 1))
643 SetLastError(ERROR_INSUFFICIENT_BUFFER);
647 lstrcpyW(InfSectionWithExt, szBuffer);
648 if (Extension != NULL)
650 *Extension = (dwLength == dwFullLength) ? NULL : &InfSectionWithExt[dwLength];
654 if (RequiredSize != NULL)
656 *RequiredSize = dwFullLength + 1;
662 /***********************************************************************
663 * SetupDiGetClassDescriptionA (SETUPAPI.@)
665 BOOL WINAPI SetupDiGetClassDescriptionA(
666 const GUID* ClassGuid,
667 PSTR ClassDescription,
668 DWORD ClassDescriptionSize,
671 return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription,
672 ClassDescriptionSize,
673 RequiredSize, NULL, NULL);
676 /***********************************************************************
677 * SetupDiGetClassDescriptionW (SETUPAPI.@)
679 BOOL WINAPI SetupDiGetClassDescriptionW(
680 const GUID* ClassGuid,
681 PWSTR ClassDescription,
682 DWORD ClassDescriptionSize,
685 return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription,
686 ClassDescriptionSize,
687 RequiredSize, NULL, NULL);
690 /***********************************************************************
691 * SetupDiGetClassDescriptionExA (SETUPAPI.@)
693 BOOL WINAPI SetupDiGetClassDescriptionExA(
694 const GUID* ClassGuid,
695 PSTR ClassDescription,
696 DWORD ClassDescriptionSize,
705 /***********************************************************************
706 * SetupDiGetClassDescriptionExW (SETUPAPI.@)
708 BOOL WINAPI SetupDiGetClassDescriptionExW(
709 const GUID* ClassGuid,
710 PWSTR ClassDescription,
711 DWORD ClassDescriptionSize,
719 hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
724 if (hKey == INVALID_HANDLE_VALUE)
726 WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
730 if (RequiredSize != NULL)
733 if (RegQueryValueExW(hKey,
744 *RequiredSize = dwLength / sizeof(WCHAR);
747 dwLength = ClassDescriptionSize * sizeof(WCHAR);
748 if (RegQueryValueExW(hKey,
752 (LPBYTE)ClassDescription,
764 /***********************************************************************
765 * SetupDiGetClassDevsA (SETUPAPI.@)
767 HDEVINFO WINAPI SetupDiGetClassDevsA(
773 FIXME("%s %s %p %08lx\n",debugstr_guid(class),enumstr,parent,flags);
775 return (HDEVINFO) INVALID_HANDLE_VALUE;
778 /***********************************************************************
779 * SetupDiGetClassDevsW (SETUPAPI.@)
781 HDEVINFO WINAPI SetupDiGetClassDevsW(
787 FIXME("%s %s %p %08lx\n",debugstr_guid(class),debugstr_w(enumstr),parent,flags);
789 return (HDEVINFO) INVALID_HANDLE_VALUE;
792 /***********************************************************************
793 * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@)
795 BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(
796 HDEVINFO DeviceInfoSet,
797 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
798 PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData,
799 DWORD DeviceInterfaceDetailDataSize,
801 PSP_DEVINFO_DATA DeviceInfoData)
807 /***********************************************************************
808 * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@)
810 BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(
811 HDEVINFO DeviceInfoSet,
812 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
813 PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData,
814 DWORD DeviceInterfaceDetailDataSize,
816 PSP_DEVINFO_DATA DeviceInfoData)
822 /***********************************************************************
823 * SetupDiGetDeviceRegistryPropertyA (SETUPAPI.@)
825 BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(
827 PSP_DEVINFO_DATA DeviceInfoData,
829 PDWORD PropertyRegDataType,
830 PBYTE PropertyBuffer,
831 DWORD PropertyBufferSize,
834 FIXME("%04lx %p %ld %p %p %ld %p\n", (DWORD)devinfo, DeviceInfoData,
835 Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize,
840 /***********************************************************************
841 * SetupDiInstallClassA (SETUPAPI.@)
843 BOOL WINAPI SetupDiInstallClassA(
849 UNICODE_STRING FileNameW;
852 if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName))
854 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
858 Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue);
860 RtlFreeUnicodeString(&FileNameW);
865 static HKEY CreateClassKey(HINF hInf)
867 WCHAR FullBuffer[MAX_PATH];
868 WCHAR Buffer[MAX_PATH];
872 if (!SetupGetLineTextW(NULL,
880 return INVALID_HANDLE_VALUE;
883 lstrcpyW(FullBuffer, ControlClass);
884 lstrcatW(FullBuffer, Buffer);
886 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
892 if (!SetupGetLineTextW(NULL,
900 return INVALID_HANDLE_VALUE;
903 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
907 REG_OPTION_NON_VOLATILE,
913 return INVALID_HANDLE_VALUE;
918 if (RegSetValueExW(hClassKey,
923 RequiredSize * sizeof(WCHAR)))
925 RegCloseKey(hClassKey);
926 RegDeleteKeyW(HKEY_LOCAL_MACHINE,
928 return INVALID_HANDLE_VALUE;
934 /***********************************************************************
935 * SetupDiInstallClassW (SETUPAPI.@)
937 BOOL WINAPI SetupDiInstallClassW(
943 WCHAR SectionName[MAX_PATH];
944 DWORD SectionNameLength = 0;
946 BOOL bFileQueueCreated = FALSE;
952 if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
954 SetLastError(ERROR_INVALID_PARAMETER);
958 /* Open the .inf file */
959 hInf = SetupOpenInfFileW(InfFileName,
963 if (hInf == INVALID_HANDLE_VALUE)
969 /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */
970 hClassKey = CreateClassKey(hInf);
971 if (hClassKey == INVALID_HANDLE_VALUE)
973 SetupCloseInfFile(hInf);
978 /* Try to append a layout file */
980 SetupOpenAppendInfFileW(NULL, hInf, NULL);
983 /* Retrieve the actual section name */
984 SetupDiGetActualSectionToInstallW(hInf,
992 if (!(Flags & DI_NOVCP))
994 FileQueue = SetupOpenFileQueue();
995 if (FileQueue == INVALID_HANDLE_VALUE)
997 SetupCloseInfFile(hInf);
1001 bFileQueueCreated = TRUE;
1006 SetupInstallFromInfSectionW(NULL,
1015 INVALID_HANDLE_VALUE,
1018 /* FIXME: More code! */
1020 if (bFileQueueCreated)
1021 SetupCloseFileQueue(FileQueue);
1023 SetupCloseInfFile(hInf);
1029 /***********************************************************************
1030 * SetupDiOpenClassRegKey (SETUPAPI.@)
1032 HKEY WINAPI SetupDiOpenClassRegKey(
1033 const GUID* ClassGuid,
1036 return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired,
1037 DIOCR_INSTALLER, NULL, NULL);
1041 /***********************************************************************
1042 * SetupDiOpenClassRegKeyExA (SETUPAPI.@)
1044 HKEY WINAPI SetupDiOpenClassRegKeyExA(
1045 const GUID* ClassGuid,
1052 return INVALID_HANDLE_VALUE;
1056 /***********************************************************************
1057 * SetupDiOpenClassRegKeyExW (SETUPAPI.@)
1059 HKEY WINAPI SetupDiOpenClassRegKeyExW(
1060 const GUID* ClassGuid,
1066 LPWSTR lpGuidString;
1071 if (MachineName != NULL)
1073 FIXME("Remote access not supported yet!\n");
1074 return INVALID_HANDLE_VALUE;
1077 if (Flags == DIOCR_INSTALLER)
1079 lpKeyName = ControlClass;
1081 else if (Flags == DIOCR_INTERFACE)
1083 lpKeyName = DeviceClasses;
1087 ERR("Invalid Flags parameter!\n");
1088 SetLastError(ERROR_INVALID_PARAMETER);
1089 return INVALID_HANDLE_VALUE;
1092 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
1098 return INVALID_HANDLE_VALUE;
1101 if (ClassGuid == NULL)
1104 if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK)
1106 RegCloseKey(hClassesKey);
1110 if (RegOpenKeyExW(hClassesKey,
1116 RpcStringFreeW(&lpGuidString);
1117 RegCloseKey(hClassesKey);
1121 RpcStringFreeW(&lpGuidString);
1122 RegCloseKey(hClassesKey);
1127 /***********************************************************************
1128 * SetupDiOpenDeviceInterfaceA (SETUPAPI.@)
1130 BOOL WINAPI SetupDiOpenDeviceInterfaceW(
1131 HDEVINFO DeviceInfoSet,
1134 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
1136 FIXME("%p %s %08lx %p\n",
1137 DeviceInfoSet, debugstr_w(DevicePath), OpenFlags, DeviceInterfaceData);
1141 /***********************************************************************
1142 * SetupDiOpenDeviceInterfaceA (SETUPAPI.@)
1144 BOOL WINAPI SetupDiOpenDeviceInterfaceA(
1145 HDEVINFO DeviceInfoSet,
1148 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
1150 FIXME("%p %s %08lx %p\n", DeviceInfoSet,
1151 debugstr_a(DevicePath), OpenFlags, DeviceInterfaceData);
1155 /***********************************************************************
1156 * SetupDiSetClassInstallParamsA (SETUPAPI.@)
1158 BOOL WINAPI SetupDiSetClassInstallParamsA(
1159 HDEVINFO DeviceInfoSet,
1160 PSP_DEVINFO_DATA DeviceInfoData,
1161 PSP_CLASSINSTALL_HEADER ClassInstallParams,
1162 DWORD ClassInstallParamsSize)
1164 FIXME("%p %p %x %lu\n",DeviceInfoSet, DeviceInfoData,
1165 ClassInstallParams->InstallFunction, ClassInstallParamsSize);
1169 /***********************************************************************
1170 * SetupDiCallClassInstaller (SETUPAPI.@)
1172 BOOL WINAPI SetupDiCallClassInstaller(
1173 DWORD InstallFunction,
1174 HDEVINFO DeviceInfoSet,
1175 PSP_DEVINFO_DATA DeviceInfoData)
1177 FIXME("%ld %p %p\n", InstallFunction, DeviceInfoSet, DeviceInfoData);
1181 /***********************************************************************
1182 * SetupDiGetDeviceInstallParamsA (SETUPAPI.@)
1184 BOOL WINAPI SetupDiGetDeviceInstallParamsA(
1185 HDEVINFO DeviceInfoSet,
1186 PSP_DEVINFO_DATA DeviceInfoData,
1187 PSP_DEVINSTALL_PARAMS_A DeviceInstallParams)
1189 FIXME("%p %p %p\n", DeviceInfoSet, DeviceInfoData, DeviceInstallParams);
1193 /***********************************************************************
1194 * SetupDiOpenDevRegKey (SETUPAPI.@)
1196 HKEY WINAPI SetupDiOpenDevRegKey(
1197 HDEVINFO DeviceInfoSet,
1198 PSP_DEVINFO_DATA DeviceInfoData,
1204 FIXME("%p %p %ld %ld %ld %lx\n", DeviceInfoSet, DeviceInfoData,
1205 Scope, HwProfile, KeyType, samDesired);
1206 return INVALID_HANDLE_VALUE;