Implement SetupDiBuildClassInfoList(ExW),
SetupDiClassGuidsFromName(W/ExW), SetupDiClassNameFromGuid(W/ExW),
SetupDiGetActualSectionToInstallW, SetupDiGetClassDescription(W/ExW),
SetupDiInstallClassW partially, SetupDiOpenClassRegKey(ExW),
SetupOpenMasterInf.
diff --git a/dlls/advpack/advpack.c b/dlls/advpack/advpack.c
index dfa77fd..7459ac7 100644
--- a/dlls/advpack/advpack.c
+++ b/dlls/advpack/advpack.c
@@ -23,6 +23,7 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
+#include "winreg.h"
#include "setupapi.h"
#include "advpub.h"
#include "wine/debug.h"
diff --git a/dlls/setupapi/Makefile.in b/dlls/setupapi/Makefile.in
index 0648b3c..e2cff5b 100644
--- a/dlls/setupapi/Makefile.in
+++ b/dlls/setupapi/Makefile.in
@@ -4,7 +4,7 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = setupapi.dll
-IMPORTS = user32 version advapi32 kernel32 ntdll
+IMPORTS = user32 version advapi32 rpcrt4 kernel32 ntdll
DELAYIMPORTS = shell32
EXTRALIBS = $(LIBUNICODE)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 7d84bf6..4b25529 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -18,47 +18,531 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include "config.h"
+#include "wine/port.h"
+
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
+#include "winnt.h"
+#include "winreg.h"
+#include "winternl.h"
#include "wingdi.h"
#include "winuser.h"
#include "winnls.h"
-#include "winreg.h"
#include "setupapi.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
+
+#include "rpc.h"
+#include "rpcdce.h"
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
+/* Unicode constants */
+static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
+static const WCHAR Class[] = {'C','l','a','s','s',0};
+static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
+static const WCHAR NoDisplayClass[] = {'N','o','D','i','s','p','l','a','y','C','l','a','s','s',0};
+static const WCHAR NoInstallClass[] = {'N','o','I','s','t','a','l','l','C','l','a','s','s',0};
+static const WCHAR NoUseClass[] = {'N','o','U','s','e','C','l','a','s','s',0};
+static const WCHAR NtExtension[] = {'.','N','T',0};
+static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',0};
+static const WCHAR Version[] = {'V','e','r','s','i','o','n',0};
+static const WCHAR WinExtension[] = {'.','W','i','n',0};
+
+/* Registry key and value names */
+static const WCHAR ControlClass[] = {'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'C','l','a','s','s',0};
+
+static const WCHAR DeviceClasses[] = {'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
+
/***********************************************************************
- * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@)
+ * SetupDiBuildClassInfoList (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(
- HDEVINFO DeviceInfoSet,
- PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
- PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData,
- DWORD DeviceInterfaceDetailDataSize,
- PDWORD RequiredSize,
- PSP_DEVINFO_DATA DeviceInfoData )
+BOOL WINAPI SetupDiBuildClassInfoList(
+ DWORD Flags,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize)
+{
+ TRACE("\n");
+ return SetupDiBuildClassInfoListExW(Flags, ClassGuidList,
+ ClassGuidListSize, RequiredSize,
+ NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiBuildClassInfoListExA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiBuildClassInfoListExA(
+ DWORD Flags,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize,
+ LPCSTR MachineName,
+ PVOID Reserved)
{
FIXME("\n");
return FALSE;
}
/***********************************************************************
- * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@)
+ * SetupDiBuildClassInfoListExW (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(
- HDEVINFO DeviceInfoSet,
- PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
- PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData,
- DWORD DeviceInterfaceDetailDataSize,
- PDWORD RequiredSize,
- PSP_DEVINFO_DATA DeviceInfoData )
+BOOL WINAPI SetupDiBuildClassInfoListExW(
+ DWORD Flags,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize,
+ LPCWSTR MachineName,
+ PVOID Reserved)
{
- FIXME("\n");
+ WCHAR szKeyName[40];
+ HKEY hClassesKey;
+ HKEY hClassKey;
+ DWORD dwLength;
+ DWORD dwIndex;
+ LONG lError;
+ DWORD dwGuidListIndex = 0;
+
+ TRACE("\n");
+
+ if (RequiredSize != NULL)
+ *RequiredSize = 0;
+
+ hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
+ KEY_ALL_ACCESS,
+ DIOCR_INSTALLER,
+ MachineName,
+ Reserved);
+ if (hClassesKey == INVALID_HANDLE_VALUE)
+ {
+ return FALSE;
+ }
+
+ for (dwIndex = 0; ; dwIndex++)
+ {
+ dwLength = 40;
+ lError = RegEnumKeyExW(hClassesKey,
+ dwIndex,
+ szKeyName,
+ &dwLength,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ TRACE("RegEnumKeyExW() returns %ld\n", lError);
+ if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
+ {
+ TRACE("Key name: %p\n", szKeyName);
+
+ if (RegOpenKeyExW(hClassesKey,
+ szKeyName,
+ 0,
+ KEY_ALL_ACCESS,
+ &hClassKey))
+ {
+ RegCloseKey(hClassesKey);
+ return FALSE;
+ }
+
+ if (!RegQueryValueExW(hClassKey,
+ NoUseClass,
+ NULL,
+ NULL,
+ NULL,
+ NULL))
+ {
+ TRACE("'NoUseClass' value found!\n");
+ RegCloseKey(hClassKey);
+ continue;
+ }
+
+ if ((Flags & DIBCI_NOINSTALLCLASS) &&
+ (!RegQueryValueExW(hClassKey,
+ NoInstallClass,
+ NULL,
+ NULL,
+ NULL,
+ NULL)))
+ {
+ TRACE("'NoInstallClass' value found!\n");
+ RegCloseKey(hClassKey);
+ continue;
+ }
+
+ if ((Flags & DIBCI_NODISPLAYCLASS) &&
+ (!RegQueryValueExW(hClassKey,
+ NoDisplayClass,
+ NULL,
+ NULL,
+ NULL,
+ NULL)))
+ {
+ TRACE("'NoDisplayClass' value found!\n");
+ RegCloseKey(hClassKey);
+ continue;
+ }
+
+ RegCloseKey(hClassKey);
+
+ TRACE("Guid: %p\n", szKeyName);
+ if (dwGuidListIndex < ClassGuidListSize)
+ {
+ if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
+ {
+ szKeyName[37] = 0;
+ }
+ TRACE("Guid: %p\n", &szKeyName[1]);
+
+ UuidFromStringW(&szKeyName[1],
+ &ClassGuidList[dwGuidListIndex]);
+ }
+
+ dwGuidListIndex++;
+ }
+
+ if (lError != ERROR_SUCCESS)
+ break;
+ }
+
+ RegCloseKey(hClassesKey);
+
+ if (RequiredSize != NULL)
+ *RequiredSize = dwGuidListIndex;
+
+ if (ClassGuidListSize < dwGuidListIndex)
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetupDiClassGuidsFromNameA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassGuidsFromNameA(
+ LPCSTR ClassName,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList,
+ ClassGuidListSize, RequiredSize,
+ NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiClassGuidsFromNameW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassGuidsFromNameW(
+ LPCWSTR ClassName,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList,
+ ClassGuidListSize, RequiredSize,
+ NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiClassGuidsFromNameExA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassGuidsFromNameExA(
+ LPCSTR ClassName,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize,
+ LPCSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return FALSE;
+}
+
+/***********************************************************************
+ * SetupDiClassGuidsFromNameExW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassGuidsFromNameExW(
+ LPCWSTR ClassName,
+ LPGUID ClassGuidList,
+ DWORD ClassGuidListSize,
+ PDWORD RequiredSize,
+ LPCWSTR MachineName,
+ PVOID Reserved)
+{
+ WCHAR szKeyName[40];
+ WCHAR szClassName[256];
+ HKEY hClassesKey;
+ HKEY hClassKey;
+ DWORD dwLength;
+ DWORD dwIndex;
+ LONG lError;
+ DWORD dwGuidListIndex = 0;
+
+ if (RequiredSize != NULL)
+ *RequiredSize = 0;
+
+ hClassesKey = SetupDiOpenClassRegKeyExW(NULL,
+ KEY_ALL_ACCESS,
+ DIOCR_INSTALLER,
+ MachineName,
+ Reserved);
+ if (hClassesKey == INVALID_HANDLE_VALUE)
+ {
+ return FALSE;
+ }
+
+ for (dwIndex = 0; ; dwIndex++)
+ {
+ dwLength = 40;
+ lError = RegEnumKeyExW(hClassesKey,
+ dwIndex,
+ szKeyName,
+ &dwLength,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ TRACE("RegEnumKeyExW() returns %ld\n", lError);
+ if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
+ {
+ TRACE("Key name: %p\n", szKeyName);
+
+ if (RegOpenKeyExW(hClassesKey,
+ szKeyName,
+ 0,
+ KEY_ALL_ACCESS,
+ &hClassKey))
+ {
+ RegCloseKey(hClassesKey);
+ return FALSE;
+ }
+
+ dwLength = 256 * sizeof(WCHAR);
+ if (!RegQueryValueExW(hClassKey,
+ Class,
+ NULL,
+ NULL,
+ (LPBYTE)szClassName,
+ &dwLength))
+ {
+ TRACE("Class name: %p\n", szClassName);
+
+ if (strcmpiW(szClassName, ClassName) == 0)
+ {
+ TRACE("Found matching class name\n");
+
+ TRACE("Guid: %p\n", szKeyName);
+ if (dwGuidListIndex < ClassGuidListSize)
+ {
+ if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
+ {
+ szKeyName[37] = 0;
+ }
+ TRACE("Guid: %p\n", &szKeyName[1]);
+
+ UuidFromStringW(&szKeyName[1],
+ &ClassGuidList[dwGuidListIndex]);
+ }
+
+ dwGuidListIndex++;
+ }
+ }
+
+ RegCloseKey(hClassKey);
+ }
+
+ if (lError != ERROR_SUCCESS)
+ break;
+ }
+
+ RegCloseKey(hClassesKey);
+
+ if (RequiredSize != NULL)
+ *RequiredSize = dwGuidListIndex;
+
+ if (ClassGuidListSize < dwGuidListIndex)
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetupDiClassNameFromGuidA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassNameFromGuidA(
+ const GUID* ClassGuid,
+ PSTR ClassName,
+ DWORD ClassNameSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiClassNameFromGuidExA(ClassGuid, ClassName,
+ ClassNameSize, RequiredSize,
+ NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiClassNameFromGuidW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassNameFromGuidW(
+ const GUID* ClassGuid,
+ PWSTR ClassName,
+ DWORD ClassNameSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiClassNameFromGuidExW(ClassGuid, ClassName,
+ ClassNameSize, RequiredSize,
+ NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiClassNameFromGuidExA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassNameFromGuidExA(
+ const GUID* ClassGuid,
+ PSTR ClassName,
+ DWORD ClassNameSize,
+ PDWORD RequiredSize,
+ PCSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return FALSE;
+}
+
+/***********************************************************************
+ * SetupDiClassNameFromGuidExW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiClassNameFromGuidExW(
+ const GUID* ClassGuid,
+ PWSTR ClassName,
+ DWORD ClassNameSize,
+ PDWORD RequiredSize,
+ PCWSTR MachineName,
+ PVOID Reserved)
+{
+ HKEY hKey;
+ DWORD dwLength;
+
+ hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
+ KEY_ALL_ACCESS,
+ DIOCR_INSTALLER,
+ MachineName,
+ Reserved);
+ if (hKey == INVALID_HANDLE_VALUE)
+ {
+ return FALSE;
+ }
+
+ if (RequiredSize != NULL)
+ {
+ dwLength = 0;
+ if (RegQueryValueExW(hKey,
+ Class,
+ NULL,
+ NULL,
+ NULL,
+ &dwLength))
+ {
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
+ *RequiredSize = dwLength / sizeof(WCHAR);
+ }
+
+ dwLength = ClassNameSize * sizeof(WCHAR);
+ if (RegQueryValueExW(hKey,
+ Class,
+ NULL,
+ NULL,
+ (LPBYTE)ClassName,
+ &dwLength))
+ {
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
+ RegCloseKey(hKey);
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetupDiCreateDeviceInfoList (SETUPAPI.@)
+ */
+HDEVINFO WINAPI
+SetupDiCreateDeviceInfoList(const GUID *ClassGuid,
+ HWND hwndParent)
+{
+ return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiCreateDeviceInfoListExA (SETUPAPI.@)
+ */
+HDEVINFO WINAPI
+SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid,
+ HWND hwndParent,
+ PCSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return (HDEVINFO)INVALID_HANDLE_VALUE;
+}
+
+/***********************************************************************
+ * SetupDiCreateDeviceInfoListExW (SETUPAPI.@)
+ */
+HDEVINFO WINAPI
+SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid,
+ HWND hwndParent,
+ PCWSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return (HDEVINFO)INVALID_HANDLE_VALUE;
+}
+
+/***********************************************************************
+ * SetupDiDestroyDeviceInfoList (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
+{
+ FIXME("%p\n", devinfo);
+ return FALSE;
+}
+
+/***********************************************************************
+ * SetupDiEnumDeviceInfo (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiEnumDeviceInfo(
+ HDEVINFO devinfo,
+ DWORD index,
+ PSP_DEVINFO_DATA info)
+{
+ FIXME("%p %ld %p\n", devinfo, index, info);
+
+ if(info==NULL)
+ return FALSE;
+ if(info->cbSize < sizeof(*info))
+ return FALSE;
+
return FALSE;
}
@@ -77,6 +561,207 @@
}
/***********************************************************************
+ * SetupDiGetActualSectionToInstallA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetActualSectionToInstallA(
+ HINF InfHandle,
+ PCSTR InfSectionName,
+ PSTR InfSectionWithExt,
+ DWORD InfSectionWithExtSize,
+ PDWORD RequiredSize,
+ PSTR *Extension)
+{
+ FIXME("\n");
+ return FALSE;
+}
+
+/***********************************************************************
+ * SetupDiGetActualSectionToInstallW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetActualSectionToInstallW(
+ HINF InfHandle,
+ PCWSTR InfSectionName,
+ PWSTR InfSectionWithExt,
+ DWORD InfSectionWithExtSize,
+ PDWORD RequiredSize,
+ PWSTR *Extension)
+{
+ WCHAR szBuffer[MAX_PATH];
+ OSVERSIONINFOW OsVersionInfo;
+ DWORD dwLength;
+ DWORD dwFullLength;
+ LONG lLineCount = -1;
+
+ OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
+ if (!GetVersionExW(&OsVersionInfo))
+ {
+ return FALSE;
+ }
+
+ lstrcpyW(szBuffer, InfSectionName);
+ dwLength = lstrlenW(szBuffer);
+
+ if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* Test section name with '.NTx86' extension */
+ lstrcpyW(&szBuffer[dwLength], NtPlatformExtension);
+ lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
+
+ if (lLineCount == -1)
+ {
+ /* Test section name with '.NT' extension */
+ lstrcpyW(&szBuffer[dwLength], NtExtension);
+ lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
+ }
+ }
+ else
+ {
+ /* Test section name with '.Win' extension */
+ lstrcpyW(&szBuffer[dwLength], WinExtension);
+ lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
+ }
+
+ if (lLineCount == -1)
+ {
+ /* Test section name without extension */
+ szBuffer[dwLength] = 0;
+ lLineCount = SetupGetLineCountW(InfHandle, szBuffer);
+ }
+
+ if (lLineCount == -1)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ dwFullLength = lstrlenW(szBuffer);
+
+ if (InfSectionWithExt != NULL && InfSectionWithExtSize != 0)
+ {
+ if (InfSectionWithExtSize < (dwFullLength + 1))
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
+
+ lstrcpyW(InfSectionWithExt, szBuffer);
+ if (Extension != NULL)
+ {
+ *Extension = (dwLength == dwFullLength) ? NULL : &InfSectionWithExt[dwLength];
+ }
+ }
+
+ if (RequiredSize != NULL)
+ {
+ *RequiredSize = dwFullLength + 1;
+ }
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetupDiGetClassDescriptionA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetClassDescriptionA(
+ const GUID* ClassGuid,
+ PSTR ClassDescription,
+ DWORD ClassDescriptionSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription,
+ ClassDescriptionSize,
+ RequiredSize, NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiGetClassDescriptionW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetClassDescriptionW(
+ const GUID* ClassGuid,
+ PWSTR ClassDescription,
+ DWORD ClassDescriptionSize,
+ PDWORD RequiredSize)
+{
+ return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription,
+ ClassDescriptionSize,
+ RequiredSize, NULL, NULL);
+}
+
+/***********************************************************************
+ * SetupDiGetClassDescriptionExA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetClassDescriptionExA(
+ const GUID* ClassGuid,
+ PSTR ClassDescription,
+ DWORD ClassDescriptionSize,
+ PDWORD RequiredSize,
+ PCSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return FALSE;
+}
+
+/***********************************************************************
+ * SetupDiGetClassDescriptionExW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiGetClassDescriptionExW(
+ const GUID* ClassGuid,
+ PWSTR ClassDescription,
+ DWORD ClassDescriptionSize,
+ PDWORD RequiredSize,
+ PCWSTR MachineName,
+ PVOID Reserved)
+{
+ HKEY hKey;
+ DWORD dwLength;
+
+ hKey = SetupDiOpenClassRegKeyExW(ClassGuid,
+ KEY_ALL_ACCESS,
+ DIOCR_INSTALLER,
+ MachineName,
+ Reserved);
+ if (hKey == INVALID_HANDLE_VALUE)
+ {
+ WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
+ return FALSE;
+ }
+
+ if (RequiredSize != NULL)
+ {
+ dwLength = 0;
+ if (RegQueryValueExW(hKey,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ &dwLength))
+ {
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
+ *RequiredSize = dwLength / sizeof(WCHAR);
+ }
+
+ dwLength = ClassDescriptionSize * sizeof(WCHAR);
+ if (RegQueryValueExW(hKey,
+ NULL,
+ NULL,
+ NULL,
+ (LPBYTE)ClassDescription,
+ &dwLength))
+ {
+ RegCloseKey(hKey);
+ return FALSE;
+ }
+
+ RegCloseKey(hKey);
+
+ return TRUE;
+}
+
+/***********************************************************************
* SetupDiGetClassDevsA (SETUPAPI.@)
*/
HDEVINFO WINAPI SetupDiGetClassDevsA(
@@ -103,30 +788,34 @@
return (HDEVINFO) INVALID_HANDLE_VALUE;
}
+
/***********************************************************************
- * SetupDiEnumDeviceInfo (SETUPAPI.@)
+ * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiEnumDeviceInfo(
- HDEVINFO devinfo,
- DWORD index,
- PSP_DEVINFO_DATA info)
+BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
+ PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData,
+ DWORD DeviceInterfaceDetailDataSize,
+ PDWORD RequiredSize,
+ PSP_DEVINFO_DATA DeviceInfoData)
{
- FIXME("%p %ld %p\n", devinfo, index, info );
-
- if(info==NULL)
- return FALSE;
- if(info->cbSize < sizeof(*info))
- return FALSE;
-
+ FIXME("\n");
return FALSE;
}
/***********************************************************************
- * SetupDiDestroyDeviceInfoList (SETUPAPI.@)
+ * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiDestroyDeviceInfoList( HDEVINFO devinfo )
+BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData,
+ PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData,
+ DWORD DeviceInterfaceDetailDataSize,
+ PDWORD RequiredSize,
+ PSP_DEVINFO_DATA DeviceInfoData)
{
- FIXME("%04lx\n", (DWORD)devinfo);
+ FIXME("\n");
return FALSE;
}
@@ -147,3 +836,290 @@
RequiredSize);
return FALSE;
}
+
+/***********************************************************************
+ * SetupDiInstallClassA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiInstallClassA(
+ HWND hwndParent,
+ PCSTR InfFileName,
+ DWORD Flags,
+ HSPFILEQ FileQueue)
+{
+ UNICODE_STRING FileNameW;
+ BOOL Result;
+
+ if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName))
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+
+ Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue);
+
+ RtlFreeUnicodeString(&FileNameW);
+
+ return Result;
+}
+
+static HKEY CreateClassKey(HINF hInf)
+{
+ WCHAR FullBuffer[MAX_PATH];
+ WCHAR Buffer[MAX_PATH];
+ DWORD RequiredSize;
+ HKEY hClassKey;
+
+ if (!SetupGetLineTextW(NULL,
+ hInf,
+ Version,
+ ClassGUID,
+ Buffer,
+ MAX_PATH,
+ &RequiredSize))
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ lstrcpyW(FullBuffer, ControlClass);
+ lstrcatW(FullBuffer, Buffer);
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+ FullBuffer,
+ 0,
+ KEY_ALL_ACCESS,
+ &hClassKey))
+ {
+ if (!SetupGetLineTextW(NULL,
+ hInf,
+ Version,
+ Class,
+ Buffer,
+ MAX_PATH,
+ &RequiredSize))
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
+ FullBuffer,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ NULL,
+ &hClassKey,
+ NULL))
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ }
+
+ if (RegSetValueExW(hClassKey,
+ Class,
+ 0,
+ REG_SZ,
+ (LPBYTE)Buffer,
+ RequiredSize * sizeof(WCHAR)))
+ {
+ RegCloseKey(hClassKey);
+ RegDeleteKeyW(HKEY_LOCAL_MACHINE,
+ FullBuffer);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ return hClassKey;
+}
+
+/***********************************************************************
+ * SetupDiInstallClassW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupDiInstallClassW(
+ HWND hwndParent,
+ PCWSTR InfFileName,
+ DWORD Flags,
+ HSPFILEQ FileQueue)
+{
+ WCHAR SectionName[MAX_PATH];
+ DWORD SectionNameLength = 0;
+ HINF hInf;
+ BOOL bFileQueueCreated = FALSE;
+ HKEY hClassKey;
+
+
+ FIXME("\n");
+
+ if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ /* Open the .inf file */
+ hInf = SetupOpenInfFileW(InfFileName,
+ NULL,
+ INF_STYLE_WIN4,
+ NULL);
+ if (hInf == INVALID_HANDLE_VALUE)
+ {
+
+ return FALSE;
+ }
+
+ /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */
+ hClassKey = CreateClassKey(hInf);
+ if (hClassKey == INVALID_HANDLE_VALUE)
+ {
+ SetupCloseInfFile(hInf);
+ return FALSE;
+ }
+
+
+ /* Try to append a layout file */
+#if 0
+ SetupOpenAppendInfFileW(NULL, hInf, NULL);
+#endif
+
+ /* Retrieve the actual section name */
+ SetupDiGetActualSectionToInstallW(hInf,
+ ClassInstall32,
+ SectionName,
+ MAX_PATH,
+ &SectionNameLength,
+ NULL);
+
+#if 0
+ if (!(Flags & DI_NOVCP))
+ {
+ FileQueue = SetupOpenFileQueue();
+ if (FileQueue == INVALID_HANDLE_VALUE)
+ {
+ SetupCloseInfFile(hInf);
+ return FALSE;
+ }
+
+ bFileQueueCreated = TRUE;
+
+ }
+#endif
+
+ SetupInstallFromInfSectionW(NULL,
+ hInf,
+ SectionName,
+ SPINST_REGISTRY,
+ hClassKey,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ INVALID_HANDLE_VALUE,
+ NULL);
+
+ /* FIXME: More code! */
+
+ if (bFileQueueCreated)
+ SetupCloseFileQueue(FileQueue);
+
+ SetupCloseInfFile(hInf);
+
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * SetupDiOpenClassRegKey (SETUPAPI.@)
+ */
+HKEY WINAPI SetupDiOpenClassRegKey(
+ const GUID* ClassGuid,
+ REGSAM samDesired)
+{
+ return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired,
+ DIOCR_INSTALLER, NULL, NULL);
+}
+
+
+/***********************************************************************
+ * SetupDiOpenClassRegKeyExA (SETUPAPI.@)
+ */
+HKEY WINAPI SetupDiOpenClassRegKeyExA(
+ const GUID* ClassGuid,
+ REGSAM samDesired,
+ DWORD Flags,
+ PCSTR MachineName,
+ PVOID Reserved)
+{
+ FIXME("\n");
+ return INVALID_HANDLE_VALUE;
+}
+
+
+/***********************************************************************
+ * SetupDiOpenClassRegKeyExW (SETUPAPI.@)
+ */
+HKEY WINAPI SetupDiOpenClassRegKeyExW(
+ const GUID* ClassGuid,
+ REGSAM samDesired,
+ DWORD Flags,
+ PCWSTR MachineName,
+ PVOID Reserved)
+{
+ LPWSTR lpGuidString;
+ HKEY hClassesKey;
+ HKEY hClassKey;
+ LPCWSTR lpKeyName;
+
+ if (MachineName != NULL)
+ {
+ FIXME("Remote access not supported yet!\n");
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if (Flags == DIOCR_INSTALLER)
+ {
+ lpKeyName = ControlClass;
+ }
+ else if (Flags == DIOCR_INTERFACE)
+ {
+ lpKeyName = DeviceClasses;
+ }
+ else
+ {
+ ERR("Invalid Flags parameter!\n");
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+ lpKeyName,
+ 0,
+ KEY_ALL_ACCESS,
+ &hClassesKey))
+ {
+ return INVALID_HANDLE_VALUE;
+ }
+
+ if (ClassGuid == NULL)
+ return hClassesKey;
+
+ if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK)
+ {
+ RegCloseKey(hClassesKey);
+ return FALSE;
+ }
+
+ if (RegOpenKeyExW(hClassesKey,
+ lpGuidString,
+ 0,
+ KEY_ALL_ACCESS,
+ &hClassKey))
+ {
+ RpcStringFreeW(&lpGuidString);
+ RegCloseKey(hClassesKey);
+ return FALSE;
+ }
+
+ RpcStringFreeW(&lpGuidString);
+ RegCloseKey(hClassesKey);
+
+ return hClassKey;
+}
diff --git a/dlls/setupapi/parser.c b/dlls/setupapi/parser.c
index 9c13f6d..9c6d4fc 100644
--- a/dlls/setupapi/parser.c
+++ b/dlls/setupapi/parser.c
@@ -1163,6 +1163,21 @@
/***********************************************************************
+ * SetupOpenMasterInf (SETUPAPI.@)
+ */
+HINF WINAPI SetupOpenMasterInf( VOID )
+{
+ static const WCHAR Layout[] = {'\\','i','n','f','\\', 'l', 'a', 'y', 'o', 'u', 't', '.', 'i', 'n', 'f', 0};
+ WCHAR Buffer[MAX_PATH];
+
+ GetWindowsDirectoryW( Buffer, MAX_PATH );
+ strcatW( Buffer, Layout );
+ return SetupOpenInfFileW( Buffer, NULL, INF_STYLE_WIN4, NULL);
+}
+
+
+
+/***********************************************************************
* SetupCloseInfFile (SETUPAPI.@)
*/
void WINAPI SetupCloseInfFile( HINF hinf )
diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec
index 6738aab..98dd31a 100644
--- a/dlls/setupapi/setupapi.spec
+++ b/dlls/setupapi/setupapi.spec
@@ -245,7 +245,7 @@
@ stdcall SetupCloseFileQueue(ptr)
@ stdcall SetupCloseInfFile(long)
@ stub SetupCloseLog
-@ stub SetupCommitFileQueue
+@ stdcall SetupCommitFileQueue(long long ptr ptr) SetupCommitFileQueueW
@ stdcall SetupCommitFileQueueA(long long ptr ptr)
@ stdcall SetupCommitFileQueueW(long long ptr ptr)
@ stub SetupCopyErrorA
@@ -263,26 +263,26 @@
@ stub SetupDeleteErrorW
@ stdcall SetupDestroyDiskSpaceList(long)
@ stub SetupDiAskForOEMDisk
-@ stub SetupDiBuildClassInfoList
-@ stub SetupDiBuildClassInfoListExA
+@ stdcall SetupDiBuildClassInfoList(long ptr long ptr)
+@ stdcall SetupDiBuildClassInfoListExA(long ptr long ptr str ptr)
@ stdcall SetupDiBuildClassInfoListExW(long ptr long ptr wstr ptr)
@ stub SetupDiBuildDriverInfoList
@ stub SetupDiCallClassInstaller
@ stub SetupDiCancelDriverInfoSearch
@ stub SetupDiChangeState
-@ stub SetupDiClassGuidsFromNameA
-@ stub SetupDiClassGuidsFromNameExA
+@ stdcall SetupDiClassGuidsFromNameA(str ptr long ptr)
+@ stdcall SetupDiClassGuidsFromNameExA(str ptr long ptr str ptr)
@ stdcall SetupDiClassGuidsFromNameExW(wstr ptr long ptr wstr ptr)
-@ stub SetupDiClassGuidsFromNameW
-@ stub SetupDiClassNameFromGuidA
-@ stub SetupDiClassNameFromGuidExA
-@ stdcall SetupDiClassNameFromGuidExW(ptr ptr long ptr wstr ptr)
-@ stub SetupDiClassNameFromGuidW
+@ stdcall SetupDiClassGuidsFromNameW(wstr ptr long ptr)
+@ stdcall SetupDiClassNameFromGuidA(ptr str long ptr)
+@ stdcall SetupDiClassNameFromGuidExA(ptr str long ptr wstr ptr)
+@ stdcall SetupDiClassNameFromGuidExW(ptr wstr long ptr wstr ptr)
+@ stdcall SetupDiClassNameFromGuidW(ptr wstr long ptr)
@ stub SetupDiCreateDevRegKeyA
@ stub SetupDiCreateDevRegKeyW
@ stub SetupDiCreateDeviceInfoA
@ stdcall SetupDiCreateDeviceInfoList(ptr ptr)
-@ stub SetupDiCreateDeviceInfoListExA
+@ stdcall SetupDiCreateDeviceInfoListExA(ptr long str ptr)
@ stdcall SetupDiCreateDeviceInfoListExW(ptr long str ptr)
@ stub SetupDiCreateDeviceInfoW
@ stub SetupDiDeleteDevRegKey
@@ -297,13 +297,13 @@
@ stdcall SetupDiEnumDeviceInterfaces(long ptr ptr long ptr)
@ stub SetupDiEnumDriverInfoA
@ stub SetupDiEnumDriverInfoW
-@ stub SetupDiGetActualSectionToInstallA
-@ stub SetupDiGetActualSectionToInstallW
+@ stdcall SetupDiGetActualSectionToInstallA(long str str long ptr ptr)
+@ stdcall SetupDiGetActualSectionToInstallW(long wstr wstr long ptr ptr)
@ stub SetupDiGetClassBitmapIndex
-@ stub SetupDiGetClassDescriptionA
-@ stub SetupDiGetClassDescriptionExA
-@ stdcall SetupDiGetClassDescriptionExW(ptr ptr long ptr wstr ptr)
-@ stub SetupDiGetClassDescriptionW
+@ stdcall SetupDiGetClassDescriptionA(ptr str long ptr)
+@ stdcall SetupDiGetClassDescriptionExA(ptr str long ptr str ptr)
+@ stdcall SetupDiGetClassDescriptionExW(ptr wstr long ptr wstr ptr)
+@ stdcall SetupDiGetClassDescriptionW(ptr wstr long ptr)
@ stub SetupDiGetClassDevPropertySheetsA
@ stub SetupDiGetClassDevPropertySheetsW
@ stdcall SetupDiGetClassDevsA(ptr ptr long long)
@@ -345,16 +345,16 @@
@ stub SetupDiGetSelectedDriverA
@ stub SetupDiGetSelectedDriverW
@ stub SetupDiGetWizardPage
-@ stub SetupDiInstallClassA
+@ stdcall SetupDiInstallClassA(long str long ptr)
@ stub SetupDiInstallClassExA
@ stub SetupDiInstallClassExW
-@ stub SetupDiInstallClassW
+@ stdcall SetupDiInstallClassW(long wstr long ptr)
@ stub SetupDiInstallDevice
@ stub SetupDiInstallDriverFiles
@ stub SetupDiLoadClassIcon
@ stub SetupDiMoveDuplicateDevice
-@ stub SetupDiOpenClassRegKey
-@ stub SetupDiOpenClassRegKeyExA
+@ stdcall SetupDiOpenClassRegKey(ptr long)
+@ stdcall SetupDiOpenClassRegKeyExA(ptr long long str ptr)
@ stdcall SetupDiOpenClassRegKeyExW(ptr long long wstr ptr)
@ stub SetupDiOpenDevRegKey
@ stub SetupDiOpenDeviceInfoA
@@ -447,7 +447,7 @@
@ stdcall SetupOpenFileQueue()
@ stdcall SetupOpenInfFileA(str str long ptr)
@ stdcall SetupOpenInfFileW(wstr wstr long ptr)
-@ stub SetupOpenMasterInf
+@ stdcall SetupOpenMasterInf()
@ stub SetupPromptForDiskA
@ stub SetupPromptForDiskW
@ stub SetupPromptReboot
diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c
index 24f3c20..f722a0c 100644
--- a/dlls/setupapi/stubs.c
+++ b/dlls/setupapi/stubs.c
@@ -51,44 +51,6 @@
}
/***********************************************************************
- * SetupDiOpenClassRegKeyExW (SETUPAPI.@)
- *
- * WINAPI in description not given
- */
-HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID* class, REGSAM access, DWORD flags, PCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return INVALID_HANDLE_VALUE;
-}
-
-/***********************************************************************
- * SetupDiGetClassDescriptionExW (SETUPAPI.@)
- */
-BOOL WINAPI SetupDiGetClassDescriptionExW (const GUID* class, PWSTR desc, DWORD size, PDWORD required, PCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
- * SetupDiClassNameFromGuidExW (SETUPAPI.@)
- */
-BOOL WINAPI SetupDiClassNameFromGuidExW (const GUID* class, PWSTR desc, DWORD size, PDWORD required, PCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
- * SetupDiBuildClassInfoListExW (SETUPAPI.@)
- */
-BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD flags, LPGUID list, DWORD size, PDWORD required, LPCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
* SetupDiGetDeviceInfoListDetailA (SETUPAPI.@)
*/
BOOL WINAPI SetupDiGetDeviceInfoListDetailA(HDEVINFO devinfo, PSP_DEVINFO_LIST_DETAIL_DATA_A devinfo_data )
@@ -107,24 +69,6 @@
}
/***********************************************************************
- * SetupDiCreateDeviceInfoListA (SETUPAPI.@)
- */
-HDEVINFO WINAPI SetupDiCreateDeviceInfoList(const GUID *class, HWND parend)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
- * SetupDiCreateDeviceInfoListExW (SETUPAPI.@)
- */
-HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(const GUID *class, HWND parend , PCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
* (SETUPAPI.@)
*
* NO WINAPI in description given
@@ -147,15 +91,6 @@
}
/***********************************************************************
- * SetupDiClassGuidsFromNameExW (SETUPAPI.@)
- */
-BOOL WINAPI SetupDiClassGuidsFromNameExW(LPCWSTR class, LPGUID list, DWORD size, PDWORD required, LPCWSTR machine, PVOID reserved)
-{
- FIXME("\n");
- return FALSE;
-}
-
-/***********************************************************************
* CM_Connect_MachineW (SETUPAPI.@)
*/
DWORD WINAPI CM_Connect_MachineW(LPCWSTR name, void * machine)
diff --git a/include/setupapi.h b/include/setupapi.h
index a4ec1c4..a64f2cb 100644
--- a/include/setupapi.h
+++ b/include/setupapi.h
@@ -450,6 +450,8 @@
#define FLG_REGSVR_DLLREGISTER 0x00000001
#define FLG_REGSVR_DLLINSTALL 0x00000002
+#define DI_NOVCP 0x00000008
+
/* Class installer function codes */
#define DIF_SELECTDEVICE 0x01
#define DIF_INSTALLDEVICE 0x02
@@ -616,6 +618,14 @@
#define DIGCF_PROFILE 0x00000008
#define DIGCF_DEVICEINTERFACE 0x00000010
+/* Flags for SetupDiOpenClassRegKeyEx */
+#define DIOCR_INSTALLER 0x00000001
+#define DIOCR_INTERFACE 0x00000002
+
+/* Flags for SetupDiBuildClassInfoList(Ex) */
+#define DIBCI_NOINSTALLCLASS 0x00000001
+#define DIBCI_NODISPLAYCLASS 0x00000002
+
/* setup device registry property codes */
#define SPDRP_DEVICEDESC 0x00000000
#define SPDRP_HARDWAREID 0x00000001
@@ -663,6 +673,7 @@
BOOL WINAPI SetupOpenAppendInfFileA( PCSTR, HINF, UINT * );
BOOL WINAPI SetupOpenAppendInfFileW( PCWSTR, HINF, UINT * );
#define SetupOpenAppendInfFile WINELIB_NAME_AW(SetupOpenAppendInfFile)
+HINF WINAPI SetupOpenMasterInf( VOID );
void WINAPI SetupCloseInfFile( HINF hinf );
BOOL WINAPI SetupGetLineByIndexA( HINF, PCSTR, DWORD, INFCONTEXT * );
BOOL WINAPI SetupGetLineByIndexW( HINF, PCWSTR, DWORD, INFCONTEXT * );
@@ -736,8 +747,38 @@
UINT WINAPI SetupDefaultQueueCallbackA( PVOID, UINT, UINT_PTR, UINT_PTR );
UINT WINAPI SetupDefaultQueueCallbackW( PVOID, UINT, UINT_PTR, UINT_PTR );
#define SetupDefaultQueueCallback WINELIB_NAME_AW(SetupDefaultQueueCallback)
+
+BOOL WINAPI SetupDiBuildClassInfoList(DWORD, LPGUID, DWORD, PDWORD);
+BOOL WINAPI SetupDiBuildClassInfoListExA(DWORD, LPGUID, DWORD, PDWORD, PCSTR, PVOID);
+BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD, LPGUID, DWORD, PDWORD, PCWSTR, PVOID);
+#define SetupDiBuildClassInfoListEx WINELIB_NAME_AW(SetupDiBuildClassInfoListEx)
+BOOL WINAPI SetupDiClassGuidsFromNameA(LPCSTR, LPGUID, DWORD, PDWORD);
+BOOL WINAPI SetupDiClassGuidsFromNameW(LPCWSTR, LPGUID, DWORD, PDWORD);
+#define SetupDiClassGuidsFromName WINELIB_NAME_AW(SetupDiClassGuidsFromName)
+BOOL WINAPI SetupDiClassGuidsFromNameExA(LPCSTR, LPGUID, DWORD, PDWORD, LPCSTR, PVOID);
+BOOL WINAPI SetupDiClassGuidsFromNameExW(LPCWSTR, LPGUID, DWORD, PDWORD, LPCWSTR, PVOID);
+#define SetupDiClassGuidsFromNameEx WINELIB_NAME_AW(SetupDiClassGuidsFromNameEx)
+BOOL WINAPI SetupDiClassNameFromGuidA(const GUID*, PSTR, DWORD, PDWORD);
+BOOL WINAPI SetupDiClassNameFromGuidW(const GUID*, PWSTR, DWORD, PDWORD);
+#define SetupDiClassNameFromGuid WINELIB_NAME_AW(SetupDiClassNameFromGuid)
+BOOL WINAPI SetupDiClassNameFromGuidExA(const GUID*, PSTR, DWORD, PDWORD, PCSTR, PVOID);
+BOOL WINAPI SetupDiClassNameFromGuidExW(const GUID*, PWSTR, DWORD, PDWORD, PCWSTR, PVOID);
+#define SetupDiClassNameFromGuidEx WINELIB_NAME_AW(SetupDiClassNameFromGuidEx)
+HDEVINFO WINAPI SetupDiCreateDeviceInfoList(const GUID *, HWND);
+HDEVINFO WINAPI SetupDiCreateDeviceInfoListExA(const GUID *, HWND, PCSTR, PVOID);
+HDEVINFO WINAPI SetupDiCreateDeviceInfoListExW(const GUID *, HWND, PCWSTR, PVOID);
+#define SetupDiCreateDeviceInfoListEx WINELIB_NAME_AW(SetupDiCreateDeviceInfoListEx)
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO);
BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO, PSP_DEVINFO_DATA, const GUID *, DWORD, PSP_DEVICE_INTERFACE_DATA);
+BOOL WINAPI SetupDiGetActualSectionToInstallA(HINF, PCSTR, PSTR, DWORD, PDWORD, PSTR *);
+BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF, PCWSTR, PWSTR, DWORD, PDWORD, PWSTR *);
+#define SetupDiGetActualSectionToInstall WINELIB_NAME_AW(SetupDiGetActualSectionToInstall)
+BOOL WINAPI SetupDiGetClassDescriptionA(const GUID*, PSTR, DWORD, PDWORD);
+BOOL WINAPI SetupDiGetClassDescriptionW(const GUID*, PWSTR, DWORD, PDWORD);
+#define SetupDiGetClassDescription WINELIB_NAME_AW(SetupDiGetClassDescription)
+BOOL WINAPI SetupDiGetClassDescriptionExA(const GUID*, PSTR, DWORD, PDWORD, PCSTR, PVOID);
+BOOL WINAPI SetupDiGetClassDescriptionExW(const GUID*, PWSTR, DWORD, PDWORD, PCWSTR, PVOID);
+#define SetupDiGetClassDescriptionEx WINELIB_NAME_AW(SetupDiGetClassDescriptionEx)
HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID *,LPCSTR,HWND,DWORD);
HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *,LPCWSTR,HWND,DWORD);
#define SetupDiGetClassDevs WINELIB_NAME_AW(SetupDiGetClassDevs)
@@ -747,6 +788,13 @@
DWORD, PDWORD, PSP_DEVINFO_DATA);
#define SetupDiGetDeviceInterfaceDetail WINELIB_NAME_AW(SetupDiGetDeviceInterfaceDetail)
BOOL WINAPI SetupDiGetDeviceRegistryPropertyA(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD);
+BOOL WINAPI SetupDiInstallClassA(HWND, PCSTR, DWORD, HSPFILEQ);
+BOOL WINAPI SetupDiInstallClassW(HWND, PCWSTR, DWORD, HSPFILEQ);
+#define SetupDiInstallClass WINELIB_NAME_AW(SetupDiInstallClass)
+HKEY WINAPI SetupDiOpenClassRegKey(const GUID*, REGSAM);
+HKEY WINAPI SetupDiOpenClassRegKeyExA(const GUID*, REGSAM, DWORD, PCSTR, PVOID);
+HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID*, REGSAM, DWORD, PCWSTR, PVOID);
+#define SetupDiOpenClassRegKeyEx WINELIB_NAME_AW(SetupDiOpenClassRegKeyEx)
BOOL WINAPI SetupInstallFilesFromInfSectionA( HINF, HINF, HSPFILEQ, PCSTR, PCSTR, UINT );
BOOL WINAPI SetupInstallFilesFromInfSectionW( HINF, HINF, HSPFILEQ, PCWSTR, PCWSTR, UINT );
#define SetupInstallFilesFromInfSection WINELIB_NAME_AW(SetupInstallFilesFromInfSection)