From 2bdea48b494ac07aa6d8424e19674ef9a26be96f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 3 Jul 2005 21:25:00 +0000 Subject: [PATCH] - Implement PlugPlayControlProperty and PlugPlayControlGetDeviceDepth - Move documentation from NDK headers svn path=/trunk/; revision=16399 --- reactos/include/ndk/zwtypes.h | 38 ++++---------- reactos/ntoskrnl/io/plugplay.c | 90 +++++++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 31 deletions(-) diff --git a/reactos/include/ndk/zwtypes.h b/reactos/include/ndk/zwtypes.h index 63e20bece2f..64df29208e6 100644 --- a/reactos/include/ndk/zwtypes.h +++ b/reactos/include/ndk/zwtypes.h @@ -279,7 +279,8 @@ typedef enum _PLUGPLAY_CONTROL_CLASS PlugPlayControlUserResponse = 0x07, PlugPlayControlProperty = 0x0A, PlugPlayControlGetRelatedDevice = 0x0C, - PlugPlayControlDeviceStatus = 0x0E + PlugPlayControlDeviceStatus = 0x0E, + PlugPlayControlGetDeviceDepth } PLUGPLAY_CONTROL_CLASS; /* TYPES *********************************************************************/ @@ -287,34 +288,6 @@ typedef enum _PLUGPLAY_CONTROL_CLASS typedef unsigned short LANGID; typedef LANGID *PLANGID; -/* - * Plug and Play event structure used by NtGetPlugPlayEvent. - * - * EventGuid - * Can be one of the following values: - * GUID_HWPROFILE_QUERY_CHANGE - * GUID_HWPROFILE_CHANGE_CANCELLED - * GUID_HWPROFILE_CHANGE_COMPLETE - * GUID_TARGET_DEVICE_QUERY_REMOVE - * GUID_TARGET_DEVICE_REMOVE_CANCELLED - * GUID_TARGET_DEVICE_REMOVE_COMPLETE - * GUID_PNP_CUSTOM_NOTIFICATION - * GUID_PNP_POWER_NOTIFICATION - * GUID_DEVICE_* (see above) - * - * EventCategory - * Type of the event that happened. - * - * Result - * ? - * - * Flags - * ? - * - * TotalSize - * Size of the event block including the device IDs and other - * per category specific fields. - */ typedef struct _PLUGPLAY_EVENT_BLOCK { GUID EventGuid; @@ -1285,4 +1258,11 @@ typedef struct _PLUGPLAY_CONTOL_STATUS_DATA ULONG DeviceProblem; /* CM_PROB_ see cfg.h */ } PLUGPLAY_CONTROL_STATUS_DATA, *PPLUGPLAY_CONTROL_STATUS_DATA; +/* Class 0x0F */ +typedef struct _PLUGPLAY_CONTOL_DEPTH_DATA +{ + UNICODE_STRING DeviceInstance; + ULONG Depth; +} PLUGPLAY_CONTROL_DEPTH_DATA, *PPLUGPLAY_CONTROL_DEPTH_DATA; + #endif diff --git a/reactos/ntoskrnl/io/plugplay.c b/reactos/ntoskrnl/io/plugplay.c index 5a13fa53126..a6d2218f6eb 100644 --- a/reactos/ntoskrnl/io/plugplay.c +++ b/reactos/ntoskrnl/io/plugplay.c @@ -103,6 +103,34 @@ IopRemovePlugPlayEvent(VOID) } +/* + * Plug and Play event structure used by NtGetPlugPlayEvent. + * + * EventGuid + * Can be one of the following values: + * GUID_HWPROFILE_QUERY_CHANGE + * GUID_HWPROFILE_CHANGE_CANCELLED + * GUID_HWPROFILE_CHANGE_COMPLETE + * GUID_TARGET_DEVICE_QUERY_REMOVE + * GUID_TARGET_DEVICE_REMOVE_CANCELLED + * GUID_TARGET_DEVICE_REMOVE_COMPLETE + * GUID_PNP_CUSTOM_NOTIFICATION + * GUID_PNP_POWER_NOTIFICATION + * GUID_DEVICE_* (see above) + * + * EventCategory + * Type of the event that happened. + * + * Result + * ? + * + * Flags + * ? + * + * TotalSize + * Size of the event block including the device IDs and other + * per category specific fields. + */ /* * NtGetPlugPlayEvent * @@ -311,6 +339,32 @@ IopGetDeviceObjectFromDeviceInstance(PUNICODE_STRING DeviceInstance) } +static NTSTATUS +IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData) +{ + PDEVICE_OBJECT DeviceObject = NULL; + NTSTATUS Status; + + DPRINT("IopGetDeviceProperty() called\n"); + DPRINT("Device name: %wZ\n", &PropertyData->DeviceInstance); + + /* Get the device object */ + DeviceObject = IopGetDeviceObjectFromDeviceInstance(&PropertyData->DeviceInstance); + if (DeviceObject == NULL) + return STATUS_NO_SUCH_DEVICE; + + Status = IoGetDeviceProperty(DeviceObject, + PropertyData->Property, + PropertyData->BufferSize, + PropertyData->Buffer, + &PropertyData->BufferSize); + + ObDereferenceObject(DeviceObject); + + return Status; +} + + static NTSTATUS IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData) { @@ -320,7 +374,6 @@ IopGetRelatedDevice(PPLUGPLAY_CONTROL_RELATED_DEVICE_DATA RelatedDeviceData) PDEVICE_NODE RelatedDeviceNode; DPRINT("IopGetRelatedDevice() called\n"); - DPRINT("Device name: %wZ\n", &RelatedDeviceData->TargetDeviceInstance); RtlInitUnicodeString(&RootDeviceName, @@ -410,7 +463,6 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData) PDEVICE_NODE DeviceNode; DPRINT("IopDeviceStatus() called\n"); - DPRINT("Device name: %wZ\n", &StatusData->DeviceInstance); /* Get the device object */ @@ -445,6 +497,30 @@ IopDeviceStatus(PPLUGPLAY_CONTROL_STATUS_DATA StatusData) } +static NTSTATUS +IopGetDeviceDepth(PPLUGPLAY_CONTROL_DEPTH_DATA DepthData) +{ + PDEVICE_OBJECT DeviceObject; + PDEVICE_NODE DeviceNode; + + DPRINT("IopGetDeviceDepth() called\n"); + DPRINT("Device name: %wZ\n", &DepthData->DeviceInstance); + + /* Get the device object */ + DeviceObject = IopGetDeviceObjectFromDeviceInstance(&DepthData->DeviceInstance); + if (DeviceObject == NULL) + return STATUS_NO_SUCH_DEVICE; + + DeviceNode = DeviceObject->DeviceObjectExtension->DeviceNode; + + DepthData->Depth = DeviceNode->Level; + + ObDereferenceObject(DeviceObject); + + return STATUS_SUCCESS; +} + + /* * NtPlugPlayControl * @@ -551,6 +627,11 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass, return STATUS_INVALID_PARAMETER; return IopRemovePlugPlayEvent(); + case PlugPlayControlProperty: + if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_PROPERTY_DATA)) + return STATUS_INVALID_PARAMETER; + return IopGetDeviceProperty((PPLUGPLAY_CONTROL_PROPERTY_DATA)Buffer); + case PlugPlayControlGetRelatedDevice: if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_RELATED_DEVICE_DATA)) return STATUS_INVALID_PARAMETER; @@ -561,6 +642,11 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass, return STATUS_INVALID_PARAMETER; return IopDeviceStatus((PPLUGPLAY_CONTROL_STATUS_DATA)Buffer); + case PlugPlayControlGetDeviceDepth: + if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_DEPTH_DATA)) + return STATUS_INVALID_PARAMETER; + return IopGetDeviceDepth((PPLUGPLAY_CONTROL_DEPTH_DATA)Buffer); + default: return STATUS_NOT_IMPLEMENTED; }