diff --git a/reactos/include/idl/pnp.idl b/reactos/include/idl/pnp.idl
index c208c22d38f..765b81d72cb 100644
--- a/reactos/include/idl/pnp.idl
+++ b/reactos/include/idl/pnp.idl
@@ -75,6 +75,10 @@ interface pnp
[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,
diff --git a/reactos/include/wine/cfgmgr32.h b/reactos/include/wine/cfgmgr32.h
index 7622e76a4ff..3e535bfa4dd 100644
--- a/reactos/include/wine/cfgmgr32.h
+++ b/reactos/include/wine/cfgmgr32.h
@@ -123,11 +123,17 @@ DECL_WINELIB_CFGMGR32_TYPE_AW(DEVINSTID)
#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_ExA( LPGUID, LPSTR, PULONG, ULONG, HMACHI
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 );
diff --git a/reactos/lib/setupapi/cfgmgr.c b/reactos/lib/setupapi/cfgmgr.c
index cc8ae37fcfa..26b3fba486c 100644
--- a/reactos/lib/setupapi/cfgmgr.c
+++ b/reactos/lib/setupapi/cfgmgr.c
@@ -62,6 +62,25 @@ typedef struct _MACHINE_INFO
} 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.@]
*/
@@ -123,6 +142,54 @@ CONFIGRET WINAPI CM_Connect_MachineW(PCWSTR UNCServerName, PHMACHINE phMachine)
}
+/***********************************************************************
+ * 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.@]
*/
@@ -393,25 +460,6 @@ CONFIGRET WINAPI CM_Get_Class_Key_Name_ExA(
}
-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.@]
*/
diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec
index 405f99ef865..003968a1c8b 100644
--- a/reactos/lib/setupapi/setupapi.spec
+++ b/reactos/lib/setupapi/setupapi.spec
@@ -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
diff --git a/reactos/services/umpnpmgr/umpnpmgr.c b/reactos/services/umpnpmgr/umpnpmgr.c
index 11eadd2254c..14304a315d0 100644
--- a/reactos/services/umpnpmgr/umpnpmgr.c
+++ b/reactos/services/umpnpmgr/umpnpmgr.c
@@ -636,9 +636,9 @@ PNP_GetDeviceRegProp(handle_t BindingHandle,
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 @@ PNP_GetClassName(handle_t BindingHandle,
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,7 +677,33 @@ PNP_GetClassName(handle_t BindingHandle,
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;
}
diff --git a/reactos/services/umpnpmgr/umpnpmgr.xml b/reactos/services/umpnpmgr/umpnpmgr.xml
index 40bd85165b5..b145b196d13 100644
--- a/reactos/services/umpnpmgr/umpnpmgr.xml
+++ b/reactos/services/umpnpmgr/umpnpmgr.xml
@@ -3,6 +3,9 @@
.
.
+ 0x600
+ 0x0500
+ 0x0600
pnp_server
diff --git a/reactos/w32api/include/ddk/cfgmgr32.h b/reactos/w32api/include/ddk/cfgmgr32.h
index 6784af31c80..2ba4126e50b 100644
--- a/reactos/w32api/include/ddk/cfgmgr32.h
+++ b/reactos/w32api/include/ddk/cfgmgr32.h
@@ -708,8 +708,27 @@ CM_Connect_MachineW(
/* 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 */