From 13bb5e2317962c5a08d19b837a2523aa7458e772 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 15 Oct 2019 22:40:06 +0200 Subject: [PATCH] [umpnpmgr][ndk] Implement PNP_RequestDeviceEject() and update unknown type in PLUGPLAY_CONTROL_QUERY_REMOVE_DATA --- base/services/umpnpmgr/rpcserver.c | 34 ++++++++++++++++++++++++++++-- sdk/include/ndk/cmtypes.h | 2 +- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/base/services/umpnpmgr/rpcserver.c b/base/services/umpnpmgr/rpcserver.c index bef58c8895a..141026b7bd1 100644 --- a/base/services/umpnpmgr/rpcserver.c +++ b/base/services/umpnpmgr/rpcserver.c @@ -2972,6 +2972,7 @@ PNP_QueryRemove( pszDeviceID); PlugPlayData.VetoName = pszVetoName; PlugPlayData.NameLength = ulNameLength; +// PlugPlayData.Flags = Status = NtPlugPlayControl(PlugPlayControlQueryAndRemoveDevice, &PlugPlayData, @@ -2994,8 +2995,37 @@ PNP_RequestDeviceEject( DWORD ulNameLength, DWORD ulFlags) { - UNIMPLEMENTED; - return CR_CALL_NOT_IMPLEMENTED; + PLUGPLAY_CONTROL_QUERY_REMOVE_DATA PlugPlayData; + NTSTATUS Status; + DWORD ret = CR_SUCCESS; + + DPRINT1("PNP_RequestDeviceEject(%p %S %p %p %lu 0x%lx)\n", + hBinding, pszDeviceID, pVetoType, pszVetoName, + ulNameLength, ulFlags); + + if (ulFlags != 0) + return CR_INVALID_FLAG; + + if (pVetoType != NULL) + *pVetoType = PNP_VetoTypeUnknown; + + if (pszVetoName != NULL && ulNameLength > 0) + *pszVetoName = UNICODE_NULL; + + RtlZeroMemory(&PlugPlayData, sizeof(PlugPlayData)); + RtlInitUnicodeString(&PlugPlayData.DeviceInstance, + pszDeviceID); + PlugPlayData.VetoName = pszVetoName; + PlugPlayData.NameLength = ulNameLength; +// PlugPlayData.Flags = + + Status = NtPlugPlayControl(PlugPlayControlQueryAndRemoveDevice, + &PlugPlayData, + sizeof(PlugPlayData)); + if (!NT_SUCCESS(Status)) + ret = NtStatusToCrError(Status); + + return ret; } diff --git a/sdk/include/ndk/cmtypes.h b/sdk/include/ndk/cmtypes.h index 8c0b50f6007..6446f4efec2 100644 --- a/sdk/include/ndk/cmtypes.h +++ b/sdk/include/ndk/cmtypes.h @@ -457,7 +457,7 @@ typedef struct _PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA typedef struct _PLUGPLAY_CONTROL_QUERY_REMOVE_DATA { UNICODE_STRING DeviceInstance; - ULONG Unknown2; + ULONG Flags; PNP_VETO_TYPE VetoType; LPWSTR VetoName; ULONG NameLength; -- 2.17.1