3 Copyright (c) 2004 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
23 #include <Library/DebugLib.h>
24 #include <IndustryStandard/Usb.h>
32 // Driver model protocol interface
36 USBMouseDriverBindingEntryPoint (
37 IN EFI_HANDLE ImageHandle
,
38 IN EFI_SYSTEM_TABLE
*SystemTable
43 USBMouseDriverBindingSupported (
44 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
45 IN EFI_HANDLE Controller
,
46 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
51 USBMouseDriverBindingStart (
52 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
53 IN EFI_HANDLE Controller
,
54 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
59 USBMouseDriverBindingStop (
60 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
61 IN EFI_HANDLE Controller
,
62 IN UINTN NumberOfChildren
,
63 IN EFI_HANDLE
*ChildHandleBuffer
66 EFI_GUID gEfiUsbMouseDriverGuid
= {
67 0x290156b5, 0x6a05, 0x4ac0, {0xb8, 0x0, 0x51, 0x27, 0x55, 0xad, 0x14, 0x29}
70 EFI_DRIVER_BINDING_PROTOCOL gUsbMouseDriverBinding
= {
71 USBMouseDriverBindingSupported
,
72 USBMouseDriverBindingStart
,
73 USBMouseDriverBindingStop
,
85 IN EFI_USB_IO_PROTOCOL
*UsbIo
90 InitializeUsbMouseDevice (
91 IN USB_MOUSE_DEV
*UsbMouseDev
97 UsbMouseWaitForInput (
103 // Mouse interrupt handler
108 OnMouseInterruptComplete (
122 IN EFI_SIMPLE_POINTER_PROTOCOL
*This
,
123 OUT EFI_SIMPLE_POINTER_STATE
*MouseState
130 IN EFI_SIMPLE_POINTER_PROTOCOL
*This
,
131 IN BOOLEAN ExtendedVerification
139 USBMouseDriverBindingEntryPoint (
140 IN EFI_HANDLE ImageHandle
,
141 IN EFI_SYSTEM_TABLE
*SystemTable
146 Entry point for EFI drivers.
149 ImageHandle - EFI_HANDLE
150 SystemTable - EFI_SYSTEM_TABLE
157 return EfiLibInstallAllDriverProtocols (
160 &gUsbMouseDriverBinding
,
162 &gUsbMouseComponentName
,
170 Test to see if this driver supports ControllerHandle. Any ControllerHandle
171 that has UsbHcProtocol installed will be supported.
173 @param This Protocol instance pointer.
174 @param Controller Handle of device to test
175 @param RemainingDevicePath Not used
177 @retval EFI_SUCCESS This driver supports this device.
178 @retval EFI_UNSUPPORTED This driver does not support this device.
183 USBMouseDriverBindingSupported (
184 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
185 IN EFI_HANDLE Controller
,
186 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
189 EFI_STATUS OpenStatus
;
190 EFI_USB_IO_PROTOCOL
*UsbIo
;
193 OpenStatus
= gBS
->OpenProtocol (
195 &gEfiUsbIoProtocolGuid
,
197 This
->DriverBindingHandle
,
199 EFI_OPEN_PROTOCOL_BY_DRIVER
201 if (EFI_ERROR (OpenStatus
) && (OpenStatus
!= EFI_ALREADY_STARTED
)) {
202 return EFI_UNSUPPORTED
;
205 if (OpenStatus
== EFI_ALREADY_STARTED
) {
206 return EFI_ALREADY_STARTED
;
210 // Use the USB I/O protocol interface to see the Controller is
211 // the Mouse controller that can be managed by this driver.
213 Status
= EFI_SUCCESS
;
214 if (!IsUsbMouse (UsbIo
)) {
215 Status
= EFI_UNSUPPORTED
;
220 &gEfiUsbIoProtocolGuid
,
221 This
->DriverBindingHandle
,
229 Starting the Usb Bus Driver
231 @param This Protocol instance pointer.
232 @param Controller Handle of device to test
233 @param RemainingDevicePath Not used
235 @retval EFI_SUCCESS This driver supports this device.
236 @retval EFI_UNSUPPORTED This driver does not support this device.
237 @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error
238 EFI_OUT_OF_RESOURCES- Can't allocate memory
240 @retval EFI_ALREADY_STARTED Thios driver has been started
245 USBMouseDriverBindingStart (
246 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
247 IN EFI_HANDLE Controller
,
248 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
252 EFI_USB_IO_PROTOCOL
*UsbIo
;
253 EFI_USB_ENDPOINT_DESCRIPTOR
*EndpointDesc
;
254 USB_MOUSE_DEV
*UsbMouseDevice
;
255 UINT8 EndpointNumber
;
258 UINT8 PollingInterval
;
261 UsbMouseDevice
= NULL
;
262 Status
= EFI_SUCCESS
;
264 Status
= gBS
->OpenProtocol (
266 &gEfiUsbIoProtocolGuid
,
268 This
->DriverBindingHandle
,
270 EFI_OPEN_PROTOCOL_BY_DRIVER
272 if (EFI_ERROR (Status
)) {
276 UsbMouseDevice
= AllocateZeroPool (sizeof (USB_MOUSE_DEV
));
277 if (UsbMouseDevice
== NULL
) {
278 Status
= EFI_OUT_OF_RESOURCES
;
282 UsbMouseDevice
->UsbIo
= UsbIo
;
284 UsbMouseDevice
->Signature
= USB_MOUSE_DEV_SIGNATURE
;
286 UsbMouseDevice
->InterfaceDescriptor
= AllocatePool (sizeof (EFI_USB_INTERFACE_DESCRIPTOR
));
287 if (UsbMouseDevice
->InterfaceDescriptor
== NULL
) {
288 Status
= EFI_OUT_OF_RESOURCES
;
292 EndpointDesc
= AllocatePool (sizeof (EFI_USB_ENDPOINT_DESCRIPTOR
));
293 if (EndpointDesc
== NULL
) {
294 Status
= EFI_OUT_OF_RESOURCES
;
298 // Get the Device Path Protocol on Controller's handle
300 Status
= gBS
->OpenProtocol (
302 &gEfiDevicePathProtocolGuid
,
303 (VOID
**) &UsbMouseDevice
->DevicePath
,
304 This
->DriverBindingHandle
,
306 EFI_OPEN_PROTOCOL_GET_PROTOCOL
309 if (EFI_ERROR (Status
)) {
313 // Get interface & endpoint descriptor
315 UsbIo
->UsbGetInterfaceDescriptor (
317 UsbMouseDevice
->InterfaceDescriptor
320 EndpointNumber
= UsbMouseDevice
->InterfaceDescriptor
->NumEndpoints
;
322 for (Index
= 0; Index
< EndpointNumber
; Index
++) {
323 UsbIo
->UsbGetEndpointDescriptor (
329 if ((EndpointDesc
->Attributes
& 0x03) == 0x03) {
332 // We only care interrupt endpoint here
334 UsbMouseDevice
->IntEndpointDescriptor
= EndpointDesc
;
338 if (UsbMouseDevice
->IntEndpointDescriptor
== NULL
) {
340 // No interrupt endpoint, then error
342 Status
= EFI_UNSUPPORTED
;
346 Status
= InitializeUsbMouseDevice (UsbMouseDevice
);
347 if (EFI_ERROR (Status
)) {
348 MouseReportStatusCode (
349 UsbMouseDevice
->DevicePath
,
350 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
351 PcdGet32 (PcdStatusCodeValueMouseInterfaceError
)
357 UsbMouseDevice
->SimplePointerProtocol
.GetState
= GetMouseState
;
358 UsbMouseDevice
->SimplePointerProtocol
.Reset
= UsbMouseReset
;
359 UsbMouseDevice
->SimplePointerProtocol
.Mode
= &UsbMouseDevice
->Mode
;
361 Status
= gBS
->CreateEvent (
364 UsbMouseWaitForInput
,
366 &((UsbMouseDevice
->SimplePointerProtocol
).WaitForInput
)
368 if (EFI_ERROR (Status
)) {
372 Status
= gBS
->InstallProtocolInterface (
374 &gEfiSimplePointerProtocolGuid
,
375 EFI_NATIVE_INTERFACE
,
376 &UsbMouseDevice
->SimplePointerProtocol
379 if (EFI_ERROR (Status
)) {
380 Status
= EFI_DEVICE_ERROR
;
385 // After Enabling Async Interrupt Transfer on this mouse Device
386 // we will be able to get key data from it. Thus this is deemed as
387 // the enable action of the mouse
390 MouseReportStatusCode (
391 UsbMouseDevice
->DevicePath
,
393 PcdGet32 (PcdStatusCodeValueMouseEnable
)
397 // submit async interrupt transfer
399 EndpointAddr
= UsbMouseDevice
->IntEndpointDescriptor
->EndpointAddress
;
400 PollingInterval
= UsbMouseDevice
->IntEndpointDescriptor
->Interval
;
401 PacketSize
= (UINT8
) (UsbMouseDevice
->IntEndpointDescriptor
->MaxPacketSize
);
403 Status
= UsbIo
->UsbAsyncInterruptTransfer (
409 OnMouseInterruptComplete
,
413 if (!EFI_ERROR (Status
)) {
415 UsbMouseDevice
->ControllerNameTable
= NULL
;
418 gUsbMouseComponentName
.SupportedLanguages
,
419 &UsbMouseDevice
->ControllerNameTable
,
427 // If submit error, uninstall that interface
429 Status
= EFI_DEVICE_ERROR
;
430 gBS
->UninstallProtocolInterface (
432 &gEfiSimplePointerProtocolGuid
,
433 &UsbMouseDevice
->SimplePointerProtocol
437 if (EFI_ERROR (Status
)) {
440 &gEfiUsbIoProtocolGuid
,
441 This
->DriverBindingHandle
,
445 if (UsbMouseDevice
!= NULL
) {
446 if (UsbMouseDevice
->InterfaceDescriptor
!= NULL
) {
447 gBS
->FreePool (UsbMouseDevice
->InterfaceDescriptor
);
450 if (UsbMouseDevice
->IntEndpointDescriptor
!= NULL
) {
451 gBS
->FreePool (UsbMouseDevice
->IntEndpointDescriptor
);
454 if ((UsbMouseDevice
->SimplePointerProtocol
).WaitForInput
!= NULL
) {
455 gBS
->CloseEvent ((UsbMouseDevice
->SimplePointerProtocol
).WaitForInput
);
458 gBS
->FreePool (UsbMouseDevice
);
459 UsbMouseDevice
= NULL
;
468 Stop this driver on ControllerHandle. Support stoping any child handles
469 created by this driver.
471 @param This Protocol instance pointer.
472 @param Controller Handle of device to stop driver on
473 @param NumberOfChildren Number of Children in the ChildHandleBuffer
474 @param ChildHandleBuffer List of handles for the children we need to stop.
477 @return EFI_DEVICE_ERROR
483 USBMouseDriverBindingStop (
484 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
485 IN EFI_HANDLE Controller
,
486 IN UINTN NumberOfChildren
,
487 IN EFI_HANDLE
*ChildHandleBuffer
491 USB_MOUSE_DEV
*UsbMouseDevice
;
492 EFI_SIMPLE_POINTER_PROTOCOL
*SimplePointerProtocol
;
493 EFI_USB_IO_PROTOCOL
*UsbIo
;
496 // Get our context back.
498 Status
= gBS
->OpenProtocol (
500 &gEfiSimplePointerProtocolGuid
,
501 (VOID
**) &SimplePointerProtocol
,
502 This
->DriverBindingHandle
,
504 EFI_OPEN_PROTOCOL_GET_PROTOCOL
507 if (EFI_ERROR (Status
)) {
508 return EFI_UNSUPPORTED
;
511 UsbMouseDevice
= USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (SimplePointerProtocol
);
515 &gEfiSimplePointerProtocolGuid
,
516 This
->DriverBindingHandle
,
520 UsbIo
= UsbMouseDevice
->UsbIo
;
523 // Uninstall the Asyn Interrupt Transfer from this device
524 // will disable the mouse data input from this device
526 MouseReportStatusCode (
527 UsbMouseDevice
->DevicePath
,
529 PcdGet32 (PcdStatusCodeValueMouseDisable
)
533 // Delete Mouse Async Interrupt Transfer
535 UsbIo
->UsbAsyncInterruptTransfer (
537 UsbMouseDevice
->IntEndpointDescriptor
->EndpointAddress
,
539 UsbMouseDevice
->IntEndpointDescriptor
->Interval
,
545 gBS
->CloseEvent (UsbMouseDevice
->SimplePointerProtocol
.WaitForInput
);
547 if (UsbMouseDevice
->DelayedRecoveryEvent
) {
548 gBS
->CloseEvent (UsbMouseDevice
->DelayedRecoveryEvent
);
549 UsbMouseDevice
->DelayedRecoveryEvent
= 0;
552 Status
= gBS
->UninstallProtocolInterface (
554 &gEfiSimplePointerProtocolGuid
,
555 &UsbMouseDevice
->SimplePointerProtocol
557 if (EFI_ERROR (Status
)) {
563 &gEfiUsbIoProtocolGuid
,
564 This
->DriverBindingHandle
,
568 gBS
->FreePool (UsbMouseDevice
->InterfaceDescriptor
);
569 gBS
->FreePool (UsbMouseDevice
->IntEndpointDescriptor
);
571 if (UsbMouseDevice
->ControllerNameTable
) {
572 FreeUnicodeStringTable (UsbMouseDevice
->ControllerNameTable
);
575 gBS
->FreePool (UsbMouseDevice
);
583 Tell if a Usb Controller is a mouse
585 @param UsbIo Protocol instance pointer.
587 @retval TRUE It is a mouse
588 @retval FALSE It is not a mouse
593 IN EFI_USB_IO_PROTOCOL
*UsbIo
597 EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor
;
600 // Get the Default interface descriptor, now we only
601 // suppose it is interface 1
603 Status
= UsbIo
->UsbGetInterfaceDescriptor (
608 if (EFI_ERROR (Status
)) {
612 if ((InterfaceDescriptor
.InterfaceClass
== CLASS_HID
) &&
613 (InterfaceDescriptor
.InterfaceSubClass
== SUBCLASS_BOOT
) &&
614 (InterfaceDescriptor
.InterfaceProtocol
== PROTOCOL_MOUSE
)
624 Initialize the Usb Mouse Device.
626 @param UsbMouseDev Device instance to be initialized
628 @retval EFI_SUCCESS Success
629 @retval EFI_DEVICE_ERROR Init error. EFI_OUT_OF_RESOURCES- Can't allocate
635 InitializeUsbMouseDevice (
636 IN USB_MOUSE_DEV
*UsbMouseDev
639 EFI_USB_IO_PROTOCOL
*UsbIo
;
642 EFI_USB_HID_DESCRIPTOR MouseHidDesc
;
645 UsbIo
= UsbMouseDev
->UsbIo
;
648 // Get HID descriptor
650 Status
= UsbGetHidDescriptor (
652 UsbMouseDev
->InterfaceDescriptor
->InterfaceNumber
,
656 if (EFI_ERROR (Status
)) {
661 // Get Report descriptor
663 if (MouseHidDesc
.HidClassDesc
[0].DescriptorType
!= 0x22) {
664 return EFI_UNSUPPORTED
;
667 ReportDesc
= AllocateZeroPool (MouseHidDesc
.HidClassDesc
[0].DescriptorLength
);
668 if (ReportDesc
== NULL
) {
669 return EFI_OUT_OF_RESOURCES
;
672 Status
= UsbGetReportDescriptor (
674 UsbMouseDev
->InterfaceDescriptor
->InterfaceNumber
,
675 MouseHidDesc
.HidClassDesc
[0].DescriptorLength
,
679 if (EFI_ERROR (Status
)) {
680 gBS
->FreePool (ReportDesc
);
685 // Parse report descriptor
687 Status
= ParseMouseReportDescriptor (
690 MouseHidDesc
.HidClassDesc
[0].DescriptorLength
693 if (EFI_ERROR (Status
)) {
694 gBS
->FreePool (ReportDesc
);
698 if (UsbMouseDev
->NumberOfButtons
>= 1) {
699 UsbMouseDev
->Mode
.LeftButton
= TRUE
;
702 if (UsbMouseDev
->NumberOfButtons
> 1) {
703 UsbMouseDev
->Mode
.RightButton
= TRUE
;
706 UsbMouseDev
->Mode
.ResolutionX
= 8;
707 UsbMouseDev
->Mode
.ResolutionY
= 8;
708 UsbMouseDev
->Mode
.ResolutionZ
= 0;
710 // Here we just assume interface 0 is the mouse interface
712 UsbGetProtocolRequest (
718 if (Protocol
!= BOOT_PROTOCOL
) {
719 Status
= UsbSetProtocolRequest (
725 if (EFI_ERROR (Status
)) {
726 gBS
->FreePool (ReportDesc
);
727 return EFI_DEVICE_ERROR
;
732 // Set indefinite Idle rate for USB Mouse
741 gBS
->FreePool (ReportDesc
);
743 if (UsbMouseDev
->DelayedRecoveryEvent
) {
744 gBS
->CloseEvent (UsbMouseDev
->DelayedRecoveryEvent
);
745 UsbMouseDev
->DelayedRecoveryEvent
= 0;
748 Status
= gBS
->CreateEvent (
749 EVT_TIMER
| EVT_NOTIFY_SIGNAL
,
751 USBMouseRecoveryHandler
,
753 &UsbMouseDev
->DelayedRecoveryEvent
761 It is called whenever there is data received from async interrupt
764 @param Data Data received.
765 @param DataLength Length of Data
766 @param Context Passed in context
767 @param Result Async Interrupt Transfer result
770 @return EFI_DEVICE_ERROR
776 OnMouseInterruptComplete (
783 USB_MOUSE_DEV
*UsbMouseDevice
;
784 EFI_USB_IO_PROTOCOL
*UsbIo
;
788 UsbMouseDevice
= (USB_MOUSE_DEV
*) Context
;
789 UsbIo
= UsbMouseDevice
->UsbIo
;
791 if (Result
!= EFI_USB_NOERROR
) {
793 // Some errors happen during the process
795 MouseReportStatusCode (
796 UsbMouseDevice
->DevicePath
,
797 EFI_ERROR_CODE
| EFI_ERROR_MINOR
,
798 PcdGet32 (PcdStatusCodeValueMouseInputError
)
801 if ((Result
& EFI_USB_ERR_STALL
) == EFI_USB_ERR_STALL
) {
802 EndpointAddr
= UsbMouseDevice
->IntEndpointDescriptor
->EndpointAddress
;
804 UsbClearEndpointHalt (
811 UsbIo
->UsbAsyncInterruptTransfer (
813 UsbMouseDevice
->IntEndpointDescriptor
->EndpointAddress
,
822 UsbMouseDevice
->DelayedRecoveryEvent
,
824 EFI_USB_INTERRUPT_DELAY
826 return EFI_DEVICE_ERROR
;
829 if (DataLength
== 0 || Data
== NULL
) {
833 UsbMouseDevice
->StateChanged
= TRUE
;
838 UsbMouseDevice
->State
.LeftButton
= (BOOLEAN
) (*(UINT8
*) Data
& 0x01);
839 UsbMouseDevice
->State
.RightButton
= (BOOLEAN
) (*(UINT8
*) Data
& 0x02);
840 UsbMouseDevice
->State
.RelativeMovementX
+= *((INT8
*) Data
+ 1);
841 UsbMouseDevice
->State
.RelativeMovementY
+= *((INT8
*) Data
+ 2);
843 if (DataLength
> 3) {
844 UsbMouseDevice
->State
.RelativeMovementZ
+= *((INT8
*) Data
+ 3);
853 IN EFI_MOUSE_STATE *MouseState
856 Aprint("(%x: %x, %x)\n",
857 MouseState->ButtonStates,
865 Get the mouse state, see SIMPLE POINTER PROTOCOL.
867 @param This Protocol instance pointer.
868 @param MouseState Current mouse state
871 @return EFI_DEVICE_ERROR
872 @return EFI_NOT_READY
879 IN EFI_SIMPLE_POINTER_PROTOCOL
*This
,
880 OUT EFI_SIMPLE_POINTER_STATE
*MouseState
883 USB_MOUSE_DEV
*MouseDev
;
885 if (MouseState
== NULL
) {
886 return EFI_DEVICE_ERROR
;
889 MouseDev
= USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This
);
891 if (!MouseDev
->StateChanged
) {
892 return EFI_NOT_READY
;
898 sizeof (EFI_SIMPLE_POINTER_STATE
)
902 // Clear previous move state
904 MouseDev
->State
.RelativeMovementX
= 0;
905 MouseDev
->State
.RelativeMovementY
= 0;
906 MouseDev
->State
.RelativeMovementZ
= 0;
908 MouseDev
->StateChanged
= FALSE
;
915 Reset the mouse device, see SIMPLE POINTER PROTOCOL.
917 @param This Protocol instance pointer.
918 @param ExtendedVerification Ignored here/
927 IN EFI_SIMPLE_POINTER_PROTOCOL
*This
,
928 IN BOOLEAN ExtendedVerification
931 USB_MOUSE_DEV
*UsbMouseDevice
;
933 UsbMouseDevice
= USB_MOUSE_DEV_FROM_MOUSE_PROTOCOL (This
);
935 MouseReportStatusCode (
936 UsbMouseDevice
->DevicePath
,
938 PcdGet32 (PcdStatusCodeValueMouseReset
)
943 &UsbMouseDevice
->State
,
944 sizeof (EFI_SIMPLE_POINTER_STATE
)
946 UsbMouseDevice
->StateChanged
= FALSE
;
953 Event notification function for SIMPLE_POINTER.WaitForInput event
954 Signal the event if there is input from mouse
956 @param Event Wait Event
957 @param Context Passed parameter to event handler
964 UsbMouseWaitForInput (
969 USB_MOUSE_DEV
*UsbMouseDev
;
971 UsbMouseDev
= (USB_MOUSE_DEV
*) Context
;
974 // Someone is waiting on the mouse event, if there's
975 // input from mouse, signal the event
977 if (UsbMouseDev
->StateChanged
) {
978 gBS
->SignalEvent (Event
);
984 Timer handler for Delayed Recovery timer.
986 @param Event The Delayed Recovery event.
987 @param Context Points to the USB_KB_DEV instance.
993 USBMouseRecoveryHandler (
998 USB_MOUSE_DEV
*UsbMouseDev
;
999 EFI_USB_IO_PROTOCOL
*UsbIo
;
1001 UsbMouseDev
= (USB_MOUSE_DEV
*) Context
;
1003 UsbIo
= UsbMouseDev
->UsbIo
;
1005 UsbIo
->UsbAsyncInterruptTransfer (
1007 UsbMouseDev
->IntEndpointDescriptor
->EndpointAddress
,
1009 UsbMouseDev
->IntEndpointDescriptor
->Interval
,
1010 UsbMouseDev
->IntEndpointDescriptor
->MaxPacketSize
,
1011 OnMouseInterruptComplete
,
1018 Report Status Code in Usb Bot Driver
1020 @param DevicePath Use this to get Device Path
1021 @param CodeType Status Code Type
1022 @param CodeValue Status Code Value
1028 MouseReportStatusCode (
1029 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1030 IN EFI_STATUS_CODE_TYPE CodeType
,
1031 IN EFI_STATUS_CODE_VALUE Value
1034 REPORT_STATUS_CODE_WITH_DEVICE_PATH (