- 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.
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;
}
/* 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);
PnpEventThread(IN PVOID Parameter)
{
NTSTATUS Status;
+ PLUGPLAY_CONTROL_USER_RESPONSE_DATA ResponseData = {0, 0, 0, 0};
PPLUGPLAY_EVENT_BLOCK PnpEvent, NewPnpEvent;
ULONG PnpEventSize;
}
/* 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;
// case PlugPlayControlQueryAndRemoveDevice:
case PlugPlayControlUserResponse:
- if (Buffer || BufferLength != 0)
+ if (!Buffer || BufferLength < sizeof(PLUGPLAY_CONTROL_USER_RESPONSE_DATA))
return STATUS_INVALID_PARAMETER;
return IopRemovePlugPlayEvent();
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;