[NTOSKRNL][USETUP][UMPNPMGR] Pass user response data to NtPlugPlayControl(PlugPlayControlUserResponse).

- 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.
This commit is contained in:
Eric Kohl 2019-06-12 13:46:13 +02:00
parent 0e1e12b619
commit 6866c0aede
4 changed files with 29 additions and 4 deletions

View file

@ -50,6 +50,7 @@ HKEY hClassKey = NULL;
static DWORD WINAPI static DWORD WINAPI
PnpEventThread(LPVOID lpParameter) PnpEventThread(LPVOID lpParameter)
{ {
PLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData = {0, 0, 0, 0};
DWORD dwRet = ERROR_SUCCESS; DWORD dwRet = ERROR_SUCCESS;
NTSTATUS Status; NTSTATUS Status;
RPC_STATUS RpcStatus; RPC_STATUS RpcStatus;
@ -182,7 +183,14 @@ PnpEventThread(LPVOID lpParameter)
} }
/* Dequeue the current PnP event and signal the next one */ /* 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); HeapFree(GetProcessHeap(), 0, PnpEvent);

View file

@ -405,6 +405,7 @@ static ULONG NTAPI
PnpEventThread(IN PVOID Parameter) PnpEventThread(IN PVOID Parameter)
{ {
NTSTATUS Status; NTSTATUS Status;
PLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData = {0, 0, 0, 0};
PPLUGPLAY_EVENT_BLOCK PnpEvent, NewPnpEvent; PPLUGPLAY_EVENT_BLOCK PnpEvent, NewPnpEvent;
ULONG PnpEventSize; ULONG PnpEventSize;
@ -483,7 +484,14 @@ PnpEventThread(IN PVOID Parameter)
} }
/* Dequeue the current PnP event and signal the next one */ /* 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; Status = STATUS_SUCCESS;

View file

@ -1346,7 +1346,7 @@ NtPlugPlayControl(IN PLUGPLAY_CONTROL_CLASS PlugPlayControlClass,
// case PlugPlayControlQueryAndRemoveDevice: // case PlugPlayControlQueryAndRemoveDevice:
case PlugPlayControlUserResponse: case PlugPlayControlUserResponse:
if (Buffer || BufferLength != 0) if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_USER_RESPONSE_DATA))
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
return IopRemovePlugPlayEvent(); return IopRemovePlugPlayEvent();

View file

@ -452,7 +452,16 @@ typedef struct _PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA
ULONG Flags; ULONG Flags;
} PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA, *PPLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA; } 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 typedef struct _PLUGPLAY_CONTROL_INTERFACE_DEVICE_LIST_DATA
{ {
UNICODE_STRING DeviceInstance; UNICODE_STRING DeviceInstance;