mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 08:16:34 +00:00
[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:
parent
0e1e12b619
commit
6866c0aede
4 changed files with 29 additions and 4 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue