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 */