Implement CM_Delete_Class_Key[_Ex].
Modified: trunk/reactos/include/idl/pnp.idl
Modified: trunk/reactos/include/wine/cfgmgr32.h
Modified: trunk/reactos/lib/setupapi/cfgmgr.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.xml
Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h

Modified: trunk/reactos/include/idl/pnp.idl
--- trunk/reactos/include/idl/pnp.idl	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/include/idl/pnp.idl	2005-09-10 13:02:02 UTC (rev 17773)
@@ -75,6 +75,10 @@
                              [in, out] unsigned long *Length,
                              [in] unsigned long Flags);
 
+  CONFIGRET PNP_DeleteClassKey(handle_t BindingHandle,
+                               [in, string] wchar_t *ClassGuid,
+                               [in] unsigned long Flags);
+
   CONFIGRET PNP_GetDeviceStatus(handle_t BindingHandle,
                                 [in, string] wchar_t *DeviceInstance,
                                 [out] unsigned long *Status,

Modified: trunk/reactos/include/wine/cfgmgr32.h
--- trunk/reactos/include/wine/cfgmgr32.h	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/include/wine/cfgmgr32.h	2005-09-10 13:02:02 UTC (rev 17773)
@@ -123,11 +123,17 @@
 #define CM_DRP_MIN                         0x00000001
 #define CM_DRP_MAX                         0x00000017
 
+/* ulFlags for CM_Delete_Class_Key[_Ex] */
+#define CM_DELETE_CLASS_ONLY    0x00000000
+#define CM_DELETE_CLASS_SUBKEYS 0x00000001
+#define CM_DELETE_CLASS_BITS    0x00000001
 
 
 CONFIGRET WINAPI CM_Connect_MachineA( PCSTR, PHMACHINE );
 CONFIGRET WINAPI CM_Connect_MachineW( PCWSTR, PHMACHINE );
 #define     CM_Connect_Machine WINELIB_NAME_AW(CM_Connect_Machine)
+CONFIGRET WINAPI CM_Delete_Class_Key( LPGUID, ULONG );
+CONFIGRET WINAPI CM_Delete_Class_Key_Ex( LPGUID, ULONG, HANDLE );
 CONFIGRET WINAPI CM_Disconnect_Machine( HMACHINE );
 CONFIGRET WINAPI CM_Enumerate_Classes( ULONG, LPGUID, ULONG );
 CONFIGRET WINAPI CM_Enumerate_Classes_Ex( ULONG, LPGUID, ULONG, HMACHINE );
@@ -140,7 +146,7 @@
 CONFIGRET WINAPI CM_Get_Class_Key_Name_ExW( LPGUID, LPWSTR, PULONG, ULONG, HMACHINE );
 #define     CM_Get_Class_Key_Name_Ex WINELIB_NAME_AW(CM_Get_Class_Key_Name_Ex)
 CONFIGRET WINAPI CM_Get_Class_NameA( LPGUID, PCHAR, PULONG, ULONG );
-CONFIGRET WINAPI CM_Get_Class_NameW( LPGUID, PWCHAR, PULONG, ULONG);
+CONFIGRET WINAPI CM_Get_Class_NameW( LPGUID, PWCHAR, PULONG, ULONG );
 #define     CM_Get_Class_Name WINELIB_NAME_AW(CM_Get_Class_Name)
 CONFIGRET WINAPI CM_Get_Class_Name_ExA( LPGUID, PCHAR, PULONG, ULONG, HMACHINE );
 CONFIGRET WINAPI CM_Get_Class_Name_ExW( LPGUID, PWCHAR, PULONG, ULONG, HMACHINE );

Modified: trunk/reactos/lib/setupapi/cfgmgr.c
--- trunk/reactos/lib/setupapi/cfgmgr.c	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/lib/setupapi/cfgmgr.c	2005-09-10 13:02:02 UTC (rev 17773)
@@ -62,6 +62,25 @@
 } MACHINE_INFO, *PMACHINE_INFO;
 
 
+static BOOL GuidToString(LPGUID Guid, LPWSTR String)
+{
+    LPWSTR lpString;
+
+    if (UuidToStringW(Guid, &lpString) != RPC_S_OK)
+        return FALSE;
+
+    lstrcpyW(&String[1], lpString);
+
+    String[0] = L'{';
+    String[MAX_GUID_STRING_LEN - 2] = L'}';
+    String[MAX_GUID_STRING_LEN - 1] = 0;
+
+    RpcStringFree(&lpString);
+
+    return TRUE;
+}
+
+
 /***********************************************************************
  * CM_Connect_MachineA [SETUPAPI.@]
  */
@@ -124,6 +143,54 @@
 
 
 /***********************************************************************
+ * CM_Delete_Class_Key [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Delete_Class_Key(LPGUID ClassGuid, ULONG ulFlags)
+{
+    TRACE("%p %lx\n", ClassGuid, ulFlags);
+    return CM_Delete_Class_Key_Ex(ClassGuid, ulFlags, NULL);
+}
+
+
+/***********************************************************************
+ * CM_Delete_Class_Key_Ex [SETUPAPI.@]
+ */
+CONFIGRET WINAPI CM_Delete_Class_Key_Ex(
+    LPGUID ClassGuid, ULONG ulFlags, HANDLE hMachine)
+{
+    WCHAR szGuidString[MAX_GUID_STRING_LEN];
+    RPC_BINDING_HANDLE BindingHandle = NULL;
+
+    TRACE("%p %lx %lx\n", ClassGuid, ulFlags, hMachine);
+
+    if (ClassGuid == NULL)
+        return CR_INVALID_POINTER;
+
+    if (ulFlags & ~CM_DELETE_CLASS_BITS)
+        return CR_INVALID_FLAG;
+
+    if (!GuidToString(ClassGuid, szGuidString))
+        return CR_INVALID_DATA;
+
+    if (hMachine != NULL)
+    {
+        BindingHandle = ((PMACHINE_INFO)hMachine)->BindingHandle;
+        if (BindingHandle == NULL)
+            return CR_FAILURE;
+    }
+    else
+    {
+        if (!PnpGetLocalHandles(&BindingHandle, NULL))
+            return CR_FAILURE;
+    }
+
+    return PNP_DeleteClassKey(BindingHandle,
+                             szGuidString,
+                             ulFlags);
+}
+
+
+/***********************************************************************
  * CM_Disconnect_Machine [SETUPAPI.@]
  */
 CONFIGRET WINAPI CM_Disconnect_Machine(HMACHINE hMachine)
@@ -393,25 +460,6 @@
 }
 
 
-static BOOL GuidToString(LPGUID Guid, LPWSTR String)
-{
-    LPWSTR lpString;
-
-    if (UuidToStringW(Guid, &lpString) != RPC_S_OK)
-        return FALSE;
-
-    lstrcpyW(&String[1], lpString);
-
-    String[0] = L'{';
-    String[MAX_GUID_STRING_LEN - 2] = L'}';
-    String[MAX_GUID_STRING_LEN - 1] = 0;
-
-    RpcStringFree(&lpString);
-
-    return TRUE;
-}
-
-
 /***********************************************************************
  * CM_Get_Class_Key_Name_ExW [SETUPAPI.@]
  */

Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/lib/setupapi/setupapi.spec	2005-09-10 13:02:02 UTC (rev 17773)
@@ -25,8 +25,8 @@
 @ stub CM_Create_DevNode_ExA
 @ stub CM_Create_DevNode_ExW
 @ stub CM_Create_Range_List
-@ stub CM_Delete_Class_Key
-@ stub CM_Delete_Class_Key_Ex
+@ stdcall CM_Delete_Class_Key(ptr long)
+@ stdcall CM_Delete_Class_Key_Ex(ptr long long)
 @ stub CM_Delete_DevNode_Key
 @ stub CM_Delete_DevNode_Key_Ex
 @ stub CM_Delete_Range

Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.c
--- trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.c	2005-09-10 13:02:02 UTC (rev 17773)
@@ -636,9 +636,9 @@
 
 CONFIGRET
 PNP_GetClassName(handle_t BindingHandle,
-                 wchar_t *ClassGuid,    /* in */
-                 wchar_t *Buffer,       /* out */
-                 unsigned long *Length, /* in out */
+                 wchar_t *ClassGuid,
+                 wchar_t *Buffer,
+                 unsigned long *Length,
                  unsigned long Flags)
 {
     WCHAR szKeyName[MAX_PATH];
@@ -646,7 +646,7 @@
     HKEY hKey = NULL;
     ULONG ulSize;
 
-    DPRINT1("PNP_GetClassName() called\n");
+    DPRINT("PNP_GetClassName() called\n");
 
     lstrcpyW(szKeyName, L"System\\CurrentControlSet\\Control\\Class");
     lstrcatW(szKeyName, L"\\");
@@ -677,13 +677,39 @@
 
     RegCloseKey(hKey);
 
-    DPRINT1("PNP_GetClassName() done (returns %lx)\n", ret);
+    DPRINT("PNP_GetClassName() done (returns %lx)\n", ret);
 
     return ret;
 }
 
 
 CONFIGRET
+PNP_DeleteClassKey(handle_t BindingHandle,
+                   wchar_t *ClassGuid,
+                   unsigned long Flags)
+{
+    CONFIGRET ret = CR_SUCCESS;
+
+    DPRINT("PNP_GetClassName(%S, %lx) called\n", ClassGuid, Flags);
+
+    if (Flags & CM_DELETE_CLASS_SUBKEYS)
+    {
+        if (RegDeleteTreeW(hClassKey, ClassGuid) != ERROR_SUCCESS)
+            ret = CR_REGISTRY_ERROR;
+    }
+    else
+    {
+        if (RegDeleteKeyW(hClassKey, ClassGuid) != ERROR_SUCCESS)
+            ret = CR_REGISTRY_ERROR;
+    }
+
+    DPRINT("PNP_DeleteClassKey() done (returns %lx)\n", ret);
+
+    return ret;
+}
+
+
+CONFIGRET
 PNP_GetDeviceStatus(handle_t BindingHandle,
                     wchar_t *DeviceInstance,
                     unsigned long *pStatus,

Modified: trunk/reactos/services/umpnpmgr/umpnpmgr.xml
--- trunk/reactos/services/umpnpmgr/umpnpmgr.xml	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/services/umpnpmgr/umpnpmgr.xml	2005-09-10 13:02:02 UTC (rev 17773)
@@ -3,6 +3,9 @@
 	<include base="pnp_server">.</include>
 	<include base="pnp_client">.</include>
 	<define name="__USE_W32API" />
+	<define name="WINVER">0x600</define>
+	<define name="_WIN32_IE">0x0500</define>
+	<define name="_WIN32_WINNT">0x0600</define>
 	<define name="UNICODE" />
 	<define name="_UNICODE" />
 	<library>pnp_server</library>

Modified: trunk/reactos/w32api/include/ddk/cfgmgr32.h
--- trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-09-10 10:31:22 UTC (rev 17772)
+++ trunk/reactos/w32api/include/ddk/cfgmgr32.h	2005-09-10 13:02:02 UTC (rev 17773)
@@ -708,8 +708,27 @@
 /* FIXME: Obsolete CM_Create_DevNode */
 /* FIXME: Obsolete CM_Create_DevNodeEx */
 /* FIXME: Obsolete CM_Create_Range_List */
-/* FIXME: Obsolete CM_Delete_Class_Key */
-/* FIXME: Obsolete CM_Delete_Class_Key_Ex */
+
+/* Flags for CM_Delete_Class_Key.ulFlags constants */
+#define CM_DELETE_CLASS_ONLY              0x00000000
+#define CM_DELETE_CLASS_SUBKEYS           0x00000001
+#define CM_DELETE_CLASS_BITS              0x00000001
+
+CMAPI
+CONFIGRET
+WINAPI
+CM_Delete_Class_Key(
+  IN LPGUID  ClassGuid,
+  IN ULONG  ulFlags);
+
+CMAPI
+CONFIGRET
+WINAPI
+CM_Delete_Class_Key_Ex(
+  IN LPGUID  ClassGuid,
+  IN ULONG  ulFlags,
+  IN HANDLE  hMachine);
+
 /* FIXME: Obsolete CM_Delete_DevNode_Key */
 /* FIXME: Obsolete CM_Delete_DevNode_Key_Ex */
 /* FIXME: Obsolete CM_Delete_Range */