⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi2.h

📁 Windows CE 5.0下的U盘驱动源代码。
💻 H
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

    scsi2.h

Abstract:

    SCSI-2 Definitions

    bInterfaceSubClass 0x02, SFF8020i/ATAPI CD-ROM
    bInterfaceSubClass 0x04, USB Floppy Interface (UFI)
    bInterfaceSubClass 0x06, SCSI Passthrough

Notes:

    CDDA not supported

--*/

#if !defined( _SCSI2_ )
#define _SCSI2_

//*****************************************************************************
// I N C L U D E S
//*****************************************************************************

#include <windows.h>
#include <winioctl.h>
#include <diskio.h>
#include <usbclient.h>
#include "cdioctl.h"

//*****************************************************************************
// D E F I N E S
//*****************************************************************************

#define DRIVER_NAME_SZ  TEXT("USBDISK6.DLL")
#define USBSCSI_SIG     'SCSI'

// timeout values (milliseconds)
#define MEDIA_POLL_SZ               TEXT("MediaPollInterval")
#define SCSI_MEDIA_POLL_INTERVAL    1250
#define READ_SECTOR_SZ              TEXT("ReadSectorTimeout")
#define SCSI_READ_SECTOR_TIMEOUT    10000
#define WRITE_SECTOR_SZ             TEXT("WriteSectorTimeout")
#define SCSI_WRITE_SECTOR_TIMEOUT   10000
#define SCSI_COMMAND_SZ             TEXT("ScsiCommandTimeout")
#define SCSI_COMMAND_TIMEOUT        5000

// TEST UNIT READY timeout
#define UNIT_ATTENTION_SZ           TEXT("UnitAttnRepeat")
#define UNIT_ATTENTION_REPEAT       10

// sizes
#define FAT_SECTOR_SIZE             512
#define CDSECTOR_SIZE               2048
#define MAX_SECTOR_SIZE             CDSECTOR_SIZE
#define SG_BUFF_SIZE                max((MAX_SG_BUF*FAT_SECTOR_SIZE), (3*CDSECTOR_SIZE))
// #define SG_BUFF_SIZE                65536
#define SCSI_CDB_6                  6
#define SCSI_CDB_10                 10
#define UFI_CDB                     12
#define ATAPI_CDB                   12
#define MAX_CDB                     UFI_CDB

#define VALID_CONTEXT( p ) \
    ( p != NULL && USBSCSI_SIG == p->Sig )

#define ACCEPT_IO( p ) \
   ( VALID_CONTEXT( p ) && \
     p->Flags.Open && \
    !p->Flags.DeviceRemoved  && \
    !p->Flags.PoweredDown )

// SCSI-2 device types
#define SCSI_DEVICE_DIRECT_ACCESS     0x00
#define SCSI_DEVICE_SEQUENTIAL_ACCESS 0x01
#define SCSI_DEVICE_PRINTER           0x02
#define SCSI_DEVICE_PROCESSOR         0x03
#define SCSI_DEVICE_WRITE_ONCE        0x04
#define SCSI_DEVICE_CDROM             0x05
#define SCSI_DEVICE_SCANNER           0x06
#define SCSI_DEVICE_OPTICAL           0x07
#define SCSI_DEVICE_MEDIUM_CHANGER    0x08
#define SCSI_DEVICE_COMM              0x09
#define SCSI_DEVICE_UNKNOWN           0x1F

// SCSI-2 medium types
#define SCSI_MEDIUM_UNKNOWN           0xFF

// CD-ROM medium types
#define MEDIUM_CD_ROM_UNKNOWN     0x00
#define MEDIUM_CD_ROM_120         0x01
#define MEDIUM_CD_DA_120          0x02
#define MEDIUM_CD_MIXED_120       0x03
#define MEDIUM_CD_HYBRID_120      0x04
#define MEDIUM_CD_ROM_80          0x05
#define MEDIUM_CD_DA_80           0x06
#define MEDIUM_CD_MIXED_80        0x07
#define MEDIUM_CD_HYBRID_80       0x08
#define MEDIUM_CDR_ROM_UNKNOWN    0x10
#define MEDIUM_CDR_ROM_120        0x11
#define MEDIUM_CDR_DA_120         0x12
#define MEDIUM_CDR_MIXED_120      0x13
#define MEDIUM_CDR_HYBRID_120     0x14
#define MEDIUM_CDR_ROM_80         0x15
#define MEDIUM_CDR_DA_80          0x16
#define MEDIUM_CDR_MIXED_80       0x17

// mandatory SCSI-2 commands
#define SCSI_TEST_UNIT_READY      0x00
#define SCSI_REQUEST_SENSE        0x03
#define SCSI_INQUIRY              0x12
#define SCSI_SEND_DIAGNOSTIC      0x1D

// mandatory device-specific SCSI-2 commands
#define SCSI_READ10               0x28
#define SCSI_READ_CAPACITY        0x25

// optional device-specific SCSI-2 commands
#define SCSI_MODE_SELECT6         0x15
#define SCSI_MODE_SENSE6          0x1A
#define SCSI_START_STOP           0x1B
#define SCSI_WRITE10              0x2A
#define SCSI_MODE_SELECT10        0x55
#define SCSI_MODE_SENSE10         0x5A

// ATAPI (CD-ROM) commands
#define SCSI_CD_READ_TOC          0x43
#define SCSI_CD_PLAY10            0x45
#define SCSI_CD_PLAY_MSF          0x47
#define SCSI_CD_PAUSE_RESUME      0x4B
#define SCSI_CD_STOP              0x4E

// mode pages
#define MODE_PAGE_FLEXIBLE_DISK   0x05
#define MODE_PAGE_CDROM           0x0D
#define MODE_PAGE_CDROM_AUDIO     0x0E
#define MODE_PAGE_CDROM_CAPS      0x2A

// SCSI-2 sense keys
#define SENSE_NONE                0x00
#define SENSE_RECOVERED_ERROR     0x01
#define SENSE_NOT_READY           0x02
#define SENSE_MEDIUM_ERROR        0x03
#define SENSE_HARDWARE_ERROR      0x04
#define SENSE_ILLEGAL_REQUEST     0x05
#define SENSE_UNIT_ATTENTION      0x06
#define SENSE_DATA_PROTECT        0x07
#define SENSE_BLANK_CHECK         0x08

// SCSI-2 ASC
#define ASC_LUN                   0x04
#define ASC_INVALID_COMMAND_FIELD 0x24
#define ASC_MEDIA_CHANGED         0x28
#define ASC_RESET                 0x29
#define ASC_COMMANDS_CLEARED      0x2F
#define ASC_MEDIUM_NOT_PRESENT    0x3A

#define START                     TRUE
#define STOP                      FALSE

#define FAILURE (-1)

// SCSI passthrough IOCTL-s
#define IOCTL_SCSI_BASE FILE_DEVICE_MASS_STORAGE

#define IOCTL_SCSI_PASSTHROUGH                \
    CTL_CODE(IOCTL_SCSI_BASE, 0x700, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_CDROM_PLAY_AUDIO                \
    CTL_CODE(IOCTL_SCSI_BASE, 0x701, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_CDROM_PLAY_AUDIO_TRACK_INDEX    \
    CTL_CODE(IOCTL_SCSI_BASE, 0x702, METHOD_BUFFERED, FILE_ANY_ACCESS)

//*****************************************************************************
// T Y P E D E F S
//*****************************************************************************

// registry configurable timeout/repeat values
typedef struct _TIMEOUTS {
    ULONG MediaPollInterval;
    ULONG ReadSector;
    ULONG WriteSector;
    ULONG ScsiCommandTimeout;
    ULONG UnitAttnRepeat;
} TIMEOUTS, *PTIMEOUTS;

// device flags
typedef struct _DEVICE_FLAGS {
    ULONG RMB : 1;              // removable media bit (RMB)
    ULONG MediumPresent : 1;    // a medium is present
    ULONG FSDMounted : 1;       // is FSD mounted, deprecated
    ULONG WriteProtect : 1;     // medium/device is write-protected
    ULONG Open : 1;             // device is open (DSK_Xxx)
    ULONG DeviceRemoved : 1;    // device marked for removal; only set by UsbDiskAttach/UsbDiskDetach
    ULONG PoweredDown : 1;      // device marked for suspend; only set by DSK_PowerDown
    ULONG Busy : 1;             // device marked as busy (CD-ROM)
    ULONG MediumChanged : 1;    // medium has changed
    ULONG prevMediumStatus : 1; // previous medium changed status
} DEVICE_FLAGS, *PDEVICE_FLAGS;

// device abstraction
typedef struct _SCSI_DEVICE {
    ULONG            Sig;                  // signature
    UCHAR            DiskSubClass;         // bInterfaceSubClass from device descriptor (fr. UsbDiskAttach)
    LPWSTR           ActivePath;           // active registry path (fr. UsbDiskAttach)
    HANDLE           hUsbTransport;        // USB Mass Storage Transport object (BOT, CBIT) (fr. UsbDiskAttach)
    CRITICAL_SECTION Lock;                 // object lock
    HANDLE           hMediaPollThread;     // media polling thread (only used with UFI)
    HANDLE           hMediaChangedEvent;   // media change event
    HANDLE           hStreamDevice;        // associated streams interface (we call ActivateDevice on ActivePath)
    HANDLE           hProc;                // process handle
    UCHAR            DeviceType;           // SCSI-2 device type
    UCHAR            Lun;                  // logical unit number
    UCHAR            MediumType;           // SCSI-2 medium type
    DEVICE_FLAGS     Flags;                // device flags (characteristics and state)
    LONG             OpenCount;            // DSK_Open reference count
    TIMEOUTS         Timeouts;             // timeout/repeat values
    DISK_INFO        DiskInfo;             // disk geometry
    REMOVE_LOCK      RemoveLock;           // prevent medium from being removed
    UCHAR            SgBuff[SG_BUFF_SIZE]; // double buffer
} SCSI_DEVICE, *PSCSI_DEVICE;

//*****************************************************************************
// P R O T O T Y P E S
//*****************************************************************************

DWORD
ScsiGetSenseData(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiInquiry(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiModeSense10(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiModeSense6(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiPassthrough(
    PSCSI_DEVICE       pDevice,
    PTRANSPORT_COMMAND Command,
    PTRANSPORT_DATA    Data
    );

DWORD
ScsiReadCapacity(
    PSCSI_DEVICE pDevice,
    PDISK_INFO   pDiskInfo,
    UCHAR        Lun
    );

DWORD
ScsiReadWrite(
    IN PSCSI_DEVICE pDevice,
    IN DWORD        dwStartSector,
    IN DWORD        dwNumSectors,
    IN OUT PVOID    pvBuffer,
    IN OUT PDWORD   pdwTransferSize,
    IN UCHAR        Lun,
    IN BOOL         bRead
    );

DWORD
ScsiRWSG(
    PSCSI_DEVICE pDevice,
    PSG_REQ      pSgReq,
    UCHAR        Lun,
    BOOL         bRead
    );

DWORD
ScsiRequestSense(
    PSCSI_DEVICE    pDevice,
    PTRANSPORT_DATA pTData,
    UCHAR           Lun
    );

DWORD
ScsiSendDiagnostic(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiStartStopUnit(
    PSCSI_DEVICE pDevice,
    BOOL         Start,
    BOOL         LoEj,
    UCHAR        Lun
    );

DWORD
ScsiTestUnitReady(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiUnitAttention(
    PSCSI_DEVICE pDevice,
    UCHAR        Lun
    );

DWORD
ScsiCDRead(
    PSCSI_DEVICE pDevice,
    PCDROM_READ  pSgReq,
    PULONG       pdwBytesTransferred
    );

DWORD
ScsiCDAudio(
    PSCSI_DEVICE pDevice,
    DWORD        Ioctl,
    PUCHAR       pInBuf,
    DWORD        InBufLen,
    PUCHAR       pOutBuf,
    DWORD        OutBufLen,
    PDWORD       pdwBytesTransferred
    );

//*****************************************************************************
// D E B U G
//*****************************************************************************

#if DEBUG
    #define ZONE_ERR       DEBUGZONE(0)
    #define ZONE_WARN      DEBUGZONE(1)
    #define ZONE_INIT      DEBUGZONE(2)
    #define ZONE_TRACE     DEBUGZONE(3)

    #define ZONE_SCSI      DEBUGZONE(4)
    #define ZONE_CDROM     DEBUGZONE(5)
    #define ZONE_CDDA      DEBUGZONE(6)
    #define ZONE_DSK_IOCTL DEBUGZONE(7)

    #define ZONE_READ      DEBUGZONE(8)
    #define ZONE_WRITE     DEBUGZONE(9)
    #define ZONE_THREAD    DEBUGZONE(10)
    #define ZONE_EVENTS    DEBUGZONE(11)

    #define TEST_TRAP() { \
        NKDbgPrintfW( TEXT("%s: TRAP %s:%d\r\n"), DRIVER_NAME_SZ, TEXT(__FILE__), __LINE__); \
        DebugBreak(); \
    }

    #define DUMP_DISK_INFO( pDI ) { \
        if (pDI) { \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("DISK_INFO:\n"))); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("---------------------\n"))); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_total_sectors: %u\n"), pDI->di_total_sectors )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_bytes_per_sect: %u\n"), pDI->di_bytes_per_sect )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_cylinders: %u\n"), pDI->di_cylinders )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_heads: %u\n"), pDI->di_heads )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_sectors: %u\n"), pDI->di_sectors )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("di_flags: 0x%x\n"), pDI->di_flags )); \
            DEBUGMSG( ZONE_DSK_IOCTL, (TEXT("\n"))); \
        } \
    }
#else
    #define TEST_TRAP()
    #define DUMP_DISK_INFO(pDI)
#endif // DEBUG

#endif // _SCSI2_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -