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)
