diff --git a/base/services/umpnpmgr/rpcserver.c b/base/services/umpnpmgr/rpcserver.c index 5e93f42049d..d4d69f64f67 100644 --- a/base/services/umpnpmgr/rpcserver.c +++ b/base/services/umpnpmgr/rpcserver.c @@ -2638,8 +2638,39 @@ PNP_GetInterfaceDeviceAlias( PNP_RPC_STRING_LEN *pulTransferLen, DWORD ulFlags) { - UNIMPLEMENTED; - return CR_CALL_NOT_IMPLEMENTED; + NTSTATUS Status; + PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA PlugPlayData; + DWORD ret = CR_SUCCESS; + + UNREFERENCED_PARAMETER(hBinding); + + DPRINT("PNP_GetInterfaceDeviceAlias(%p %S %p %p %p %p 0x%08lx)\n", + hBinding, pszInterfaceDevice, AliasInterfaceGuid, pszAliasInterfaceDevice, pulLength, + pulTransferLen, ulFlags); + + if ((AliasInterfaceGuid == NULL) || + (pulLength == NULL)) + return CR_INVALID_POINTER; + + if (ulFlags != 0) + return CR_INVALID_FLAG; + + Status = NtPlugPlayControl(PlugPlayControlGetInterfaceDeviceAlias, + &PlugPlayData, + sizeof(PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA)); + if (NT_SUCCESS(Status)) + { + *pulLength = PlugPlayData.AliasSymbolicLinkNameLength; + *pulTransferLen = *pulLength + 1; + } + else + { + *pulLength = 0; + ret = NtStatusToCrError(Status); + } + + DPRINT("PNP_GetInterfaceDeviceAlias() done (returns %lx)\n", ret); + return ret; } diff --git a/sdk/include/ndk/cmtypes.h b/sdk/include/ndk/cmtypes.h index 7448c7d19be..808dc374c73 100644 --- a/sdk/include/ndk/cmtypes.h +++ b/sdk/include/ndk/cmtypes.h @@ -519,6 +519,15 @@ typedef struct _PLUGPLAY_CONTROL_RELATED_DEVICE_DATA ULONG RelatedDeviceInstanceLength; } PLUGPLAY_CONTROL_RELATED_DEVICE_DATA, *PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA; +// PlugPlayControlGetInterfaceDeviceAlias (0x0D) +typedef struct _PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA +{ + UNICODE_STRING SymbolicLinkName; + GUID *AliasInterfaceClassGuid; + PWCHAR AliasSymbolicLinkName; + ULONG AliasSymbolicLinkNameLength; +} PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA, *PPLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA; + // PlugPlayControlDeviceStatus (0x0E) typedef struct _PLUGPLAY_CONTOL_STATUS_DATA {