mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +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
|
||||
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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue