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
;