[NTOSKRNL][USETUP][UMPNPMGR] Pass user response data to NtPlugPlayControl(PlugPlayCon...
authorEric Kohl <eric.kohl@reactos.org>
Wed, 12 Jun 2019 11:46:13 +0000 (13:46 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Wed, 12 Jun 2019 11:48:27 +0000 (13:48 +0200)
- Windows requires 16 bytes of response data.
- Add the PLUGPLAY_CONTROL_USER_RESPONSE_DATA type.
- Usetup and Umpnpmgr must fail if NtPlugPlayControl(PlugPlayControlUserResponse) does not return STATUS_SUCCESS.

base/services/umpnpmgr/umpnpmgr.c
base/setup/usetup/devinst.c
ntoskrnl/io/pnpmgr/plugplay.c
sdk/include/ndk/cmtypes.h

index e26fa2f..7aa6481 100644 (file)
@@ -50,6 +50,7 @@ HKEY hClassKey = NULL;
 static DWORD WINAPI
 PnpEventThread(LPVOID lpParameter)
 {
+    PLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData = {0, 0, 0, 0};
     DWORD dwRet = ERROR_SUCCESS;
     NTSTATUS Status;
     RPC_STATUS RpcStatus;
@@ -182,7 +183,14 @@ PnpEventThread(LPVOID lpParameter)
         }
 
         /* Dequeue the current PnP event and signal the next one */
-        NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);
+        Status = NtPlugPlayControl(PlugPlayControlUserResponse,
+                                   &ResponseData,
+                                   sizeof(ResponseData));
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("NtPlugPlayControl(PlugPlayControlUserResponse) failed (Status 0x%08lx)\n", Status);
+            break;
+        }
     }
 
     HeapFree(GetProcessHeap(), 0, PnpEvent);
index ea4333c..d9fc5c2 100644 (file)
@@ -405,6 +405,7 @@ static ULONG NTAPI
 PnpEventThread(IN PVOID Parameter)
 {
     NTSTATUS Status;
+    PLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData = {0, 0, 0, 0};
     PPLUGPLAY_EVENT_BLOCK PnpEvent, NewPnpEvent;
     ULONG PnpEventSize;
 
@@ -483,7 +484,14 @@ PnpEventThread(IN PVOID Parameter)
         }
 
         /* Dequeue the current PnP event and signal the next one */
-        NtPlugPlayControl(PlugPlayControlUserResponse, NULL, 0);
+        Status = NtPlugPlayControl(PlugPlayControlUserResponse,
+                                   &ResponseData,
+                                   sizeof(ResponseData));
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("NtPlugPlayControl(PlugPlayControlUserResponse) failed (Status 0x%08lx)\n", Status);
+            goto Quit;
+        }
     }
 
     Status = STATUS_SUCCESS;
index 50331e2..8526817 100644 (file)
@@ -1346,7 +1346,7 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass,
 //        case PlugPlayControlQueryAndRemoveDevice:
 
         case PlugPlayControlUserResponse:
-            if (Buffer || BufferLength != 0)
+            if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_USER_RESPONSE_DATA))
                 return STATUS_INVALID_PARAMETER;
             return IopRemovePlugPlayEvent();
 
index 2b85492..7eed814 100644 (file)
@@ -452,7 +452,16 @@ typedef struct _PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA
     ULONG Flags;
 } PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA, *PPLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA;
 
-//Class 0x09
+// Class 0x07
+typedef struct _PLUGPLAY_CONTROL_USER_RESPONSE_DATA
+{
+    ULONG Unknown1;
+    ULONG Unknown2;
+    ULONG Unknown3;
+    ULONG Unknown4;
+} PLUGPLAY_CONTROL_USER_RESPONSE_DATA, *PPLUGPLAY_CONTROL_USER_RESPONSE_DATA;
+
+// Class 0x09
 typedef struct _PLUGPLAY_CONTROL_INTERFACE_DEVICE_LIST_DATA
 {
     UNICODE_STRING DeviceInstance;