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
)
107 bResult
= SetupDiBuildClassInfoListExW(Flags
, ClassGuidList
,
108 ClassGuidListSize
, RequiredSize
,
109 MachineNameW
, Reserved
);
112 MyFree(MachineNameW
);
117 /***********************************************************************
118 * SetupDiBuildClassInfoListExW (SETUPAPI.@)
120 BOOL WINAPI
SetupDiBuildClassInfoListExW(
122 LPGUID ClassGuidList
,
123 DWORD ClassGuidListSize
,
134 DWORD dwGuidListIndex
= 0;
138 if (RequiredSize
!= NULL
)
141 hClassesKey
= SetupDiOpenClassRegKeyExW(NULL
,
146 if (hClassesKey
== INVALID_HANDLE_VALUE
)
151 for (dwIndex
= 0; ; dwIndex
++)
154 lError
= RegEnumKeyExW(hClassesKey
,
162 TRACE("RegEnumKeyExW() returns %ld\n", lError
);
163 if (lError
== ERROR_SUCCESS
|| lError
== ERROR_MORE_DATA
)
165 TRACE("Key name: %p\n", szKeyName
);
167 if (RegOpenKeyExW(hClassesKey
,
173 RegCloseKey(hClassesKey
);
177 if (!RegQueryValueExW(hClassKey
,
184 TRACE("'NoUseClass' value found!\n");
185 RegCloseKey(hClassKey
);
189 if ((Flags
& DIBCI_NOINSTALLCLASS
) &&
190 (!RegQueryValueExW(hClassKey
,
197 TRACE("'NoInstallClass' value found!\n");
198 RegCloseKey(hClassKey
);
202 if ((Flags
& DIBCI_NODISPLAYCLASS
) &&
203 (!RegQueryValueExW(hClassKey
,
210 TRACE("'NoDisplayClass' value found!\n");
211 RegCloseKey(hClassKey
);
215 RegCloseKey(hClassKey
);
217 TRACE("Guid: %p\n", szKeyName
);
218 if (dwGuidListIndex
< ClassGuidListSize
)
220 if (szKeyName
[0] == L
'{' && szKeyName
[37] == L
'}')
224 TRACE("Guid: %p\n", &szKeyName
[1]);
226 UuidFromStringW(&szKeyName
[1],
227 &ClassGuidList
[dwGuidListIndex
]);
233 if (lError
!= ERROR_SUCCESS
)
237 RegCloseKey(hClassesKey
);
239 if (RequiredSize
!= NULL
)
240 *RequiredSize
= dwGuidListIndex
;
242 if (ClassGuidListSize
< dwGuidListIndex
)
244 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
251 /***********************************************************************
252 * SetupDiClassGuidsFromNameA (SETUPAPI.@)
254 BOOL WINAPI
SetupDiClassGuidsFromNameA(
256 LPGUID ClassGuidList
,
257 DWORD ClassGuidListSize
,
260 return SetupDiClassGuidsFromNameExA(ClassName
, ClassGuidList
,
261 ClassGuidListSize
, RequiredSize
,
265 /***********************************************************************
266 * SetupDiClassGuidsFromNameW (SETUPAPI.@)
268 BOOL WINAPI
SetupDiClassGuidsFromNameW(
270 LPGUID ClassGuidList
,
271 DWORD ClassGuidListSize
,
274 return SetupDiClassGuidsFromNameExW(ClassName
, ClassGuidList
,
275 ClassGuidListSize
, RequiredSize
,
279 /***********************************************************************
280 * SetupDiClassGuidsFromNameExA (SETUPAPI.@)
282 BOOL WINAPI
SetupDiClassGuidsFromNameExA(
284 LPGUID ClassGuidList
,
285 DWORD ClassGuidListSize
,
290 LPWSTR ClassNameW
= NULL
;
291 LPWSTR MachineNameW
= NULL
;
296 ClassNameW
= MultiByteToUnicode(ClassName
, CP_ACP
);
297 if (ClassNameW
== NULL
)
302 MachineNameW
= MultiByteToUnicode(MachineName
, CP_ACP
);
303 if (MachineNameW
== NULL
)
310 bResult
= SetupDiClassGuidsFromNameExW(ClassNameW
, ClassGuidList
,
311 ClassGuidListSize
, RequiredSize
,
312 MachineNameW
, Reserved
);
315 MyFree(MachineNameW
);
322 /***********************************************************************
323 * SetupDiClassGuidsFromNameExW (SETUPAPI.@)
325 BOOL WINAPI
SetupDiClassGuidsFromNameExW(
327 LPGUID ClassGuidList
,
328 DWORD ClassGuidListSize
,
334 WCHAR szClassName
[256];
340 DWORD dwGuidListIndex
= 0;
342 if (RequiredSize
!= NULL
)
345 hClassesKey
= SetupDiOpenClassRegKeyExW(NULL
,
350 if (hClassesKey
== INVALID_HANDLE_VALUE
)
355 for (dwIndex
= 0; ; dwIndex
++)
358 lError
= RegEnumKeyExW(hClassesKey
,
366 TRACE("RegEnumKeyExW() returns %ld\n", lError
);
367 if (lError
== ERROR_SUCCESS
|| lError
== ERROR_MORE_DATA
)
369 TRACE("Key name: %p\n", szKeyName
);
371 if (RegOpenKeyExW(hClassesKey
,
377 RegCloseKey(hClassesKey
);
381 dwLength
= 256 * sizeof(WCHAR
);
382 if (!RegQueryValueExW(hClassKey
,
389 TRACE("Class name: %p\n", szClassName
);
391 if (strcmpiW(szClassName
, ClassName
) == 0)
393 TRACE("Found matching class name\n");
395 TRACE("Guid: %p\n", szKeyName
);
396 if (dwGuidListIndex
< ClassGuidListSize
)
398 if (szKeyName
[0] == L
'{' && szKeyName
[37] == L
'}')
402 TRACE("Guid: %p\n", &szKeyName
[1]);
404 UuidFromStringW(&szKeyName
[1],
405 &ClassGuidList
[dwGuidListIndex
]);
412 RegCloseKey(hClassKey
);
415 if (lError
!= ERROR_SUCCESS
)
419 RegCloseKey(hClassesKey
);
421 if (RequiredSize
!= NULL
)
422 *RequiredSize
= dwGuidListIndex
;
424 if (ClassGuidListSize
< dwGuidListIndex
)
426 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
433 /***********************************************************************
434 * SetupDiClassNameFromGuidA (SETUPAPI.@)
436 BOOL WINAPI
SetupDiClassNameFromGuidA(
437 const GUID
* ClassGuid
,
442 return SetupDiClassNameFromGuidExA(ClassGuid
, ClassName
,
443 ClassNameSize
, RequiredSize
,
447 /***********************************************************************
448 * SetupDiClassNameFromGuidW (SETUPAPI.@)
450 BOOL WINAPI
SetupDiClassNameFromGuidW(
451 const GUID
* ClassGuid
,
456 return SetupDiClassNameFromGuidExW(ClassGuid
, ClassName
,
457 ClassNameSize
, RequiredSize
,
461 /***********************************************************************
462 * SetupDiClassNameFromGuidExA (SETUPAPI.@)
464 BOOL WINAPI
SetupDiClassNameFromGuidExA(
465 const GUID
* ClassGuid
,
476 /***********************************************************************
477 * SetupDiClassNameFromGuidExW (SETUPAPI.@)
479 BOOL WINAPI
SetupDiClassNameFromGuidExW(
480 const GUID
* ClassGuid
,
490 hKey
= SetupDiOpenClassRegKeyExW(ClassGuid
,
495 if (hKey
== INVALID_HANDLE_VALUE
)
500 if (RequiredSize
!= NULL
)
503 if (RegQueryValueExW(hKey
,
514 *RequiredSize
= dwLength
/ sizeof(WCHAR
);
517 dwLength
= ClassNameSize
* sizeof(WCHAR
);
518 if (RegQueryValueExW(hKey
,
534 /***********************************************************************
535 * SetupDiCreateDeviceInfoList (SETUPAPI.@)
538 SetupDiCreateDeviceInfoList(const GUID
*ClassGuid
,
541 return SetupDiCreateDeviceInfoListExW(ClassGuid
, hwndParent
, NULL
, NULL
);
544 /***********************************************************************
545 * SetupDiCreateDeviceInfoListExA (SETUPAPI.@)
548 SetupDiCreateDeviceInfoListExA(const GUID
*ClassGuid
,
553 LPWSTR MachineNameW
= NULL
;
560 MachineNameW
= MultiByteToUnicode(MachineName
, CP_ACP
);
561 if (MachineNameW
== NULL
)
562 return (HDEVINFO
)INVALID_HANDLE_VALUE
;
565 hDevInfo
= SetupDiCreateDeviceInfoListExW(ClassGuid
, hwndParent
,
566 MachineNameW
, Reserved
);
569 MyFree(MachineNameW
);
574 /***********************************************************************
575 * SetupDiCreateDeviceInfoListExW (SETUPAPI.@)
578 SetupDiCreateDeviceInfoListExW(const GUID
*ClassGuid
,
584 return (HDEVINFO
)INVALID_HANDLE_VALUE
;
587 /***********************************************************************
588 * SetupDiDestroyDeviceInfoList (SETUPAPI.@)
590 BOOL WINAPI
SetupDiDestroyDeviceInfoList(HDEVINFO devinfo
)
592 FIXME("%p\n", devinfo
);
596 /***********************************************************************
597 * SetupDiEnumDeviceInfo (SETUPAPI.@)
599 BOOL WINAPI
SetupDiEnumDeviceInfo(
602 PSP_DEVINFO_DATA info
)
604 FIXME("%p %ld %p\n", devinfo
, index
, info
);
608 if(info
->cbSize
< sizeof(*info
))
614 /***********************************************************************
615 * SetupDiEnumDeviceInterfaces (SETUPAPI.@)
617 BOOL WINAPI
SetupDiEnumDeviceInterfaces(
618 HDEVINFO DeviceInfoSet
,
619 PSP_DEVINFO_DATA DeviceInfoData
,
620 CONST GUID
* InterfaceClassGuid
,
622 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
)
628 /***********************************************************************
629 * SetupDiGetActualSectionToInstallA (SETUPAPI.@)
631 BOOL WINAPI
SetupDiGetActualSectionToInstallA(
633 PCSTR InfSectionName
,
634 PSTR InfSectionWithExt
,
635 DWORD InfSectionWithExtSize
,
643 /***********************************************************************
644 * SetupDiGetActualSectionToInstallW (SETUPAPI.@)
646 BOOL WINAPI
SetupDiGetActualSectionToInstallW(
648 PCWSTR InfSectionName
,
649 PWSTR InfSectionWithExt
,
650 DWORD InfSectionWithExtSize
,
654 WCHAR szBuffer
[MAX_PATH
];
657 LONG lLineCount
= -1;
659 lstrcpyW(szBuffer
, InfSectionName
);
660 dwLength
= lstrlenW(szBuffer
);
662 if (OsVersionInfo
.dwPlatformId
== VER_PLATFORM_WIN32_NT
)
664 /* Test section name with '.NTx86' extension */
665 lstrcpyW(&szBuffer
[dwLength
], NtPlatformExtension
);
666 lLineCount
= SetupGetLineCountW(InfHandle
, szBuffer
);
668 if (lLineCount
== -1)
670 /* Test section name with '.NT' extension */
671 lstrcpyW(&szBuffer
[dwLength
], NtExtension
);
672 lLineCount
= SetupGetLineCountW(InfHandle
, szBuffer
);
677 /* Test section name with '.Win' extension */
678 lstrcpyW(&szBuffer
[dwLength
], WinExtension
);
679 lLineCount
= SetupGetLineCountW(InfHandle
, szBuffer
);
682 if (lLineCount
== -1)
684 /* Test section name without extension */
685 szBuffer
[dwLength
] = 0;
686 lLineCount
= SetupGetLineCountW(InfHandle
, szBuffer
);
689 if (lLineCount
== -1)
691 SetLastError(ERROR_INVALID_PARAMETER
);
695 dwFullLength
= lstrlenW(szBuffer
);
697 if (InfSectionWithExt
!= NULL
&& InfSectionWithExtSize
!= 0)
699 if (InfSectionWithExtSize
< (dwFullLength
+ 1))
701 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
705 lstrcpyW(InfSectionWithExt
, szBuffer
);
706 if (Extension
!= NULL
)
708 *Extension
= (dwLength
== dwFullLength
) ? NULL
: &InfSectionWithExt
[dwLength
];
712 if (RequiredSize
!= NULL
)
714 *RequiredSize
= dwFullLength
+ 1;
720 /***********************************************************************
721 * SetupDiGetClassDescriptionA (SETUPAPI.@)
723 BOOL WINAPI
SetupDiGetClassDescriptionA(
724 const GUID
* ClassGuid
,
725 PSTR ClassDescription
,
726 DWORD ClassDescriptionSize
,
729 return SetupDiGetClassDescriptionExA(ClassGuid
, ClassDescription
,
730 ClassDescriptionSize
,
731 RequiredSize
, NULL
, NULL
);
734 /***********************************************************************
735 * SetupDiGetClassDescriptionW (SETUPAPI.@)
737 BOOL WINAPI
SetupDiGetClassDescriptionW(
738 const GUID
* ClassGuid
,
739 PWSTR ClassDescription
,
740 DWORD ClassDescriptionSize
,
743 return SetupDiGetClassDescriptionExW(ClassGuid
, ClassDescription
,
744 ClassDescriptionSize
,
745 RequiredSize
, NULL
, NULL
);
748 /***********************************************************************
749 * SetupDiGetClassDescriptionExA (SETUPAPI.@)
751 BOOL WINAPI
SetupDiGetClassDescriptionExA(
752 const GUID
* ClassGuid
,
753 PSTR ClassDescription
,
754 DWORD ClassDescriptionSize
,
763 /***********************************************************************
764 * SetupDiGetClassDescriptionExW (SETUPAPI.@)
766 BOOL WINAPI
SetupDiGetClassDescriptionExW(
767 const GUID
* ClassGuid
,
768 PWSTR ClassDescription
,
769 DWORD ClassDescriptionSize
,
777 hKey
= SetupDiOpenClassRegKeyExW(ClassGuid
,
782 if (hKey
== INVALID_HANDLE_VALUE
)
784 WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
788 if (RequiredSize
!= NULL
)
791 if (RegQueryValueExW(hKey
,
802 *RequiredSize
= dwLength
/ sizeof(WCHAR
);
805 dwLength
= ClassDescriptionSize
* sizeof(WCHAR
);
806 if (RegQueryValueExW(hKey
,
810 (LPBYTE
)ClassDescription
,
822 /***********************************************************************
823 * SetupDiGetClassDevsA (SETUPAPI.@)
825 HDEVINFO WINAPI
SetupDiGetClassDevsA(
831 FIXME("%s %s %p %08lx\n",debugstr_guid(class),enumstr
,parent
,flags
);
833 return (HDEVINFO
) INVALID_HANDLE_VALUE
;
836 /***********************************************************************
837 * SetupDiGetClassDevsW (SETUPAPI.@)
839 HDEVINFO WINAPI
SetupDiGetClassDevsW(
845 FIXME("%s %s %p %08lx\n",debugstr_guid(class),debugstr_w(enumstr
),parent
,flags
);
847 return (HDEVINFO
) INVALID_HANDLE_VALUE
;
850 /***********************************************************************
851 * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@)
853 BOOL WINAPI
SetupDiGetDeviceInterfaceDetailA(
854 HDEVINFO DeviceInfoSet
,
855 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
,
856 PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData
,
857 DWORD DeviceInterfaceDetailDataSize
,
859 PSP_DEVINFO_DATA DeviceInfoData
)
865 /***********************************************************************
866 * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@)
868 BOOL WINAPI
SetupDiGetDeviceInterfaceDetailW(
869 HDEVINFO DeviceInfoSet
,
870 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
,
871 PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData
,
872 DWORD DeviceInterfaceDetailDataSize
,
874 PSP_DEVINFO_DATA DeviceInfoData
)
880 /***********************************************************************
881 * SetupDiGetDeviceRegistryPropertyA (SETUPAPI.@)
883 BOOL WINAPI
SetupDiGetDeviceRegistryPropertyA(
885 PSP_DEVINFO_DATA DeviceInfoData
,
887 PDWORD PropertyRegDataType
,
888 PBYTE PropertyBuffer
,
889 DWORD PropertyBufferSize
,
892 FIXME("%04lx %p %ld %p %p %ld %p\n", (DWORD
)devinfo
, DeviceInfoData
,
893 Property
, PropertyRegDataType
, PropertyBuffer
, PropertyBufferSize
,
898 /***********************************************************************
899 * SetupDiInstallClassA (SETUPAPI.@)
901 BOOL WINAPI
SetupDiInstallClassA(
907 UNICODE_STRING FileNameW
;
910 if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW
, InfFileName
))
912 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
916 Result
= SetupDiInstallClassW(hwndParent
, FileNameW
.Buffer
, Flags
, FileQueue
);
918 RtlFreeUnicodeString(&FileNameW
);
923 static HKEY
CreateClassKey(HINF hInf
)
925 WCHAR FullBuffer
[MAX_PATH
];
926 WCHAR Buffer
[MAX_PATH
];
930 if (!SetupGetLineTextW(NULL
,
938 return INVALID_HANDLE_VALUE
;
941 lstrcpyW(FullBuffer
, ControlClass
);
942 lstrcatW(FullBuffer
, Buffer
);
944 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
950 if (!SetupGetLineTextW(NULL
,
958 return INVALID_HANDLE_VALUE
;
961 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
,
965 REG_OPTION_NON_VOLATILE
,
971 return INVALID_HANDLE_VALUE
;
976 if (RegSetValueExW(hClassKey
,
981 RequiredSize
* sizeof(WCHAR
)))
983 RegCloseKey(hClassKey
);
984 RegDeleteKeyW(HKEY_LOCAL_MACHINE
,
986 return INVALID_HANDLE_VALUE
;
992 /***********************************************************************
993 * SetupDiInstallClassW (SETUPAPI.@)
995 BOOL WINAPI
SetupDiInstallClassW(
1001 WCHAR SectionName
[MAX_PATH
];
1002 DWORD SectionNameLength
= 0;
1004 BOOL bFileQueueCreated
= FALSE
;
1010 if ((Flags
& DI_NOVCP
) && (FileQueue
== NULL
|| FileQueue
== INVALID_HANDLE_VALUE
))
1012 SetLastError(ERROR_INVALID_PARAMETER
);
1016 /* Open the .inf file */
1017 hInf
= SetupOpenInfFileW(InfFileName
,
1021 if (hInf
== INVALID_HANDLE_VALUE
)
1027 /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */
1028 hClassKey
= CreateClassKey(hInf
);
1029 if (hClassKey
== INVALID_HANDLE_VALUE
)
1031 SetupCloseInfFile(hInf
);
1036 /* Try to append a layout file */
1038 SetupOpenAppendInfFileW(NULL
, hInf
, NULL
);
1041 /* Retrieve the actual section name */
1042 SetupDiGetActualSectionToInstallW(hInf
,
1050 if (!(Flags
& DI_NOVCP
))
1052 FileQueue
= SetupOpenFileQueue();
1053 if (FileQueue
== INVALID_HANDLE_VALUE
)
1055 SetupCloseInfFile(hInf
);
1059 bFileQueueCreated
= TRUE
;
1064 SetupInstallFromInfSectionW(NULL
,
1073 INVALID_HANDLE_VALUE
,
1076 /* FIXME: More code! */
1078 if (bFileQueueCreated
)
1079 SetupCloseFileQueue(FileQueue
);
1081 SetupCloseInfFile(hInf
);
1087 /***********************************************************************
1088 * SetupDiOpenClassRegKey (SETUPAPI.@)
1090 HKEY WINAPI
SetupDiOpenClassRegKey(
1091 const GUID
* ClassGuid
,
1094 return SetupDiOpenClassRegKeyExW(ClassGuid
, samDesired
,
1095 DIOCR_INSTALLER
, NULL
, NULL
);
1099 /***********************************************************************
1100 * SetupDiOpenClassRegKeyExA (SETUPAPI.@)
1102 HKEY WINAPI
SetupDiOpenClassRegKeyExA(
1103 const GUID
* ClassGuid
,
1109 PWSTR MachineNameW
= NULL
;
1116 MachineNameW
= MultiByteToUnicode(MachineName
, CP_ACP
);
1117 if (MachineNameW
== NULL
)
1118 return INVALID_HANDLE_VALUE
;
1121 hKey
= SetupDiOpenClassRegKeyExW(ClassGuid
, samDesired
,
1122 Flags
, MachineNameW
, Reserved
);
1125 MyFree(MachineNameW
);
1131 /***********************************************************************
1132 * SetupDiOpenClassRegKeyExW (SETUPAPI.@)
1134 HKEY WINAPI
SetupDiOpenClassRegKeyExW(
1135 const GUID
* ClassGuid
,
1141 LPWSTR lpGuidString
;
1146 if (MachineName
!= NULL
)
1148 FIXME("Remote access not supported yet!\n");
1149 return INVALID_HANDLE_VALUE
;
1152 if (Flags
== DIOCR_INSTALLER
)
1154 lpKeyName
= ControlClass
;
1156 else if (Flags
== DIOCR_INTERFACE
)
1158 lpKeyName
= DeviceClasses
;
1162 ERR("Invalid Flags parameter!\n");
1163 SetLastError(ERROR_INVALID_PARAMETER
);
1164 return INVALID_HANDLE_VALUE
;
1167 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
1173 return INVALID_HANDLE_VALUE
;
1176 if (ClassGuid
== NULL
)
1179 if (UuidToStringW((UUID
*)ClassGuid
, &lpGuidString
) != RPC_S_OK
)
1181 RegCloseKey(hClassesKey
);
1185 if (RegOpenKeyExW(hClassesKey
,
1191 RpcStringFreeW(&lpGuidString
);
1192 RegCloseKey(hClassesKey
);
1196 RpcStringFreeW(&lpGuidString
);
1197 RegCloseKey(hClassesKey
);
1202 /***********************************************************************
1203 * SetupDiOpenDeviceInterfaceW (SETUPAPI.@)
1205 BOOL WINAPI
SetupDiOpenDeviceInterfaceW(
1206 HDEVINFO DeviceInfoSet
,
1209 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
)
1211 FIXME("%p %s %08lx %p\n",
1212 DeviceInfoSet
, debugstr_w(DevicePath
), OpenFlags
, DeviceInterfaceData
);
1216 /***********************************************************************
1217 * SetupDiOpenDeviceInterfaceA (SETUPAPI.@)
1219 BOOL WINAPI
SetupDiOpenDeviceInterfaceA(
1220 HDEVINFO DeviceInfoSet
,
1223 PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
)
1225 FIXME("%p %s %08lx %p\n", DeviceInfoSet
,
1226 debugstr_a(DevicePath
), OpenFlags
, DeviceInterfaceData
);
1230 /***********************************************************************
1231 * SetupDiSetClassInstallParamsA (SETUPAPI.@)
1233 BOOL WINAPI
SetupDiSetClassInstallParamsA(
1234 HDEVINFO DeviceInfoSet
,
1235 PSP_DEVINFO_DATA DeviceInfoData
,
1236 PSP_CLASSINSTALL_HEADER ClassInstallParams
,
1237 DWORD ClassInstallParamsSize
)
1239 FIXME("%p %p %x %lu\n",DeviceInfoSet
, DeviceInfoData
,
1240 ClassInstallParams
->InstallFunction
, ClassInstallParamsSize
);
1244 /***********************************************************************
1245 * SetupDiCallClassInstaller (SETUPAPI.@)
1247 BOOL WINAPI
SetupDiCallClassInstaller(
1248 DWORD InstallFunction
,
1249 HDEVINFO DeviceInfoSet
,
1250 PSP_DEVINFO_DATA DeviceInfoData
)
1252 FIXME("%ld %p %p\n", InstallFunction
, DeviceInfoSet
, DeviceInfoData
);
1256 /***********************************************************************
1257 * SetupDiGetDeviceInstallParamsA (SETUPAPI.@)
1259 BOOL WINAPI
SetupDiGetDeviceInstallParamsA(
1260 HDEVINFO DeviceInfoSet
,
1261 PSP_DEVINFO_DATA DeviceInfoData
,
1262 PSP_DEVINSTALL_PARAMS_A DeviceInstallParams
)
1264 FIXME("%p %p %p\n", DeviceInfoSet
, DeviceInfoData
, DeviceInstallParams
);
1268 /***********************************************************************
1269 * SetupDiOpenDevRegKey (SETUPAPI.@)
1271 HKEY WINAPI
SetupDiOpenDevRegKey(
1272 HDEVINFO DeviceInfoSet
,
1273 PSP_DEVINFO_DATA DeviceInfoData
,
1279 FIXME("%p %p %ld %ld %ld %lx\n", DeviceInfoSet
, DeviceInfoData
,
1280 Scope
, HwProfile
, KeyType
, samDesired
);
1281 return INVALID_HANDLE_VALUE
;