From 4afb871782e1717841f7625e235b0ca7b8043df7 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 26 Jun 2025 22:13:59 +0200 Subject: [PATCH] [UMPNPMGR] Implement PNP_UnregisterDeviceClassAssociation --- base/services/umpnpmgr/rpcserver.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/base/services/umpnpmgr/rpcserver.c b/base/services/umpnpmgr/rpcserver.c index 1bc4a88ad52..446af2a17fe 100644 --- a/base/services/umpnpmgr/rpcserver.c +++ b/base/services/umpnpmgr/rpcserver.c @@ -2843,8 +2843,33 @@ PNP_UnregisterDeviceClassAssociation( LPWSTR pszInterfaceDevice, DWORD ulFlags) { - UNIMPLEMENTED; - return CR_CALL_NOT_IMPLEMENTED; + PLUGPLAY_CONTROL_CLASS_ASSOCIATION_DATA PlugPlayData; + NTSTATUS Status; + CONFIGRET ret = CR_SUCCESS; + + UNREFERENCED_PARAMETER(hBinding); + + DPRINT1("PNP_UnregisterDeviceClassAssociation(%p %S 0x%08lx)\n", + hBinding, pszInterfaceDevice, ulFlags); + + if (pszInterfaceDevice == NULL) + return CR_INVALID_POINTER; + + if (ulFlags != 0) + return CR_INVALID_FLAG; + + ZeroMemory(&PlugPlayData, sizeof(PlugPlayData)); + PlugPlayData.Register = FALSE; + PlugPlayData.SymbolicLinkName = pszInterfaceDevice; + PlugPlayData.SymbolicLinkNameLength = wcslen(pszInterfaceDevice) + 1; + + Status = NtPlugPlayControl(PlugPlayControlDeviceClassAssociation, + &PlugPlayData, + sizeof(PLUGPLAY_CONTROL_CLASS_ASSOCIATION_DATA)); + if (!NT_SUCCESS(Status)) + ret = NtStatusToCrError(Status); + + return ret; }