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)