2 * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbehci/irp.c
5 * PURPOSE: IRP Handling.
7 * Michael Martin (michael.martin@reactos.org)
13 RemoveUrbRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
)
16 KeAcquireSpinLock(&DeviceExtension
->IrpQueueLock
, &OldIrql
);
17 RemoveEntryList(&Irp
->Tail
.Overlay
.ListEntry
);
18 KeReleaseSpinLock(&DeviceExtension
->IrpQueueLock
, OldIrql
);
22 RequestURBCancel (PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
)
24 KIRQL OldIrql
= Irp
->CancelIrql
;
25 IoReleaseCancelSpinLock(DISPATCH_LEVEL
);
27 KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension
->IrpQueueLock
);
28 RemoveEntryList(&Irp
->Tail
.Overlay
.ListEntry
);
30 KeReleaseSpinLock(&PdoDeviceExtension
->IrpQueueLock
, OldIrql
);
32 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
33 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
37 QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
, PIRP Irp
)
41 KeAcquireSpinLock(&DeviceExtension
->IrpQueueLock
, &OldIrql
);
43 if (Irp
->Cancel
&& IoSetCancelRoutine(Irp
, NULL
))
45 KeReleaseSpinLock(&DeviceExtension
->IrpQueueLock
, OldIrql
);
46 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
47 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
51 InsertTailList(&DeviceExtension
->IrpQueue
, &Irp
->Tail
.Overlay
.ListEntry
);
52 KeReleaseSpinLock(&DeviceExtension
->IrpQueueLock
, OldIrql
);
56 NTSTATUS
HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension
, PIRP Irp
)
58 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
59 ULONG_PTR Information
= 0;
60 PIO_STACK_LOCATION Stack
;
61 PUSB_DEVICE UsbDevice
= NULL
;
63 PFDO_DEVICE_EXTENSION FdoDeviceExtension
;
64 FdoDeviceExtension
= (PFDO_DEVICE_EXTENSION
) PdoDeviceExtension
->ControllerFdo
->DeviceExtension
;
66 Stack
= IoGetCurrentIrpStackLocation(Irp
);
69 Urb
= (PURB
) Stack
->Parameters
.Others
.Argument1
;
74 Status
= STATUS_SUCCESS
;
76 DPRINT("TransferBuffer %x\n", Urb
->UrbControlDescriptorRequest
.TransferBuffer
);
77 DPRINT("TransferBufferLength %x\n", Urb
->UrbControlDescriptorRequest
.TransferBufferLength
);
78 DPRINT("UsbdDeviceHandle = %x\n", Urb
->UrbHeader
.UsbdDeviceHandle
);
80 UsbDevice
= Urb
->UrbHeader
.UsbdDeviceHandle
;
82 /* UsbdDeviceHandle of 0 is root hub */
83 if (UsbDevice
== NULL
)
84 UsbDevice
= PdoDeviceExtension
->UsbDevices
[0];
86 /* Assume URB success */
87 Urb
->UrbHeader
.Status
= USBD_STATUS_SUCCESS
;
88 /* Set the DeviceHandle to the Internal Device */
89 Urb
->UrbHeader
.UsbdDeviceHandle
= UsbDevice
;
91 switch (Urb
->UrbHeader
.Function
)
93 case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
:
95 if (&UsbDevice
->ActiveInterface
->EndPoints
[0]->EndPointDescriptor
!= Urb
->UrbBulkOrInterruptTransfer
.PipeHandle
)
97 Status
= STATUS_INVALID_PARAMETER
;
101 ASSERT(Urb
->UrbBulkOrInterruptTransfer
.TransferBuffer
!= NULL
);
102 RtlZeroMemory(Urb
->UrbBulkOrInterruptTransfer
.TransferBuffer
, Urb
->UrbBulkOrInterruptTransfer
.TransferBufferLength
);
104 if (UsbDevice
== PdoDeviceExtension
->UsbDevices
[0])
106 if (Urb
->UrbBulkOrInterruptTransfer
.TransferFlags
& (USBD_TRANSFER_DIRECTION_IN
| USBD_SHORT_TRANSFER_OK
))
109 for (i
= 0; i
< PdoDeviceExtension
->NumberOfPorts
; i
++)
111 if (PdoDeviceExtension
->Ports
[i
].PortChange
)
113 DPRINT1("Inform hub driver that port %d has changed\n", i
+1);
114 ((PUCHAR
)Urb
->UrbBulkOrInterruptTransfer
.TransferBuffer
)[0] = 1 << ((i
+ 1) & 7);
120 Urb
->UrbHeader
.Status
= USBD_STATUS_INVALID_PARAMETER
;
121 Status
= STATUS_UNSUCCESSFUL
;
122 DPRINT1("Invalid transfer flags for SCE\n");
126 DPRINT("Interrupt Transfer not for hub\n");
129 case URB_FUNCTION_GET_STATUS_FROM_DEVICE
:
131 if (Urb
->UrbControlGetStatusRequest
.Index
== 0)
133 ASSERT(Urb
->UrbBulkOrInterruptTransfer
.TransferBuffer
!= NULL
);
134 *(PUSHORT
)Urb
->UrbControlGetStatusRequest
.TransferBuffer
= USB_PORT_STATUS_CONNECT
| USB_PORT_STATUS_ENABLE
;
138 DPRINT1("Uknown identifier\n");
139 Urb
->UrbHeader
.Status
= USBD_STATUS_INVALID_URB_FUNCTION
;
140 Status
= STATUS_UNSUCCESSFUL
;
144 case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE
:
146 switch(Urb
->UrbControlDescriptorRequest
.DescriptorType
)
148 case USB_DEVICE_DESCRIPTOR_TYPE
:
150 if (Urb
->UrbControlDescriptorRequest
.TransferBufferLength
>= sizeof(USB_DEVICE_DESCRIPTOR
))
152 Urb
->UrbControlDescriptorRequest
.TransferBufferLength
= sizeof(USB_DEVICE_DESCRIPTOR
);
154 ASSERT(Urb
->UrbControlDescriptorRequest
.TransferBuffer
!= NULL
);
155 RtlCopyMemory(Urb
->UrbControlDescriptorRequest
.TransferBuffer
,
156 &UsbDevice
->DeviceDescriptor
,
157 Urb
->UrbControlDescriptorRequest
.TransferBufferLength
);
160 case USB_CONFIGURATION_DESCRIPTOR_TYPE
:
165 if (Urb
->UrbControlDescriptorRequest
.TransferBufferLength
>= UsbDevice
->ActiveConfig
->ConfigurationDescriptor
.wTotalLength
)
167 Urb
->UrbControlDescriptorRequest
.TransferBufferLength
= UsbDevice
->ActiveConfig
->ConfigurationDescriptor
.wTotalLength
;
171 DPRINT1("TransferBufferLenth %x is too small!!!\n", Urb
->UrbControlDescriptorRequest
.TransferBufferLength
);
172 if (Urb
->UrbControlDescriptorRequest
.TransferBufferLength
< sizeof(USB_CONFIGURATION_DESCRIPTOR
))
174 DPRINT("Configuration Descriptor cannot fit into given buffer!\n");
179 ASSERT(Urb
->UrbControlDescriptorRequest
.TransferBuffer
);
180 BufPtr
= (PUCHAR
)Urb
->UrbControlDescriptorRequest
.TransferBuffer
;
182 /* Copy the Configuration Descriptor */
183 RtlCopyMemory(BufPtr
, &UsbDevice
->ActiveConfig
->ConfigurationDescriptor
, sizeof(USB_CONFIGURATION_DESCRIPTOR
));
185 /* If there is no room for all the configs then bail */
186 if (!(Urb
->UrbControlDescriptorRequest
.TransferBufferLength
> sizeof(USB_CONFIGURATION_DESCRIPTOR
)))
188 DPRINT("All Descriptors cannot fit into given buffer! Only USB_CONFIGURATION_DESCRIPTOR given\n");
192 BufPtr
+= sizeof(USB_CONFIGURATION_DESCRIPTOR
);
193 for (i
= 0; i
< UsbDevice
->ActiveConfig
->ConfigurationDescriptor
.bNumInterfaces
; i
++)
195 /* Copy the Interface Descriptor */
196 RtlCopyMemory(BufPtr
, &UsbDevice
->ActiveConfig
->Interfaces
[i
]->InterfaceDescriptor
, sizeof(USB_INTERFACE_DESCRIPTOR
));
197 BufPtr
+= sizeof(USB_INTERFACE_DESCRIPTOR
);
198 for (j
= 0; j
< UsbDevice
->ActiveConfig
->Interfaces
[i
]->InterfaceDescriptor
.bNumEndpoints
; j
++)
200 /* Copy the EndPoint Descriptor */
201 RtlCopyMemory(BufPtr
, &UsbDevice
->ActiveConfig
->Interfaces
[i
]->EndPoints
[j
]->EndPointDescriptor
, sizeof(USB_ENDPOINT_DESCRIPTOR
));
202 BufPtr
+= sizeof(USB_ENDPOINT_DESCRIPTOR
);
208 case USB_STRING_DESCRIPTOR_TYPE
:
210 USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup
;
211 PUSB_STRING_DESCRIPTOR StringDesc
;
214 StringDesc
= (PUSB_STRING_DESCRIPTOR
) Urb
->UrbControlDescriptorRequest
.TransferBuffer
;
216 if (Urb
->UrbControlDescriptorRequest
.Index
== 0)
217 DPRINT("Requesting LANGID's\n");
220 RtlZeroMemory(Urb
->UrbControlDescriptorRequest
.TransferBuffer
, Urb
->UrbControlDescriptorRequest
.TransferBufferLength
-1);
222 CtrlSetup
.bmRequestType
._BM
.Recipient
= BMREQUEST_TO_DEVICE
;
223 CtrlSetup
.bmRequestType
._BM
.Type
= BMREQUEST_STANDARD
;
224 CtrlSetup
.bmRequestType
._BM
.Reserved
= 0;
225 CtrlSetup
.bmRequestType
._BM
.Dir
= BMREQUEST_DEVICE_TO_HOST
;
226 CtrlSetup
.bRequest
= USB_REQUEST_GET_DESCRIPTOR
;
227 CtrlSetup
.wValue
.LowByte
= Urb
->UrbControlDescriptorRequest
.Index
;
228 CtrlSetup
.wValue
.HiByte
= Urb
->UrbControlDescriptorRequest
.DescriptorType
;
229 CtrlSetup
.wIndex
.W
= Urb
->UrbControlDescriptorRequest
.LanguageId
;
230 CtrlSetup
.wLength
= Urb
->UrbControlDescriptorRequest
.TransferBufferLength
;
232 ResultOk
= ExecuteControlRequest(FdoDeviceExtension
, &CtrlSetup
, UsbDevice
->Address
, UsbDevice
->Port
,
233 Urb
->UrbControlDescriptorRequest
.TransferBuffer
, Urb
->UrbControlDescriptorRequest
.TransferBufferLength
);
238 DPRINT1("Descriptor Type %x not supported!\n", Urb
->UrbControlDescriptorRequest
.DescriptorType
);
243 case URB_FUNCTION_SELECT_CONFIGURATION
:
245 PUSBD_INTERFACE_INFORMATION InterfaceInfo
;
248 DPRINT("Selecting Configuration\n");
249 DPRINT("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb
->UrbSelectConfiguration
.ConfigurationHandle
);
251 if (Urb
->UrbSelectConfiguration
.ConfigurationDescriptor
)
253 Urb
->UrbSelectConfiguration
.ConfigurationHandle
= (PVOID
)&PdoDeviceExtension
->UsbDevices
[0]->ActiveConfig
->ConfigurationDescriptor
;
254 DPRINT("ConfigHandle %x\n", Urb
->UrbSelectConfiguration
.ConfigurationHandle
);
255 InterfaceInfo
= &Urb
->UrbSelectConfiguration
.Interface
;
257 for (iCount
= 0; iCount
< Urb
->UrbSelectConfiguration
.ConfigurationDescriptor
->bNumInterfaces
; iCount
++)
259 InterfaceInfo
->InterfaceHandle
= (PVOID
)&UsbDevice
->ActiveInterface
->InterfaceDescriptor
;
260 InterfaceInfo
->Class
= UsbDevice
->ActiveInterface
->InterfaceDescriptor
.bInterfaceClass
;
261 InterfaceInfo
->SubClass
= UsbDevice
->ActiveInterface
->InterfaceDescriptor
.bInterfaceSubClass
;
262 InterfaceInfo
->Protocol
= UsbDevice
->ActiveInterface
->InterfaceDescriptor
.bInterfaceProtocol
;
263 InterfaceInfo
->Reserved
= 0;
265 for (pCount
= 0; pCount
< InterfaceInfo
->NumberOfPipes
; pCount
++)
267 InterfaceInfo
->Pipes
[pCount
].MaximumPacketSize
= UsbDevice
->ActiveInterface
->EndPoints
[pCount
]->EndPointDescriptor
.wMaxPacketSize
;
268 InterfaceInfo
->Pipes
[pCount
].EndpointAddress
= UsbDevice
->ActiveInterface
->EndPoints
[pCount
]->EndPointDescriptor
.bEndpointAddress
;
269 InterfaceInfo
->Pipes
[pCount
].Interval
= UsbDevice
->ActiveInterface
->EndPoints
[pCount
]->EndPointDescriptor
.bInterval
;
270 InterfaceInfo
->Pipes
[pCount
].PipeType
= UsbdPipeTypeInterrupt
;
271 InterfaceInfo
->Pipes
[pCount
].PipeHandle
= (PVOID
)&UsbDevice
->ActiveInterface
->EndPoints
[pCount
]->EndPointDescriptor
;
272 if (InterfaceInfo
->Pipes
[pCount
].MaximumTransferSize
== 0)
273 InterfaceInfo
->Pipes
[pCount
].MaximumTransferSize
= 4096;
274 /* InterfaceInfo->Pipes[j].PipeFlags = 0; */
276 InterfaceInfo
= (PUSBD_INTERFACE_INFORMATION
)((PUCHAR
)InterfaceInfo
+ InterfaceInfo
->Length
);
281 /* FIXME: Set device to unconfigured state */
285 case URB_FUNCTION_CLASS_DEVICE
:
287 switch (Urb
->UrbControlVendorClassRequest
.Request
)
289 case USB_REQUEST_GET_DESCRIPTOR
:
291 switch (Urb
->UrbControlVendorClassRequest
.Value
>> 8)
293 case USB_DEVICE_CLASS_AUDIO
:
295 DPRINT1("USB_DEVICE_CLASS_AUDIO not implemented\n");
298 case USB_DEVICE_CLASS_COMMUNICATIONS
:
300 DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS not implemented\n");
303 case USB_DEVICE_CLASS_HUMAN_INTERFACE
:
305 DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE not implemented\n");
308 case USB_DEVICE_CLASS_MONITOR
:
310 DPRINT1("USB_DEVICE_CLASS_MONITOR not implemented\n");
313 case USB_DEVICE_CLASS_PHYSICAL_INTERFACE
:
315 DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE not implemented\n");
318 case USB_DEVICE_CLASS_POWER
:
320 DPRINT1("USB_DEVICE_CLASS_POWER not implemented\n");
323 case USB_DEVICE_CLASS_PRINTER
:
325 DPRINT1("USB_DEVICE_CLASS_PRINTER not implemented\n");
328 case USB_DEVICE_CLASS_STORAGE
:
330 DPRINT1("USB_DEVICE_CLASS_STORAGE not implemented\n");
333 case USB_DEVICE_CLASS_RESERVED
:
334 DPRINT1("Reserved!!!\n");
335 case USB_DEVICE_CLASS_HUB
:
337 PUSB_HUB_DESCRIPTOR UsbHubDescr
= Urb
->UrbControlVendorClassRequest
.TransferBuffer
;
339 DPRINT1("Length %x\n", Urb
->UrbControlVendorClassRequest
.TransferBufferLength
);
340 ASSERT(Urb
->UrbControlVendorClassRequest
.TransferBuffer
!= 0);
341 /* FIXME: Handle more than root hub? */
342 if(Urb
->UrbControlVendorClassRequest
.TransferBufferLength
>= sizeof(USB_HUB_DESCRIPTOR
))
344 Urb
->UrbControlVendorClassRequest
.TransferBufferLength
= sizeof(USB_HUB_DESCRIPTOR
);
348 /* FIXME: Handle this correctly */
349 UsbHubDescr
->bDescriptorLength
= sizeof(USB_HUB_DESCRIPTOR
);
350 UsbHubDescr
->bDescriptorType
= 0x29;
353 DPRINT1("USB_DEVICE_CLASS_HUB request\n");
354 UsbHubDescr
->bDescriptorLength
= sizeof(USB_HUB_DESCRIPTOR
);
355 UsbHubDescr
->bDescriptorType
= 0x29;
356 UsbHubDescr
->bNumberOfPorts
= 0x08;
357 UsbHubDescr
->wHubCharacteristics
= 0x0012;
358 UsbHubDescr
->bPowerOnToPowerGood
= 0x01;
359 UsbHubDescr
->bHubControlCurrent
= 0x00;
360 UsbHubDescr
->bRemoveAndPowerMask
[0] = 0x00;
361 UsbHubDescr
->bRemoveAndPowerMask
[1] = 0x00;
362 UsbHubDescr
->bRemoveAndPowerMask
[2] = 0xff;
367 DPRINT1("Unknown UrbControlVendorClassRequest Value\n");
372 case USB_REQUEST_GET_STATUS
:
374 DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb
->UrbControlVendorClassRequest
.Index
);
375 if (Urb
->UrbControlVendorClassRequest
.Index
== 1)
377 ASSERT(Urb
->UrbControlVendorClassRequest
.TransferBuffer
!= 0);
378 ((PULONG
)Urb
->UrbControlVendorClassRequest
.TransferBuffer
)[0] = 0;
384 DPRINT1("Unhandled URB request for class device\n");
385 Urb
->UrbHeader
.Status
= USBD_STATUS_INVALID_URB_FUNCTION
;
390 case URB_FUNCTION_CLASS_OTHER
:
392 DPRINT("URB_FUNCTION_CLASS_OTHER\n");
393 /* FIXME: Each one of these needs to make sure that the index value is a valid for the number of ports and return STATUS_UNSUCCESSFUL is not */
395 switch (Urb
->UrbControlVendorClassRequest
.Request
)
397 case USB_REQUEST_GET_STATUS
:
399 DPRINT("USB_REQUEST_GET_STATUS Port %d\n", Urb
->UrbControlVendorClassRequest
.Index
);
401 ASSERT(Urb
->UrbControlVendorClassRequest
.TransferBuffer
!= 0);
402 DPRINT("PortStatus %x\n", PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortStatus
);
403 DPRINT("PortChange %x\n", PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortChange
);
404 ((PUSHORT
)Urb
->UrbControlVendorClassRequest
.TransferBuffer
)[0] = PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortStatus
;
405 ((PUSHORT
)Urb
->UrbControlVendorClassRequest
.TransferBuffer
)[1] = PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortChange
;
408 case USB_REQUEST_CLEAR_FEATURE
:
410 DPRINT("USB_REQUEST_CLEAR_FEATURE Port %d, value %x\n", Urb
->UrbControlVendorClassRequest
.Index
,
411 Urb
->UrbControlVendorClassRequest
.Value
);
412 switch (Urb
->UrbControlVendorClassRequest
.Value
)
414 case C_PORT_CONNECTION
:
415 PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortChange
&= ~USB_PORT_STATUS_CONNECT
;
418 PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortChange
&= ~USB_PORT_STATUS_RESET
;
421 DPRINT1("Unknown Value for Clear Feature %x \n", Urb
->UrbControlVendorClassRequest
.Value
);
426 case USB_REQUEST_SET_FEATURE
:
428 DPRINT("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb
->UrbControlVendorClassRequest
.Index
,
429 Urb
->UrbControlVendorClassRequest
.Value
);
431 switch(Urb
->UrbControlVendorClassRequest
.Value
)
435 PdoDeviceExtension
->Ports
[Urb
->UrbControlVendorClassRequest
.Index
-1].PortStatus
|= USB_PORT_STATUS_ENABLE
;
436 ResetPort(FdoDeviceExtension
, Urb
->UrbControlVendorClassRequest
.Index
-1);
442 DPRINT1("PORT_ENABLE not implemented\n");
447 DPRINT1("PORT_POWER not implemented\n");
452 DPRINT1("Unknown Set Feature!\n");
458 case USB_REQUEST_SET_ADDRESS
:
460 DPRINT1("USB_REQUEST_SET_ADDRESS\n");
463 case USB_REQUEST_GET_DESCRIPTOR
:
465 DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n");
468 case USB_REQUEST_SET_DESCRIPTOR
:
470 DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n");
473 case USB_REQUEST_GET_CONFIGURATION
:
475 DPRINT1("USB_REQUEST_GET_CONFIGURATION\n");
478 case USB_REQUEST_SET_CONFIGURATION
:
480 DPRINT1("USB_REQUEST_SET_CONFIGURATION\n");
483 case USB_REQUEST_GET_INTERFACE
:
485 DPRINT1("USB_REQUEST_GET_INTERFACE\n");
488 case USB_REQUEST_SET_INTERFACE
:
490 DPRINT1("USB_REQUEST_SET_INTERFACE\n");
493 case USB_REQUEST_SYNC_FRAME
:
495 DPRINT1("USB_REQUEST_SYNC_FRAME\n");
500 DPRINT1("Unknown Function Class Unknown request\n");
508 DPRINT1("Unhandled URB %x\n", Urb
->UrbHeader
.Function
);
509 Urb
->UrbHeader
.Status
= USBD_STATUS_INVALID_URB_FUNCTION
;
514 Irp
->IoStatus
.Status
= Status
;
515 Irp
->IoStatus
.Information
= Information
;
517 if (Urb
->UrbHeader
.Status
== USBD_STATUS_SUCCESS
)
519 /* Fake a successful Control Transfer */
520 Urb
->UrbHeader
.Function
= 0x08;
521 Urb
->UrbHeader
.UsbdFlags
= 0;
528 CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension
)
530 PLIST_ENTRY NextIrp
= NULL
;
534 KeAcquireSpinLock(&DeviceExtension
->IrpQueueLock
, &oldIrql
);
536 while (!IsListEmpty(&DeviceExtension
->IrpQueue
))
538 NextIrp
= RemoveHeadList(&DeviceExtension
->IrpQueue
);
539 Irp
= CONTAINING_RECORD(NextIrp
, IRP
, Tail
.Overlay
.ListEntry
);
544 KeReleaseSpinLock(&DeviceExtension
->IrpQueueLock
, oldIrql
);
545 HandleUrbRequest(DeviceExtension
, Irp
);
546 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
547 KeAcquireSpinLock(&DeviceExtension
->IrpQueueLock
, &oldIrql
);
550 KeReleaseSpinLock(&DeviceExtension
->IrpQueueLock
, oldIrql
);