2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS USB miniport driver (Cromwell type)
4 * FILE: drivers/usb/miniport/common/fdo.c
5 * PURPOSE: IRP_MJ_PNP/IRP_MJ_DEVICE_CONTROL operations for FDOs
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org),
8 * James Tabor (jimtabor@adsl-64-217-116-74.dsl.hstntx.swbell.net)
14 #include "usbcommon.h"
16 #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
21 IN ULONG IoControlCode
,
29 switch (IO_METHOD_FROM_CTL_CODE(IoControlCode
))
32 *BufferIn
= *BufferOut
= Irp
->AssociatedIrp
.SystemBuffer
;
34 case METHOD_IN_DIRECT
:
35 case METHOD_OUT_DIRECT
:
36 *BufferIn
= Irp
->AssociatedIrp
.SystemBuffer
;
37 *BufferOut
= MmGetSystemAddressForMdl(Irp
->MdlAddress
);
40 *BufferIn
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.DeviceIoControl
.Type3InputBuffer
;
41 *BufferOut
= Irp
->UserBuffer
;
44 /* Should never happen */
53 IN PDEVICE_OBJECT DeviceObject
,
56 PIO_STACK_LOCATION Stack
= IoGetCurrentIrpStackLocation(Irp
);
57 PDRIVER_OBJECT DriverObject
;
58 PUSBMP_DRIVER_EXTENSION DriverExtension
;
59 PUSBMP_DEVICE_EXTENSION DeviceExtension
;
60 PCM_RESOURCE_LIST AllocatedResources
;
64 if (DeviceObject
== KeyboardFdo
|| DeviceObject
== MouseFdo
)
65 return STATUS_SUCCESS
;
68 * Get the initialization data we saved in VideoPortInitialize.
70 DriverObject
= DeviceObject
->DriverObject
;
71 DriverExtension
= IoGetDriverObjectExtension(DriverObject
, DriverObject
);
72 DeviceExtension
= (PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
75 * Store some resources in the DeviceExtension.
77 AllocatedResources
= Stack
->Parameters
.StartDevice
.AllocatedResources
;
78 if (AllocatedResources
!= NULL
)
80 CM_FULL_RESOURCE_DESCRIPTOR
*FullList
;
81 CM_PARTIAL_RESOURCE_DESCRIPTOR
*Descriptor
;
83 ULONG ResourceListSize
;
85 /* Save the resource list */
86 ResourceCount
= AllocatedResources
->List
[0].PartialResourceList
.Count
;
88 ResourceListSize
= FIELD_OFFSET(CM_RESOURCE_LIST
, List
[0].PartialResourceList
.
89 PartialDescriptors
[ResourceCount
]);
91 DeviceExtension
->AllocatedResources
= ExAllocatePool(PagedPool
, ResourceListSize
);
92 if (DeviceExtension
->AllocatedResources
== NULL
)
94 return STATUS_INSUFFICIENT_RESOURCES
;
97 RtlCopyMemory(DeviceExtension
->AllocatedResources
,
101 /* Get the interrupt level/vector - needed by HwFindAdapter sometimes */
102 for (FullList
= AllocatedResources
->List
;
103 FullList
< AllocatedResources
->List
+ AllocatedResources
->Count
;
106 /* FIXME: Is this ASSERT ok for resources from the PNP manager? */
107 /*ASSERT(FullList->InterfaceType == PCIBus &&
108 FullList->BusNumber == DeviceExtension->SystemIoBusNumber &&
109 1 == FullList->PartialResourceList.Version &&
110 1 == FullList->PartialResourceList.Revision);*/
111 for (Descriptor
= FullList
->PartialResourceList
.PartialDescriptors
;
112 Descriptor
< FullList
->PartialResourceList
.PartialDescriptors
+ FullList
->PartialResourceList
.Count
;
115 if (Descriptor
->Type
== CmResourceTypeInterrupt
)
117 DeviceExtension
->InterruptLevel
= Descriptor
->u
.Interrupt
.Level
;
118 DeviceExtension
->InterruptVector
= Descriptor
->u
.Interrupt
.Vector
;
120 else if (Descriptor
->Type
== CmResourceTypePort
)
122 DeviceExtension
->BaseAddress
= Descriptor
->u
.Port
.Start
;
123 DeviceExtension
->BaseAddrLength
= Descriptor
->u
.Port
.Length
;
124 DeviceExtension
->Flags
= Descriptor
->Flags
;
126 ((struct hc_driver
*)pci_ids
->driver_data
)->flags
&= ~HCD_MEMORY
;
128 else if (Descriptor
->Type
== CmResourceTypeMemory
)
130 DeviceExtension
->BaseAddress
= Descriptor
->u
.Memory
.Start
;
131 DeviceExtension
->BaseAddrLength
= Descriptor
->u
.Memory
.Length
;
132 DeviceExtension
->Flags
= Descriptor
->Flags
;
134 ((struct hc_driver
*)pci_ids
->driver_data
)->flags
|= HCD_MEMORY
;
140 /* Print assigned resources */
141 DPRINT("USBMP: Interrupt Vector 0x%lx, %S base 0x%lx, Length 0x%lx\n",
142 DeviceExtension
->InterruptVector
,
143 ((struct hc_driver
*)pci_ids
->driver_data
)->flags
& HCD_MEMORY
? L
"Memory" : L
"I/O",
144 DeviceExtension
->BaseAddress
,
145 DeviceExtension
->BaseAddrLength
);
147 /* Get bus number from the upper level bus driver. */
148 Size
= sizeof(ULONG
);
149 Status
= IoGetDeviceProperty(
150 DeviceExtension
->PhysicalDeviceObject
,
151 DevicePropertyBusNumber
,
153 &DeviceExtension
->SystemIoBusNumber
,
156 if (!NT_SUCCESS(Status
))
158 DPRINT1("USBMP: IoGetDeviceProperty DevicePropertyBusNumber failed\n");
159 DeviceExtension
->SystemIoBusNumber
= 0;
162 DPRINT("USBMP: Busnumber %d\n", DeviceExtension
->SystemIoBusNumber
);
164 /* Init wrapper with this object */
165 return InitLinuxWrapper(DeviceObject
);
169 UsbMpFdoQueryBusRelations(
170 IN PDEVICE_OBJECT DeviceObject
,
171 OUT PDEVICE_RELATIONS
* pDeviceRelations
)
173 PUSBMP_DEVICE_EXTENSION DeviceExtension
;
174 PDEVICE_RELATIONS DeviceRelations
;
175 NTSTATUS Status
= STATUS_SUCCESS
;
177 DeviceExtension
= (PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
179 /* Handling this IRP is easy, as we only
180 * have one child: the root hub
182 DeviceRelations
= (PDEVICE_RELATIONS
)ExAllocatePool(
184 sizeof(DEVICE_RELATIONS
));
185 if (!DeviceRelations
)
186 return STATUS_INSUFFICIENT_RESOURCES
;
188 /* Fill returned structure */
189 DeviceRelations
->Count
= 1;
190 ObReferenceObject(DeviceExtension
->RootHubPdo
);
191 DeviceRelations
->Objects
[0] = DeviceExtension
->RootHubPdo
;
193 *pDeviceRelations
= DeviceRelations
;
199 IN PDEVICE_OBJECT DeviceObject
,
202 PIO_STACK_LOCATION IrpSp
;
205 ULONG_PTR Information
= 0;
207 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
208 MinorFunction
= IrpSp
->MinorFunction
;
210 switch (MinorFunction
)
212 case IRP_MN_START_DEVICE
: /* 0x00 */
214 Status
= ForwardIrpAndWait(DeviceObject
, Irp
);
215 if (NT_SUCCESS(Status
) && NT_SUCCESS(Irp
->IoStatus
.Status
))
216 Status
= UsbMpFdoStartDevice(DeviceObject
, Irp
);
220 case IRP_MN_QUERY_REMOVE_DEVICE
: /* 0x01 */
221 case IRP_MN_CANCEL_REMOVE_DEVICE
: /* 0x03 */
223 return ForwardIrpAndForget(DeviceObject
, Irp
);
226 case IRP_MN_REMOVE_DEVICE
: /* 0x02 */
227 case IRP_MN_STOP_DEVICE
: /* 0x04 */
228 case IRP_MN_SURPRISE_REMOVAL
: /* 0x17 */
230 Status
= ForwardIrpAndWait(DeviceObject
, Irp
);
231 if (NT_SUCCESS(Status
) && NT_SUCCESS(Irp
->IoStatus
.Status
))
232 Status
= STATUS_SUCCESS
;
233 IoDeleteDevice(DeviceObject
); // just delete device for now
237 case IRP_MN_QUERY_STOP_DEVICE
: /* 0x05 */
238 case IRP_MN_CANCEL_STOP_DEVICE
: /* 0x06 */
240 Status
= STATUS_SUCCESS
;
243 case IRP_MN_QUERY_DEVICE_RELATIONS
: /* (optional) 0x7 */
245 switch (IrpSp
->Parameters
.QueryDeviceRelations
.Type
)
249 PDEVICE_RELATIONS DeviceRelations
= NULL
;
250 DPRINT("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
251 Status
= UsbMpFdoQueryBusRelations(DeviceObject
, &DeviceRelations
);
252 Information
= (ULONG_PTR
)DeviceRelations
;
255 case RemovalRelations
:
257 DPRINT1("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
258 return ForwardIrpAndForget(DeviceObject
, Irp
);
261 DPRINT1("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
262 IrpSp
->Parameters
.QueryDeviceRelations
.Type
);
263 return ForwardIrpAndForget(DeviceObject
, Irp
);
270 DPRINT1("USBMP: IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction
);
271 return ForwardIrpAndForget(DeviceObject
, Irp
);
274 Irp
->IoStatus
.Information
= Information
;
275 Irp
->IoStatus
.Status
= Status
;
276 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
281 UsbMpDeviceControlFdo(
282 IN PDEVICE_OBJECT DeviceObject
,
285 PIO_STACK_LOCATION Stack
;
287 PUSBMP_DEVICE_EXTENSION DeviceExtension
;
288 ULONG LengthIn
, LengthOut
;
289 ULONG_PTR Information
= 0;
290 PVOID BufferIn
, BufferOut
;
293 DPRINT("USBMP: UsbDeviceControlFdo() called\n");
295 Stack
= IoGetCurrentIrpStackLocation(Irp
);
296 LengthIn
= Stack
->Parameters
.DeviceIoControl
.InputBufferLength
;
297 LengthOut
= Stack
->Parameters
.DeviceIoControl
.OutputBufferLength
;
298 DeviceExtension
= (PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
299 IoControlCode
= Stack
->Parameters
.DeviceIoControl
.IoControlCode
;
300 UsbMpGetUserBuffers(Irp
, IoControlCode
, &BufferIn
, &BufferOut
);
302 switch (IoControlCode
)
304 case IOCTL_GET_HCD_DRIVERKEY_NAME
:
306 DPRINT("USBMP: IOCTL_GET_HCD_DRIVERKEY_NAME\n");
307 if (LengthOut
< sizeof(USB_HCD_DRIVERKEY_NAME
))
308 Status
= STATUS_BUFFER_TOO_SMALL
;
309 else if (BufferOut
== NULL
)
310 Status
= STATUS_INVALID_PARAMETER
;
313 PUSB_HCD_DRIVERKEY_NAME StringDescriptor
;
315 StringDescriptor
= (PUSB_HCD_DRIVERKEY_NAME
)BufferOut
;
316 Status
= IoGetDeviceProperty(
317 ((PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->PhysicalDeviceObject
,
318 DevicePropertyDriverKeyName
,
319 LengthOut
- FIELD_OFFSET(USB_HCD_DRIVERKEY_NAME
, DriverKeyName
),
320 StringDescriptor
->DriverKeyName
,
322 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_TOO_SMALL
)
324 StringDescriptor
->ActualLength
= StringSize
+ FIELD_OFFSET(USB_HCD_DRIVERKEY_NAME
, DriverKeyName
);
325 Information
= LengthOut
;
326 Status
= STATUS_SUCCESS
;
331 case IOCTL_USB_GET_ROOT_HUB_NAME
:
333 DPRINT("USBMP: IOCTL_USB_GET_ROOT_HUB_NAME\n");
334 if (LengthOut
< sizeof(USB_ROOT_HUB_NAME
))
335 Status
= STATUS_BUFFER_TOO_SMALL
;
336 else if (BufferOut
== NULL
)
337 Status
= STATUS_INVALID_PARAMETER
;
340 PUSB_ROOT_HUB_NAME StringDescriptor
;
341 PUNICODE_STRING RootHubInterfaceName
;
342 StringDescriptor
= (PUSB_ROOT_HUB_NAME
)BufferOut
;
343 DeviceObject
= ((PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->RootHubPdo
;
344 RootHubInterfaceName
= &((PUSBMP_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->HcdInterfaceName
;
346 StringDescriptor
->ActualLength
= RootHubInterfaceName
->Length
+ sizeof(WCHAR
) + FIELD_OFFSET(USB_ROOT_HUB_NAME
, RootHubName
);
347 if (StringDescriptor
->ActualLength
<= LengthOut
)
349 /* Copy root hub name */
351 StringDescriptor
->RootHubName
,
352 RootHubInterfaceName
->Buffer
,
353 RootHubInterfaceName
->Length
);
354 StringDescriptor
->RootHubName
[RootHubInterfaceName
->Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
355 DPRINT("USBMP: IOCTL_USB_GET_ROOT_HUB_NAME returns '%S'\n", StringDescriptor
->RootHubName
);
356 Information
= StringDescriptor
->ActualLength
;
359 Information
= sizeof(USB_ROOT_HUB_NAME
);
360 Status
= STATUS_SUCCESS
;
367 /* Pass Irp to lower driver */
368 DPRINT1("USBMP: Unknown IOCTL code 0x%lx\n", Stack
->Parameters
.DeviceIoControl
.IoControlCode
);
369 IoSkipCurrentIrpStackLocation(Irp
);
370 return IoCallDriver(DeviceExtension
->NextDeviceObject
, Irp
);
374 Irp
->IoStatus
.Information
= Information
;
375 Irp
->IoStatus
.Status
= Status
;
376 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
381 UsbMpInternalDeviceControlFdo(
382 IN PDEVICE_OBJECT DeviceObject
,
385 NTSTATUS Status
= STATUS_INVALID_DEVICE_REQUEST
;
387 DPRINT("USBMP: UsbMpDeviceInternalControlFdo(DO %p, code 0x%lx) called\n",
389 IoGetCurrentIrpStackLocation(Irp
)->Parameters
.DeviceIoControl
.IoControlCode
);
391 if (DeviceObject
== KeyboardFdo
)
393 // it's keyboard's IOCTL
394 PIO_STACK_LOCATION Stk
;
396 Irp
->IoStatus
.Information
= 0;
397 Stk
= IoGetCurrentIrpStackLocation(Irp
);
399 switch (Stk
->Parameters
.DeviceIoControl
.IoControlCode
)
401 case IOCTL_INTERNAL_KEYBOARD_CONNECT
:
402 DPRINT("USBMP: IOCTL_INTERNAL_KEYBOARD_CONNECT\n");
403 if (Stk
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(CONNECT_DATA
)) {
404 DPRINT1("USBMP: Keyboard IOCTL_INTERNAL_KEYBOARD_CONNECT "
405 "invalid buffer size\n");
406 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
410 RtlCopyMemory(&KbdClassInformation
,
411 Stk
->Parameters
.DeviceIoControl
.Type3InputBuffer
,
412 sizeof(CONNECT_DATA
));
414 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
417 case IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER
:
418 DPRINT("USBMP: IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER\n");
419 if (Stk
->Parameters
.DeviceIoControl
.InputBufferLength
< 1) {
420 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
423 /* if (!DevExt->KeyboardInterruptObject) {
424 Irp->IoStatus.Status = STATUS_DEVICE_NOT_READY;
428 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
430 case IOCTL_KEYBOARD_QUERY_ATTRIBUTES
:
431 DPRINT("USBMP: IOCTL_KEYBOARD_QUERY_ATTRIBUTES\n");
432 if (Stk
->Parameters
.DeviceIoControl
.OutputBufferLength
<
433 sizeof(KEYBOARD_ATTRIBUTES
)) {
434 DPRINT("USBMP: Keyboard IOCTL_KEYBOARD_QUERY_ATTRIBUTES "
435 "invalid buffer size\n");
436 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
439 /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
440 &DevExt->KeyboardAttributes,
441 sizeof(KEYBOARD_ATTRIBUTES));*/
443 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
445 case IOCTL_KEYBOARD_QUERY_INDICATORS
:
446 DPRINT("USBMP: IOCTL_KEYBOARD_QUERY_INDICATORS\n");
447 if (Stk
->Parameters
.DeviceIoControl
.OutputBufferLength
<
448 sizeof(KEYBOARD_INDICATOR_PARAMETERS
)) {
449 DPRINT("USBMP: Keyboard IOCTL_KEYBOARD_QUERY_INDICATORS "
450 "invalid buffer size\n");
451 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
454 /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
455 &DevExt->KeyboardIndicators,
456 sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
458 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
460 case IOCTL_KEYBOARD_QUERY_TYPEMATIC
:
461 DPRINT("USBMP: IOCTL_KEYBOARD_QUERY_TYPEMATIC\n");
462 if (Stk
->Parameters
.DeviceIoControl
.OutputBufferLength
<
463 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS
)) {
464 DPRINT("USBMP: Keyboard IOCTL_KEYBOARD_QUERY_TYPEMATIC "
465 "invalid buffer size\n");
466 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
469 /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
470 &DevExt->KeyboardTypematic,
471 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
473 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
475 case IOCTL_KEYBOARD_SET_INDICATORS
:
476 DPRINT("USBMP: IOCTL_KEYBOARD_SET_INDICATORS\n");
477 if (Stk
->Parameters
.DeviceIoControl
.InputBufferLength
<
478 sizeof(KEYBOARD_INDICATOR_PARAMETERS
)) {
479 DPRINT("USBMP: Keyboard IOCTL_KEYBOARD_SET_INDICTATORS "
480 "invalid buffer size\n");
481 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
485 /*RtlCopyMemory(&DevExt->KeyboardIndicators,
486 Irp->AssociatedIrp.SystemBuffer,
487 sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
489 //DPRINT("%x\n", DevExt->KeyboardIndicators.LedFlags);
491 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
493 case IOCTL_KEYBOARD_SET_TYPEMATIC
:
494 DPRINT("USBMP: IOCTL_KEYBOARD_SET_TYPEMATIC\n");
495 if (Stk
->Parameters
.DeviceIoControl
.InputBufferLength
<
496 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS
)) {
497 DPRINT("USBMP: Keyboard IOCTL_KEYBOARD_SET_TYPEMATIC "
498 "invalid buffer size\n");
499 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
503 /*RtlCopyMemory(&DevExt->KeyboardTypematic,
504 Irp->AssociatedIrp.SystemBuffer,
505 sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
507 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
509 case IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION
:
510 /* We should check the UnitID, but it's kind of pointless as
511 * all keyboards are supposed to have the same one
514 DPRINT("USBMP: IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION\n");
515 if (Stk
->Parameters
.DeviceIoControl
.OutputBufferLength
<
516 sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION
)) {
517 DPRINT("USBMP: IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION: "
518 "invalid buffer size (expected)\n");
519 /* It's to query the buffer size */
520 Irp
->IoStatus
.Status
= STATUS_BUFFER_TOO_SMALL
;
523 Irp
->IoStatus
.Information
=
524 sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION
);
526 /*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
527 &IndicatorTranslation,
528 sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION));*/
530 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
532 case IOCTL_INTERNAL_I8042_HOOK_KEYBOARD
:
533 /* Nothing to do here */
534 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
537 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
542 Status
= Irp
->IoStatus
.Status
;
544 else if (DeviceObject
== MouseFdo
)
546 // it's mouse's IOCTL
547 PIO_STACK_LOCATION Stk
;
549 Irp
->IoStatus
.Information
= 0;
550 Stk
= IoGetCurrentIrpStackLocation(Irp
);
552 switch (Stk
->Parameters
.DeviceIoControl
.IoControlCode
)
554 case IOCTL_INTERNAL_MOUSE_CONNECT
:
555 DPRINT("USBMP: IOCTL_INTERNAL_MOUSE_CONNECT\n");
556 if (Stk
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(CONNECT_DATA
)) {
557 DPRINT1("USBMP: IOCTL_INTERNAL_MOUSE_CONNECT "
558 "invalid buffer size\n");
559 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
560 goto intcontfailure2
;
563 RtlCopyMemory(&MouseClassInformation
,
564 Stk
->Parameters
.DeviceIoControl
.Type3InputBuffer
,
565 sizeof(CONNECT_DATA
));
567 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
571 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;//STATUS_INVALID_DEVICE_REQUEST;
575 Status
= Irp
->IoStatus
.Status
;
579 DPRINT("USBMP: We got IOCTL for UsbCore\n");
580 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
581 return STATUS_SUCCESS
;
585 if (Status
== STATUS_INVALID_DEVICE_REQUEST
) {
586 DPRINT1("USBMP: Invalid internal device request!\n");
589 if (Status
!= STATUS_PENDING
)
590 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);