https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4ffa0a2e5525805bb26f29cdcb1ffdd0722296bc

commit 4ffa0a2e5525805bb26f29cdcb1ffdd0722296bc
Author:     Eric Kohl <eric.k...@reactos.org>
AuthorDate: Sun Jul 15 15:57:57 2018 +0200
Commit:     Eric Kohl <eric.k...@reactos.org>
CommitDate: Sun Jul 15 15:57:57 2018 +0200

    [NTOSKRNL][NDK][UMPNPMGR] Define and use 
PLUGPLAY_CONTROL_PROPERTY_DATA.Properties values
    
    NDK: Define PLUGPLAY_CONTROL_PROPERTY_DATA.Properties and 
PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA.Relations values.
    
    NTOSKRNL: Map PLUGPLAY_CONTROL_PROPERTY_DATA.Properties values to 
IoGetDeviceProperty properties and add (dummy) code for unsupported cases.
    
    UMPNPMGR: Use PLUGPLAY_CONTROL_PROPERTY_DATA.Properties values in 
PNP_GetDeviceRegProp.
---
 base/services/umpnpmgr/umpnpmgr.c |  35 +++++-----
 ntoskrnl/io/pnpmgr/plugplay.c     | 134 ++++++++++++++++++++++++++++++++++----
 sdk/include/ndk/cmtypes.h         |  33 +++++++++-
 3 files changed, 169 insertions(+), 33 deletions(-)

diff --git a/base/services/umpnpmgr/umpnpmgr.c 
b/base/services/umpnpmgr/umpnpmgr.c
index de64057afb..478bcc7825 100644
--- a/base/services/umpnpmgr/umpnpmgr.c
+++ b/base/services/umpnpmgr/umpnpmgr.c
@@ -926,61 +926,58 @@ PNP_GetDeviceRegProp(
         switch (ulProperty)
         {
             case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME:
-                PlugPlayData.Property = 0xb; // 
DevicePropertyPhysicalDeviceObjectName;
+                PlugPlayData.Property = 
PNP_PROPERTY_PHYSICAL_DEVICE_OBJECT_NAME;
                 break;
 
             case CM_DRP_UI_NUMBER:
-                PlugPlayData.Property = 0x11; // DevicePropertyUINumber;
+                PlugPlayData.Property = PNP_PROPERTY_UI_NUMBER;
                 break;
 
             case CM_DRP_BUSTYPEGUID:
-                PlugPlayData.Property = 0xc; // DevicePropertyBusTypeGuid;
+                PlugPlayData.Property = PNP_PROPERTY_BUSTYPEGUID;
                 break;
 
             case CM_DRP_LEGACYBUSTYPE:
-                PlugPlayData.Property = 0xd; // DevicePropertyLegacyBusType;
+                PlugPlayData.Property = PNP_PROPERTY_LEGACYBUSTYPE;
                 break;
 
             case CM_DRP_BUSNUMBER:
-                PlugPlayData.Property = 0xe; // DevicePropertyBusNumber;
+                PlugPlayData.Property = PNP_PROPERTY_BUSNUMBER;
                 break;
 
             case CM_DRP_ENUMERATOR_NAME:
-                PlugPlayData.Property = 0xf; // DevicePropertyEnumeratorName;
+                PlugPlayData.Property = PNP_PROPERTY_ENUMERATOR_NAME;
                 break;
 
             case CM_DRP_ADDRESS:
-                PlugPlayData.Property = 0x10; // DevicePropertyAddress;
+                PlugPlayData.Property = PNP_PROPERTY_ADDRESS;
                 break;
 
-#if 0
-            /* FIXME: This property is not supported by IoGetDeviceProperty */
             case CM_DRP_DEVICE_POWER_DATA:
-#endif
+                PlugPlayData.Property = PNP_PROPERTY_POWER_DATA;
+                break;
 
             case CM_DRP_REMOVAL_POLICY:
-                PlugPlayData.Property = 0x13; // DevicePropertyRemovalPolicy
+                PlugPlayData.Property = PNP_PROPERTY_REMOVAL_POLICY;
                 break;
 
-#if 0
-            /* FIXME: This property is not supported by IoGetDeviceProperty */
             case CM_DRP_REMOVAL_POLICY_HW_DEFAULT:
-#endif
+                PlugPlayData.Property = 
PNP_PROPERTY_REMOVAL_POLICY_HARDWARE_DEFAULT;
+                break;
 
             case CM_DRP_INSTALL_STATE:
-                PlugPlayData.Property = 0x12; // DevicePropertyInstallState;
+                PlugPlayData.Property = PNP_PROPERTY_INSTALL_STATE;
                 break;
 
-#if 0
-            /* FIXME: This property is not supported by IoGetDeviceProperty */
 #if (WINVER >= _WIN32_WINNT_WS03)
             case CM_DRP_LOCATION_PATHS:
-#endif
+                PlugPlayData.Property = PNP_PROPERTY_LOCATION_PATHS;
+                break;
 #endif
 
 #if (WINVER >= _WIN32_WINNT_WIN7)
             case CM_DRP_BASE_CONTAINERID:
-                PlugPlayData.Property = 0x16; // DevicePropertyContainerID;
+                PlugPlayData.Property = PNP_PROPERTY_CONTAINERID;
                 break;
 #endif
 
diff --git a/ntoskrnl/io/pnpmgr/plugplay.c b/ntoskrnl/io/pnpmgr/plugplay.c
index 9797017e87..4c65792a4a 100644
--- a/ntoskrnl/io/pnpmgr/plugplay.c
+++ b/ntoskrnl/io/pnpmgr/plugplay.c
@@ -294,11 +294,13 @@ static NTSTATUS
 IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData)
 {
     PDEVICE_OBJECT DeviceObject = NULL;
-    NTSTATUS Status;
+    PDEVICE_NODE DeviceNode;
     UNICODE_STRING DeviceInstance;
     ULONG BufferSize;
-    ULONG Property = 0;
+    ULONG Property;
+    DEVICE_REGISTRY_PROPERTY DeviceProperty;
     PVOID Buffer;
+    NTSTATUS Status;
 
     DPRINT("IopGetDeviceProperty() called\n");
     DPRINT("Device name: %wZ\n", &PropertyData->DeviceInstance);
@@ -341,14 +343,124 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA 
PropertyData)
     Buffer = ExAllocatePool(NonPagedPool, BufferSize);
     if (Buffer == NULL)
     {
+        ObDereferenceObject(DeviceObject);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
-    Status = IoGetDeviceProperty(DeviceObject,
-                                 Property,
-                                 BufferSize,
-                                 Buffer,
-                                 &BufferSize);
+
+    DeviceNode = 
((PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension)->DeviceNode;
+
+    if (Property == PNP_PROPERTY_POWER_DATA)
+    {
+        if (BufferSize < sizeof(CM_POWER_DATA))
+        {
+            BufferSize = 0;
+            Status = STATUS_BUFFER_TOO_SMALL;
+        }
+        else
+        {
+//            DEVICE_CAPABILITIES DeviceCapabilities;
+            PCM_POWER_DATA PowerData;
+
+//            Status = IopQueryDeviceCapabilities(DeviceNode, 
&DeviceCapabilities);
+
+            PowerData = (PCM_POWER_DATA)Buffer;
+            PowerData->PD_Size = sizeof(CM_POWER_DATA);
+/*
+            PowerData->PD_MostRecentPowerState;
+            PowerData->PD_Capabilities;
+            PowerData->PD_D1Latency;
+            PowerData->PD_D2Latency;
+            PowerData->PD_D3Latency;
+            PowerData->PD_PowerStateMapping[POWER_SYSTEM_MAXIMUM];
+            PowerData->PD_DeepestSystemWake;
+*/
+        }
+    }
+    else if (Property == PNP_PROPERTY_REMOVAL_POLICY_OVERRIDE)
+    {
+    }
+    else if (Property == PNP_PROPERTY_REMOVAL_POLICY_HARDWARE_DEFAULT)
+    {
+        if (BufferSize < sizeof(DeviceNode->HardwareRemovalPolicy))
+        {
+            BufferSize = 0;
+            Status = STATUS_BUFFER_TOO_SMALL;
+        }
+        else
+        {
+            BufferSize = sizeof(DeviceNode->HardwareRemovalPolicy);
+            RtlCopyMemory(Buffer,
+                          &DeviceNode->HardwareRemovalPolicy,
+                          BufferSize);
+        }
+    }
+    else
+    {
+        switch (Property)
+        {
+            case PNP_PROPERTY_UI_NUMBER:
+                DeviceProperty = DevicePropertyUINumber;
+                break;
+
+            case PNP_PROPERTY_PHYSICAL_DEVICE_OBJECT_NAME:
+                DeviceProperty = DevicePropertyPhysicalDeviceObjectName;
+                break;
+
+            case PNP_PROPERTY_BUSTYPEGUID:
+                DeviceProperty = DevicePropertyBusTypeGuid;
+                break;
+
+            case PNP_PROPERTY_LEGACYBUSTYPE:
+                DeviceProperty = DevicePropertyLegacyBusType;
+                break;
+
+            case PNP_PROPERTY_BUSNUMBER:
+                DeviceProperty = DevicePropertyBusNumber;
+                break;
+
+            case PNP_PROPERTY_REMOVAL_POLICY:
+                DeviceProperty = DevicePropertyRemovalPolicy;
+                break;
+
+            case PNP_PROPERTY_ADDRESS:
+                DeviceProperty = DevicePropertyAddress;
+                break;
+
+            case PNP_PROPERTY_ENUMERATOR_NAME:
+                DeviceProperty = DevicePropertyEnumeratorName;
+                break;
+
+            case PNP_PROPERTY_INSTALL_STATE:
+                DeviceProperty = DevicePropertyInstallState;
+                break;
+
+#if (WINVER >= _WIN32_WINNT_WS03)
+            case PNP_PROPERTY_LOCATION_PATHS:
+                break;
+#endif
+
+#if (WINVER >= _WIN32_WINNT_WIN7)
+            case PNP_PROPERTY_CONTAINERID:
+                DeviceProperty = DevicePropertyContainerID;
+                break;
+#endif
+
+            default:
+                BufferSize = 0;
+                Status = STATUS_INVALID_PARAMETER;
+                break;
+        }
+
+        if (Status == STATUS_SUCCESS)
+        {
+            Status = IoGetDeviceProperty(DeviceObject,
+                                         DeviceProperty,
+                                         BufferSize,
+                                         Buffer,
+                                         &BufferSize);
+        }
+    }
 
     ObDereferenceObject(DeviceObject);
 
@@ -696,19 +808,19 @@ 
IopGetDeviceRelations(PPLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA RelationsData)
 
     switch (Relations)
     {
-        case 0: /* EjectRelations */
+        case PNP_EJECT_RELATIONS:
             Stack.Parameters.QueryDeviceRelations.Type = EjectionRelations;
             break;
 
-        case 1: /* RemovalRelations */
+        case PNP_REMOVAL_RELATIONS:
             Stack.Parameters.QueryDeviceRelations.Type = RemovalRelations;
             break;
 
-        case 2: /* PowerRelations */
+        case PNP_POWER_RELATIONS:
             Stack.Parameters.QueryDeviceRelations.Type = PowerRelations;
             break;
 
-        case 3: /* BusRelations */
+        case PNP_BUS_RELATIONS:
             Stack.Parameters.QueryDeviceRelations.Type = BusRelations;
             break;
 
diff --git a/sdk/include/ndk/cmtypes.h b/sdk/include/ndk/cmtypes.h
index 56fbaa1139..1d58d93b68 100644
--- a/sdk/include/ndk/cmtypes.h
+++ b/sdk/include/ndk/cmtypes.h
@@ -28,6 +28,24 @@ Author:
 
 #define MAX_BUS_NAME 24
 
+//
+// PLUGPLAY_CONTROL_PROPERTY_DATA.Properties
+//
+#define PNP_PROPERTY_UI_NUMBER                        0
+#define PNP_PROPERTY_PHYSICAL_DEVICE_OBJECT_NAME      1
+#define PNP_PROPERTY_BUSTYPEGUID                      2
+#define PNP_PROPERTY_LEGACYBUSTYPE                    3
+#define PNP_PROPERTY_BUSNUMBER                        4
+#define PNP_PROPERTY_POWER_DATA                       5
+#define PNP_PROPERTY_REMOVAL_POLICY                   6
+#define PNP_PROPERTY_REMOVAL_POLICY_OVERRIDE          7
+#define PNP_PROPERTY_ADDRESS                          8
+#define PNP_PROPERTY_ENUMERATOR_NAME                  9
+#define PNP_PROPERTY_REMOVAL_POLICY_HARDWARE_DEFAULT 10
+#define PNP_PROPERTY_INSTALL_STATE                   11
+#define PNP_PROPERTY_LOCATION_PATHS                  12
+#define PNP_PROPERTY_CONTAINERID                     13
+
 //
 // PLUGPLAY_CONTROL_RELATED_DEVICE_DATA.Relations
 //
@@ -36,12 +54,21 @@ Author:
 #define PNP_GET_SIBLING_DEVICE          3
 
 //
-// PLUGPLAY_CONTROL_STATUS_DATA Operations
+// PLUGPLAY_CONTROL_STATUS_DATA.Operation
 //
 #define PNP_GET_DEVICE_STATUS           0
 #define PNP_SET_DEVICE_STATUS           1
 #define PNP_CLEAR_DEVICE_STATUS         2
 
+//
+// PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA.Relations
+//
+#define PNP_EJECT_RELATIONS             0
+#define PNP_REMOVAL_RELATIONS           1
+#define PNP_POWER_RELATIONS             2
+#define PNP_BUS_RELATIONS               3
+
+
 #ifdef NTOS_MODE_USER
 
 //
@@ -466,7 +493,7 @@ typedef struct _PLUGPLAY_CONTROL_DEPTH_DATA
 typedef struct _PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA
 {
     UNICODE_STRING DeviceInstance;
-    ULONG Relations; // 0:EjectRelations, 1:RemovalRelations, 
2:PowerRelations, 3:BusRelations
+    ULONG Relations;
     ULONG BufferSize;
     PWCHAR Buffer;
 } PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA, 
*PPLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA;
@@ -481,7 +508,7 @@ typedef struct _PLUGPLAY_CONTROL_RETRIEVE_DOCK_DATA
 // Class 0x14
 typedef struct _PLUGPLAY_CONTROL_RESET_DEVICE_DATA
 {
-   UNICODE_STRING DeviceInstance;
+    UNICODE_STRING DeviceInstance;
 } PLUGPLAY_CONTROL_RESET_DEVICE_DATA, *PPLUGPLAY_CONTROL_RESET_DEVICE_DATA;
 
 //

Reply via email to