Skip to content

Commit 8207d90

Browse files
committed
add inquiry check length
1 parent cfdd55c commit 8207d90

File tree

3 files changed

+296
-174
lines changed

3 files changed

+296
-174
lines changed

common/usbx_device_classes/inc/ux_device_class_storage.h

Lines changed: 110 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/***************************************************************************
2-
* Copyright (c) 2024 Microsoft Corporation
3-
*
2+
* Copyright (c) 2024 Microsoft Corporation
3+
*
44
* This program and the accompanying materials are made available under the
55
* terms of the MIT License which is available at
66
* https://opensource.org/licenses/MIT.
7-
*
7+
*
88
* SPDX-License-Identifier: MIT
99
**************************************************************************/
1010

@@ -67,15 +67,15 @@
6767
#ifndef UX_DEVICE_CLASS_STORAGE_H
6868
#define UX_DEVICE_CLASS_STORAGE_H
6969

70-
/* Determine if a C++ compiler is being used. If so, ensure that standard
71-
C is used to process the API information. */
70+
/* Determine if a C++ compiler is being used. If so, ensure that standard
71+
C is used to process the API information. */
7272

73-
#ifdef __cplusplus
73+
#ifdef __cplusplus
7474

75-
/* Yes, C++ compiler is present. Use standard C. */
76-
extern "C" {
75+
/* Yes, C++ compiler is present. Use standard C. */
76+
extern "C" {
7777

78-
#endif
78+
#endif
7979

8080

8181
/* Internal option: enable the basic USBX error checking. This define is typically used
@@ -192,6 +192,13 @@ extern "C" {
192192
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_LENGTH 36
193193
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_LENGTH_CD_ROM 0x5b
194194

195+
/* Define Storage Class SCSI inquiry response length constants. */
196+
197+
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_VENDOR_ID_LENGTH 0x08U
198+
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_ID_LENGTH 0x10U
199+
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_REVISION_LENGTH 0x04U
200+
#define UX_SLAVE_CLASS_STORAGE_INQUIRY_RESPONSE_PRODUCT_SERIAL_LENGTH 0x14U
201+
195202

196203
/* Define Storage Class SCSI start/stop command constants. */
197204

@@ -505,16 +512,26 @@ typedef struct UX_SLAVE_CLASS_STORAGE_LUN_STRUCT
505512
ULONG ux_slave_class_storage_disk_status;
506513
ULONG ux_slave_class_storage_last_session_state;
507514

508-
UINT (*ux_slave_class_storage_media_read)(VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status);
509-
UINT (*ux_slave_class_storage_media_write)(VOID *storage, ULONG lun, UCHAR *data_pointer, ULONG number_blocks, ULONG lba, ULONG *media_status);
510-
UINT (*ux_slave_class_storage_media_flush)(VOID *storage, ULONG lun, ULONG number_blocks, ULONG lba, ULONG *media_status);
511-
UINT (*ux_slave_class_storage_media_status)(VOID *storage, ULONG lun, ULONG media_id, ULONG *media_status);
512-
UINT (*ux_slave_class_storage_media_notification)(VOID *storage, ULONG lun, ULONG media_id, ULONG notification_class, UCHAR **media_notification, ULONG *media_notification_length);
515+
UINT (*ux_slave_class_storage_media_read)(VOID *storage, ULONG lun, UCHAR *data_pointer,
516+
ULONG number_blocks, ULONG lba, ULONG *media_status);
517+
UINT (*ux_slave_class_storage_media_write)(VOID *storage, ULONG lun, UCHAR *data_pointer,
518+
ULONG number_blocks, ULONG lba, ULONG *media_status);
519+
UINT (*ux_slave_class_storage_media_flush)(VOID *storage, ULONG lun, ULONG number_blocks,
520+
ULONG lba, ULONG *media_status);
521+
UINT (*ux_slave_class_storage_media_status)(VOID *storage, ULONG lun, ULONG media_id,
522+
ULONG *media_status);
523+
UINT (*ux_slave_class_storage_media_notification)(VOID *storage, ULONG lun, ULONG media_id,
524+
ULONG notification_class,
525+
UCHAR **media_notification,
526+
ULONG *media_notification_length);
513527
} UX_SLAVE_CLASS_STORAGE_LUN;
514528

515529
/* Sense status value (key at bit0-7, code at bit8-15 and qualifier at bit16-23). */
516530

517-
#define UX_DEVICE_CLASS_STORAGE_SENSE_STATUS(key,code,qualifier) (((key) & 0xFF)|(((code) & 0xFF) << 8)|(((qualifier) & 0xFF) << 16))
531+
#define UX_DEVICE_CLASS_STORAGE_SENSE_STATUS(key, code, qualifier) (((key) & 0xFF) | \
532+
(((code) & 0xFF) << 8) | \
533+
(((qualifier) & 0xFF) << 16))
534+
518535
#define UX_DEVICE_CLASS_STORAGE_SENSE_KEY(status) ((status) & 0xFF)
519536
#define UX_DEVICE_CLASS_STORAGE_SENSE_CODE(status) (((status) >> 8) & 0xFF)
520537
#define UX_DEVICE_CLASS_STORAGE_SENSE_QUALIFIER(status) (((status) >> 16) & 0xFF)
@@ -579,7 +596,8 @@ typedef struct UX_SLAVE_CLASS_STORAGE_STRUCT
579596
(UX_OVERFLOW_CHECK_MULC_ULONG(UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE, 2))
580597
#define UX_DEVICE_CLASS_STORAGE_ENDPOINT_BUFFER_SIZE (UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE * 2)
581598
#define UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER(storage) ((storage)->ux_device_class_storage_endpoint_buffer)
582-
#define UX_DEVICE_CLASS_STORAGE_BULKIN_BUFFER(storage) (UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER(storage) + UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE)
599+
#define UX_DEVICE_CLASS_STORAGE_BULKIN_BUFFER(storage) (UX_DEVICE_CLASS_STORAGE_BULKOUT_BUFFER(storage) + \
600+
UX_DEVICE_CLASS_STORAGE_BULK_BUFFER_SIZE)
583601

584602
#define UX_DEVICE_CLASS_STORAGE_CSW_STATUS(p) (((UCHAR*)(p))[0])
585603
#define UX_DEVICE_CLASS_STORAGE_CSW_SKIP(p) (((UCHAR*)(p))[3])
@@ -605,50 +623,86 @@ UINT _ux_device_class_storage_initialize(UX_SLAVE_CLASS_COMMAND *command);
605623
UINT _ux_device_class_storage_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
606624
UINT _ux_device_class_storage_activate(UX_SLAVE_CLASS_COMMAND *command);
607625
UINT _ux_device_class_storage_control_request(UX_SLAVE_CLASS_COMMAND *command);
608-
UINT _ux_device_class_storage_csw_send(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in, UCHAR csw_status);
626+
UINT _ux_device_class_storage_csw_send(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
627+
UX_SLAVE_ENDPOINT *endpoint_in, UCHAR csw_status);
609628
UINT _ux_device_class_storage_deactivate(UX_SLAVE_CLASS_COMMAND *command);
610629
UINT _ux_device_class_storage_entry(UX_SLAVE_CLASS_COMMAND *command);
611-
UINT _ux_device_class_storage_format(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
612-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
613-
UINT _ux_device_class_storage_inquiry(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
614-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
615-
UINT _ux_device_class_storage_mode_select(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
616-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
617-
UINT _ux_device_class_storage_mode_sense(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
618-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
630+
UINT _ux_device_class_storage_format(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
631+
UX_SLAVE_ENDPOINT *endpoint_in,
632+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
633+
634+
UINT _ux_device_class_storage_inquiry(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
635+
UX_SLAVE_ENDPOINT *endpoint_in,
636+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
637+
638+
UINT _ux_device_class_storage_mode_select(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
639+
UX_SLAVE_ENDPOINT *endpoint_in,
640+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
641+
642+
UINT _ux_device_class_storage_mode_sense(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
643+
UX_SLAVE_ENDPOINT *endpoint_in,
644+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
645+
619646
UINT _ux_device_class_storage_prevent_allow_media_removal(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
620-
UX_SLAVE_ENDPOINT *endpoint_in, UX_SLAVE_ENDPOINT *endpoint_out, UCHAR * cbwcb);
621-
UINT _ux_device_class_storage_read(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
622-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb, UCHAR scsi_command);
623-
UINT _ux_device_class_storage_read_capacity(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
624-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
625-
UINT _ux_device_class_storage_read_format_capacity(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
626-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
627-
UINT _ux_device_class_storage_read_toc(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
628-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR * cbwcb);
629-
UINT _ux_device_class_storage_request_sense(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
630-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
631-
UINT _ux_device_class_storage_start_stop(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
632-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
633-
UINT _ux_device_class_storage_test_ready(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
634-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
635-
VOID _ux_device_class_storage_thread(ULONG storage_instance);
636-
UINT _ux_device_class_storage_verify(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
637-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
638-
UINT _ux_device_class_storage_write(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
639-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb, UCHAR scsi_command);
640-
UINT _ux_device_class_storage_synchronize_cache(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun, UX_SLAVE_ENDPOINT *endpoint_in,
641-
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb, UCHAR scsi_command);
642-
UINT _ux_device_class_storage_read_disk_information(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
647+
UX_SLAVE_ENDPOINT *endpoint_in,
648+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR * cbwcb);
649+
650+
UINT _ux_device_class_storage_read(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
651+
UX_SLAVE_ENDPOINT *endpoint_in,
652+
UX_SLAVE_ENDPOINT *endpoint_out,
653+
UCHAR *cbwcb, UCHAR scsi_command);
654+
655+
UINT _ux_device_class_storage_read_capacity(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
656+
UX_SLAVE_ENDPOINT *endpoint_in,
657+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
658+
659+
UINT _ux_device_class_storage_read_format_capacity(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
660+
UX_SLAVE_ENDPOINT *endpoint_in,
661+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
662+
663+
UINT _ux_device_class_storage_read_toc(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
664+
UX_SLAVE_ENDPOINT *endpoint_in,
665+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR * cbwcb);
666+
667+
UINT _ux_device_class_storage_request_sense(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
668+
UX_SLAVE_ENDPOINT *endpoint_in,
669+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
670+
671+
UINT _ux_device_class_storage_start_stop(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
643672
UX_SLAVE_ENDPOINT *endpoint_in,
644673
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
645674

646-
UINT _ux_device_class_storage_get_configuration(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
675+
UINT _ux_device_class_storage_test_ready(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
647676
UX_SLAVE_ENDPOINT *endpoint_in,
648677
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
678+
679+
VOID _ux_device_class_storage_thread(ULONG storage_instance);
680+
681+
UINT _ux_device_class_storage_verify(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
682+
UX_SLAVE_ENDPOINT *endpoint_in,
683+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
684+
685+
UINT _ux_device_class_storage_write(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
686+
UX_SLAVE_ENDPOINT *endpoint_in,
687+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb, UCHAR scsi_command);
688+
689+
UINT _ux_device_class_storage_synchronize_cache(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
690+
UX_SLAVE_ENDPOINT *endpoint_in,
691+
UX_SLAVE_ENDPOINT *endpoint_out,
692+
UCHAR *cbwcb, UCHAR scsi_command);
693+
694+
UINT _ux_device_class_storage_read_disk_information(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
695+
UX_SLAVE_ENDPOINT *endpoint_in,
696+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
697+
698+
UINT _ux_device_class_storage_get_configuration(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
699+
UX_SLAVE_ENDPOINT *endpoint_in,
700+
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
701+
649702
UINT _ux_device_class_storage_get_status_notification(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
650703
UX_SLAVE_ENDPOINT *endpoint_in,
651704
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
705+
652706
UINT _ux_device_class_storage_report_key(UX_SLAVE_CLASS_STORAGE *storage,
653707
ULONG lun,
654708
UX_SLAVE_ENDPOINT *endpoint_in,
@@ -660,24 +714,25 @@ UINT _ux_device_class_storage_get_performance(UX_SLAVE_CLASS_STORAGE *storage
660714
UX_SLAVE_ENDPOINT *endpoint_in,
661715
UX_SLAVE_ENDPOINT *endpoint_out,
662716
UCHAR *cbwcb);
717+
663718
UINT _ux_device_class_storage_read_dvd_structure(UX_SLAVE_CLASS_STORAGE *storage, ULONG lun,
664719
UX_SLAVE_ENDPOINT *endpoint_in,
665720
UX_SLAVE_ENDPOINT *endpoint_out, UCHAR *cbwcb);
666721

667722
UINT _ux_device_class_storage_tasks_run(VOID *instance);
668723

669-
724+
#ifdef UX_ENABLE_ERROR_CHECKING
670725
UINT _uxe_device_class_storage_initialize(UX_SLAVE_CLASS_COMMAND *command);
671-
726+
#endif /* UX_ENABLE_ERROR_CHECKING */
672727

673728
/* Define Device Storage Class API prototypes. */
674729

675730
#define ux_device_class_storage_entry _ux_device_class_storage_entry
676731

677-
/* Determine if a C++ compiler is being used. If so, complete the standard
678-
C conditional started above. */
732+
/* Determine if a C++ compiler is being used. If so, complete the standard
733+
C conditional started above. */
679734
#ifdef __cplusplus
680-
}
681-
#endif
735+
}
736+
#endif
682737

683738
#endif

0 commit comments

Comments
 (0)