#define USB_STOR_TAG 'sbsu'
#define USB_MAXCHILDREN (16)
-NTSTATUS NTAPI
-IoAttachDeviceToDeviceStackSafe(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice,
- OUT PDEVICE_OBJECT *AttachedToDeviceObject);
+
+
+#define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
+#define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
+
+#define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
+ ((((unsigned long)(n) & 0xFF00)) << 8) | \
+ ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
+ ((((unsigned long)(n) & 0xFF000000)) >> 24))
+
+
+#define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
+ ((((unsigned long)(n) & 0xFF00)) << 8) | \
+ ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
+ ((((unsigned long)(n) & 0xFF000000)) >> 24))
+
+#define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
+ | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
typedef struct __COMMON_DEVICE_EXTENSION__
{
USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
+ PUSB_STRING_DESCRIPTOR SerialNumber; // usb serial number
PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information
USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
UCHAR BulkInPipeIndex; // bulk in pipe index
UCHAR BulkOutPipeIndex; // bulk out pipe index
UCHAR MaxLUN; // max lun for device
PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices
+ KSPIN_LOCK IrpListLock; // irp list lock
+ LIST_ENTRY IrpListHead; // irp list head
+ BOOLEAN IrpListFreeze; // if true the irp list is freezed
+ BOOLEAN ResetInProgress; // if hard reset is in progress
+ ULONG IrpPendingCount; // count of irp pending
+ BOOLEAN SrbActive; // debug field if srb is pending
}FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
typedef struct
UCHAR LUN; // lun id
PVOID InquiryData; // USB SCSI inquiry data
UCHAR Claimed; // indicating if it has been claimed by upper driver
+ ULONG BlockLength; // length of block
+ ULONG LastLogicBlockAddress; // last block address
}PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
//
//
#define USB_BULK_GET_MAX_LUN 0xFE
-
+#include <pshpack1.h>
typedef struct
{
ULONG Signature; // CBW signature
UCHAR CommandBlock[16];
}CBW, *PCBW;
+C_ASSERT(sizeof(CBW) == 31);
+
+
#define CBW_SIGNATURE 0x43425355
#define MAX_LUN 0xF
UCHAR Version; // contains version 0x00
UCHAR Format; // response format
UCHAR Length; // additional length
- USHORT Reserved; // reserved
+ UCHAR Reserved[3]; // reserved
UCHAR Vendor[8]; // vendor identification string
UCHAR Product[16]; // product identification string
UCHAR Revision[4]; // product revision code
C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
+//--------------------------------------------------------------------------------------------------------------------------------------------
+//
+// UFI read cmd
+//
+typedef struct
+{
+ UCHAR Code; // operation code
+ UCHAR LUN; // lun
+ UCHAR LogicalBlockByte0; // lba byte 0
+ UCHAR LogicalBlockByte1; // lba byte 1
+ UCHAR LogicalBlockByte2; // lba byte 2
+ UCHAR LogicalBlockByte3; // lba byte 3
+ UCHAR Reserved; // reserved 0x00
+ UCHAR ContiguousLogicBlocksByte0; // msb contigious logic blocks byte
+ UCHAR ContiguousLogicBlocksByte1; // msb contigious logic blocks
+ UCHAR Reserved1[3]; // reserved 0x00
+}UFI_READ_WRITE_CMD;
+
+C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12);
+
+#define UFI_READ_WRITE_CMD_LEN (0xA)
+
//--------------------------------------------------------------------------------------------------------------------------------------------
//
// UFI read capacity cmd
ULONG BlockLength; // block length in bytes
}UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE;
+C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8);
+
//--------------------------------------------------------------------------------------------------------------------------------------------
//
// UFI sense mode cmd
UCHAR Reserved1[3];
}UFI_SENSE_CMD, *PUFI_SENSE_CMD;
-C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12);
+C_ASSERT(sizeof(UFI_SENSE_CMD) == 12);
+
+#define UFI_SENSE_CMD_LEN (6)
+
+typedef struct
+{
+ USHORT ModeDataLength; // length of parameters for sense cmd
+ UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy
+ UCHAR WP:1; // write protect bit
+ UCHAR Reserved1:2; // reserved 00
+ UCHAR DPOFUA:1; // should be zero
+ UCHAR Reserved2:4; // reserved
+ UCHAR Reserved[4]; // reserved
+}UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER;
+
+
+C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8);
+
+typedef struct
+{
+ UCHAR PC;
+ UCHAR PageLength;
+ UCHAR Reserved1;
+ UCHAR ITM;
+ UCHAR Flags;
+ UCHAR Reserved[3];
+}UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE;
+C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8);
+
+//--------------------------------------------------------------------------------------------------------------------------------------------
+//
+// UFI test unit command
+//
+
+typedef struct
+{
+ UCHAR Code; // operation code 0x00
+ UCHAR LUN; // lun
+ UCHAR Reserved[10]; // reserved 0x00
+}UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD;
+
+C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12);
+
+#define UFI_TEST_UNIT_CMD_LEN (6)
+
+typedef struct
+{
+ union
+ {
+ PCBW cbw;
+ PCSW csw;
+ };
+ URB Urb;
+ PIRP Irp;
+ ULONG TransferDataLength;
+ PUCHAR TransferData;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+ PPDO_DEVICE_EXTENSION PDODeviceExtension;
+ PMDL TransferBufferMDL;
+ PKEVENT Event;
+}IRP_CONTEXT, *PIRP_CONTEXT;
+
+typedef struct _ERRORHANDLER_WORKITEM_DATA
+{
+ PDEVICE_OBJECT DeviceObject;
+ PIRP_CONTEXT Context;
+ WORK_QUEUE_ITEM WorkQueueItem;
+} ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
+
//---------------------------------------------------------------------
//
// scsi.c routines
//
NTSTATUS
-USBSTOR_SendInquiryCmd(
- IN PDEVICE_OBJECT DeviceObject);
-
-NTSTATUS
-USBSTOR_SendCapacityCmd(
+USBSTOR_HandleExecuteSCSI(
IN PDEVICE_OBJECT DeviceObject,
- OUT PREAD_CAPACITY_DATA_EX CapacityDataEx,
- OUT PREAD_CAPACITY_DATA CapacityData);
+ IN PIRP Irp);
NTSTATUS
-USBSTOR_SendModeSenseCmd(
- IN PDEVICE_OBJECT DeviceObject,
- IN OUT PSCSI_REQUEST_BLOCK Request,
- OUT PULONG TransferBufferLength);
+USBSTOR_SendInquiryCmd(
+ IN PDEVICE_OBJECT DeviceObject);
//---------------------------------------------------------------------
//
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
+//---------------------------------------------------------------------
+//
+// queue.c routines
+//
+VOID
+NTAPI
+USBSTOR_StartIo(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp);
+
+VOID
+USBSTOR_QueueFlushIrps(
+ IN PDEVICE_OBJECT DeviceObject);
+
+VOID
+USBSTOR_QueueRelease(
+ IN PDEVICE_OBJECT DeviceObject);
+
+BOOLEAN
+USBSTOR_QueueAddIrp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+VOID
+NTAPI
+USBSTOR_CancelIo(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+VOID
+USBSTOR_QueueInitialize(
+ PFDO_DEVICE_EXTENSION FDODeviceExtension);
+
+VOID
+NTAPI
+ErrorHandlerWorkItemRoutine(
+ PVOID Context);
+
+VOID
+USBSTOR_QueueNextRequest(
+ IN PDEVICE_OBJECT DeviceObject);
+VOID
+USBSTOR_QueueTerminateRequest(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN ModifySrbState);