+#ifndef _USBSTOR_H_
+#define _USBSTOR_H_
-#pragma once
-
-#include <ntddk.h>
-#define NDEBUG
-#include <debug.h>
+#include <wdm.h>
#include <usbdi.h>
-#include <hubbusif.h>
#include <usbbusif.h>
-#include <usbioctl.h>
-#include <usbiodef.h>
-#include <usb.h>
#include <usbdlib.h>
-#include <stdio.h>
-#include <wdmguid.h>
#include <classpnp.h>
-#include <scsi.h>
#define USB_STOR_TAG 'sbsu'
#define USB_MAXCHILDREN (16)
-
-
+#define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
#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))
USBSTOR_COMMON_DEVICE_EXTENSION Common;
PDEVICE_OBJECT LowerDeviceObject; // points to FDO
UCHAR LUN; // lun id
- PVOID InquiryData; // USB SCSI inquiry data
+ PINQUIRYDATA InquiryData; // USB SCSI inquiry data
PUCHAR FormatData; // USB SCSI Read Format Capacity Data
UCHAR Claimed; // indicating if it has been claimed by upper driver
ULONG BlockLength; // length of block
#define MAX_LUN 0xF
+#define CSW_STATUS_COMMAND_PASSED 0x00
+#define CSW_STATUS_COMMAND_FAILED 0x01
+#define CSW_STATUS_PHASE_ERROR 0x02
+
typedef struct
{
ULONG Signature; // CSW signature
UCHAR Status; // CSW status
}CSW, *PCSW;
-//--------------------------------------------------------------------------------------------------------------------------------------------
-//
-// UFI INQUIRY command
-//
-typedef struct
-{
- UCHAR Code; // operation code 0x12
- UCHAR LUN; // lun address
- UCHAR PageCode; // product data information, always 0x00
- UCHAR Reserved; // reserved 0x00
- UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes
- UCHAR Reserved1[7]; //reserved bytes 0x00
-}UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD;
-
-C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
-
-#define UFI_INQUIRY_CMD_LEN 0x6
-
-//
-// UFI INQUIRY command response
-//
-typedef struct
-{
- UCHAR DeviceType; // device type
- UCHAR RMB; // removable media bit
- UCHAR Version; // contains version 0x00
- UCHAR Format; // response format
- UCHAR Length; // additional length
- UCHAR Reserved[3]; // reserved
- UCHAR Vendor[8]; // vendor identification string
- UCHAR Product[16]; // product identification string
- UCHAR Revision[4]; // product revision code
-}UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE;
-
-C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
-
//--------------------------------------------------------------------------------------------------------------------------------------------
//
// UFI read cmd
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 ContiguousLogicBlocksByte0; // msb contiguous logic blocks byte
+ UCHAR ContiguousLogicBlocksByte1; // msb contiguous logic blocks
UCHAR Reserved1[3]; // reserved 0x00
}UFI_READ_WRITE_CMD;
#define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
//
-// UFI Read Capcacity command response
+// UFI Read Capacity command response
//
typedef struct
{
UCHAR BlockLengthByte2;
}UFI_CAPACITY_DESCRIPTOR, *PUFI_CAPACITY_DESCRIPTOR;
-#define UNFORMATED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
+#define UNFORMATTED_MEDIA_CODE_DESCRIPTORY_TYPE (1)
#define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2)
#define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3)
#define UFI_TEST_UNIT_CMD_LEN (6)
+//-------------------------------------------------------------------------------------------------------------------------------------------
typedef struct
{
+ UCHAR Bytes[16];
+}UFI_UNKNOWN_CMD, *PUFI_UNKNOWN_CMD;
+
+typedef struct
+{
+ PIRP Irp;
+ PFDO_DEVICE_EXTENSION FDODeviceExtension;
+ ULONG ErrorIndex;
+ ULONG StallRetryCount; // the number of retries after receiving USBD_STATUS_STALL_PID status
union
{
- PCBW cbw;
- PCSW csw;
+ CBW cbw;
+ CSW csw;
};
URB Urb;
- PIRP Irp;
- ULONG TransferDataLength;
- PUCHAR TransferData;
- PFDO_DEVICE_EXTENSION FDODeviceExtension;
- PPDO_DEVICE_EXTENSION PDODeviceExtension;
- PMDL TransferBufferMDL;
- ULONG ErrorIndex;
- ULONG RetryCount;
-}IRP_CONTEXT, *PIRP_CONTEXT;
+ SCSI_REQUEST_BLOCK SenseSrb;
+} IRP_CONTEXT, *PIRP_CONTEXT;
typedef struct _ERRORHANDLER_WORKITEM_DATA
{
PVOID
AllocateItem(
- IN POOL_TYPE PoolType,
+ IN POOL_TYPE PoolType,
IN ULONG ItemSize);
VOID
NTAPI
USBSTOR_SyncForwardIrpCompletionRoutine(
PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
+ PIRP Irp,
PVOID Context);
NTSTATUS
NTSTATUS
USBSTOR_HandleExecuteSCSI(
IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN ULONG RetryCount);
-
-NTSTATUS
-NTAPI
-USBSTOR_CSWCompletionRoutine(
- PDEVICE_OBJECT DeviceObject,
- PIRP Irp,
- PVOID Ctx);
+ IN PIRP Irp);
NTSTATUS
-USBSTOR_SendCBW(
- PIRP_CONTEXT Context,
- PIRP Irp);
-
-VOID
-USBSTOR_SendCSW(
+USBSTOR_SendCSWRequest(
PIRP_CONTEXT Context,
PIRP Irp);
PDEVICE_OBJECT DeviceObject,
PVOID Context);
+#endif /* _USBSTOR_H_ */