Home | History | Annotate | Download | only in ddk
      1 /*
      2  * scsi.h
      3  *
      4  * Interface between SCSI miniport drivers and the SCSI port driver.
      5  *
      6  * This file is part of the w32api package.
      7  *
      8  * Contributors:
      9  *   Created by Casper S. Hornstrup <chorns (at) users.sourceforge.net>
     10  *
     11  * THIS SOFTWARE IS NOT COPYRIGHTED
     12  *
     13  * This source code is offered for use in the public domain. You may
     14  * use, modify or distribute it freely.
     15  *
     16  * This code is distributed in the hope that it will be useful but
     17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
     18  * DISCLAIMED. This includes but is not limited to warranties of
     19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     20  *
     21  */
     22 
     23 #ifndef _NTSRB_
     24 #define _NTSRB_
     25 
     26 #ifdef __cplusplus
     27 extern "C" {
     28 #endif
     29 
     30 #define SCSI_MAXIMUM_LOGICAL_UNITS        8
     31 #define SCSI_MAXIMUM_TARGETS_PER_BUS      128
     32 #define SCSI_MAXIMUM_LUNS_PER_TARGET      255
     33 #define SCSI_MAXIMUM_BUSES                8
     34 #define SCSI_MINIMUM_PHYSICAL_BREAKS      16
     35 #define SCSI_MAXIMUM_PHYSICAL_BREAKS      255
     36 #define SCSI_MAXIMUM_TARGETS              8
     37 
     38 /* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
     39 #define SCSI_DMA64_MINIPORT_SUPPORTED            0x01
     40 #define SCSI_DMA64_SYSTEM_SUPPORTED              0x80
     41 #if (NTDDI_VERSION > NTDDI_WS03SP1)
     42 #define SCSI_DMA64_MINIPORT_FULL64BIT_SUPPORTED  0x02
     43 #endif
     44 
     45 #define SP_UNINITIALIZED_VALUE            ((ULONG) ~0)
     46 #define SP_UNTAGGED                       ((UCHAR) ~0)
     47 
     48 /* Asynchronous events */
     49 #define SRBEV_BUS_RESET                   0x0001
     50 #define SRBEV_SCSI_ASYNC_NOTIFICATION     0x0002
     51 
     52 #define MAXIMUM_CDB_SIZE                  12
     53 
     54 #if DBG
     55 #define DebugPrint(x) ScsiDebugPrint x
     56 #else
     57 #define DebugPrint(x)
     58 #endif
     59 
     60 #define SCSI_COMBINE_BUS_TARGET(Bus, Target)(  \
     61   ((((UCHAR) (Target)) & ~(0x20 - 1)) << 8) |  \
     62   (((UCHAR) (Bus)) << 5) |                     \
     63   (((UCHAR) (Target)) & (0x20 - 1)))
     64 
     65 #define SCSI_DECODE_BUS_TARGET(Value, Bus, Target)( \
     66   Bus = (UCHAR) ((Value) >> 5),                     \
     67   Target = (UCHAR) ((((Value) >> 8) & ~(0x20 - 1)) | ((Value) & (0x20 - 1))))
     68 
     69 /* SCSI_REQUEST_BLOCK.Function constants */
     70 #define SRB_FUNCTION_EXECUTE_SCSI         0x00
     71 #define SRB_FUNCTION_CLAIM_DEVICE         0x01
     72 #define SRB_FUNCTION_IO_CONTROL           0x02
     73 #define SRB_FUNCTION_RECEIVE_EVENT        0x03
     74 #define SRB_FUNCTION_RELEASE_QUEUE        0x04
     75 #define SRB_FUNCTION_ATTACH_DEVICE        0x05
     76 #define SRB_FUNCTION_RELEASE_DEVICE       0x06
     77 #define SRB_FUNCTION_SHUTDOWN             0x07
     78 #define SRB_FUNCTION_FLUSH                0x08
     79 #define SRB_FUNCTION_ABORT_COMMAND        0x10
     80 #define SRB_FUNCTION_RELEASE_RECOVERY     0x11
     81 #define SRB_FUNCTION_RESET_BUS            0x12
     82 #define SRB_FUNCTION_RESET_DEVICE         0x13
     83 #define SRB_FUNCTION_TERMINATE_IO         0x14
     84 #define SRB_FUNCTION_FLUSH_QUEUE          0x15
     85 #define SRB_FUNCTION_REMOVE_DEVICE        0x16
     86 #define SRB_FUNCTION_WMI                  0x17
     87 #define SRB_FUNCTION_LOCK_QUEUE           0x18
     88 #define SRB_FUNCTION_UNLOCK_QUEUE         0x19
     89 #define SRB_FUNCTION_RESET_LOGICAL_UNIT   0x20
     90 #define SRB_FUNCTION_SET_LINK_TIMEOUT     0x21
     91 #define SRB_FUNCTION_LINK_TIMEOUT_OCCURRED 0x22
     92 #define SRB_FUNCTION_LINK_TIMEOUT_COMPLETE 0x23
     93 #define SRB_FUNCTION_POWER                0x24
     94 #define SRB_FUNCTION_PNP                  0x25
     95 #define SRB_FUNCTION_DUMP_POINTERS        0x26
     96 
     97 /* SCSI_REQUEST_BLOCK.SrbStatus constants */
     98 #define SRB_STATUS_PENDING                0x00
     99 #define SRB_STATUS_SUCCESS                0x01
    100 #define SRB_STATUS_ABORTED                0x02
    101 #define SRB_STATUS_ABORT_FAILED           0x03
    102 #define SRB_STATUS_ERROR                  0x04
    103 #define SRB_STATUS_BUSY                   0x05
    104 #define SRB_STATUS_INVALID_REQUEST        0x06
    105 #define SRB_STATUS_INVALID_PATH_ID        0x07
    106 #define SRB_STATUS_NO_DEVICE              0x08
    107 #define SRB_STATUS_TIMEOUT                0x09
    108 #define SRB_STATUS_SELECTION_TIMEOUT      0x0A
    109 #define SRB_STATUS_COMMAND_TIMEOUT        0x0B
    110 #define SRB_STATUS_MESSAGE_REJECTED       0x0D
    111 #define SRB_STATUS_BUS_RESET              0x0E
    112 #define SRB_STATUS_PARITY_ERROR           0x0F
    113 #define SRB_STATUS_REQUEST_SENSE_FAILED   0x10
    114 #define SRB_STATUS_NO_HBA                 0x11
    115 #define SRB_STATUS_DATA_OVERRUN           0x12
    116 #define SRB_STATUS_UNEXPECTED_BUS_FREE    0x13
    117 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
    118 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH   0x15
    119 #define SRB_STATUS_REQUEST_FLUSHED        0x16
    120 #define SRB_STATUS_INVALID_LUN            0x20
    121 #define SRB_STATUS_INVALID_TARGET_ID      0x21
    122 #define SRB_STATUS_BAD_FUNCTION           0x22
    123 #define SRB_STATUS_ERROR_RECOVERY         0x23
    124 #define SRB_STATUS_NOT_POWERED            0x24
    125 #define SRB_STATUS_LINK_DOWN              0x25
    126 #define SRB_STATUS_INTERNAL_ERROR         0x30
    127 
    128 #define SRB_STATUS_QUEUE_FROZEN           0x40
    129 #define SRB_STATUS_AUTOSENSE_VALID        0x80
    130 
    131 #define SRB_STATUS(Status) \
    132   (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
    133 
    134 /* SCSI_REQUEST_BLOCK.SrbFlags constants */
    135 #define SRB_FLAGS_QUEUE_ACTION_ENABLE       0x00000002
    136 #define SRB_FLAGS_DISABLE_DISCONNECT        0x00000004
    137 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER    0x00000008
    138 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE       0x00000010
    139 #define SRB_FLAGS_DISABLE_AUTOSENSE         0x00000020
    140 #define SRB_FLAGS_DATA_IN                   0x00000040
    141 #define SRB_FLAGS_DATA_OUT                  0x00000080
    142 #define SRB_FLAGS_NO_DATA_TRANSFER          0x00000000
    143 #define SRB_FLAGS_UNSPECIFIED_DIRECTION     (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
    144 #define SRB_FLAGS_NO_QUEUE_FREEZE           0x00000100
    145 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE      0x00000200
    146 #define SRB_FLAGS_FREE_SENSE_BUFFER         0x00000400
    147 #define SRB_FLAGS_IS_ACTIVE                 0x00010000
    148 #define SRB_FLAGS_ALLOCATED_FROM_ZONE       0x00020000
    149 #define SRB_FLAGS_SGLIST_FROM_POOL          0x00040000
    150 #define SRB_FLAGS_BYPASS_LOCKED_QUEUE       0x00080000
    151 #define SRB_FLAGS_NO_KEEP_AWAKE             0x00100000
    152 #define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE    0x00200000
    153 #define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT  0x00400000
    154 #define SRB_FLAGS_DONT_START_NEXT_PACKET    0x00800000
    155 #define SRB_FLAGS_PORT_DRIVER_RESERVED      0x0F000000
    156 #define SRB_FLAGS_CLASS_DRIVER_RESERVED     0xF0000000
    157 
    158 #if DBG
    159 #define SCSI_PORT_SIGNATURE                 0x54524f50
    160 #endif
    161 
    162 #define SRB_SIMPLE_TAG_REQUEST              0x20
    163 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST       0x21
    164 #define SRB_ORDERED_QUEUE_TAG_REQUEST       0x22
    165 
    166 #define SRB_WMI_FLAGS_ADAPTER_REQUEST       0x0001
    167 #define SRB_POWER_FLAGS_ADAPTER_REQUEST     0x0001
    168 #define SRB_PNP_FLAGS_ADAPTER_REQUEST       0x0001
    169 
    170 #define SP_BUS_PARITY_ERROR                 0x0001
    171 #define SP_UNEXPECTED_DISCONNECT            0x0002
    172 #define SP_INVALID_RESELECTION              0x0003
    173 #define SP_BUS_TIME_OUT                     0x0004
    174 #define SP_PROTOCOL_ERROR                   0x0005
    175 #define SP_INTERNAL_ADAPTER_ERROR           0x0006
    176 #define SP_REQUEST_TIMEOUT                  0x0007
    177 #define SP_IRQ_NOT_RESPONDING               0x0008
    178 #define SP_BAD_FW_WARNING                   0x0009
    179 #define SP_BAD_FW_ERROR                     0x000a
    180 #define SP_LOST_WMI_MINIPORT_REQUEST        0x000b
    181 
    182 #define SP_VER_TRACE_SUPPORT                0x0010
    183 
    184 #define SP_RETURN_NOT_FOUND                 0
    185 #define SP_RETURN_FOUND                     1
    186 #define SP_RETURN_ERROR                     2
    187 #define SP_RETURN_BAD_CONFIG                3
    188 
    189 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
    190 
    191 typedef struct _ACCESS_RANGE {
    192   SCSI_PHYSICAL_ADDRESS RangeStart;
    193   ULONG RangeLength;
    194   BOOLEAN RangeInMemory;
    195 } ACCESS_RANGE, *PACCESS_RANGE;
    196 
    197 typedef struct _PORT_CONFIGURATION_INFORMATION {
    198   ULONG Length;
    199   ULONG SystemIoBusNumber;
    200   INTERFACE_TYPE AdapterInterfaceType;
    201   ULONG BusInterruptLevel;
    202   ULONG BusInterruptVector;
    203   KINTERRUPT_MODE InterruptMode;
    204   ULONG MaximumTransferLength;
    205   ULONG NumberOfPhysicalBreaks;
    206   ULONG DmaChannel;
    207   ULONG DmaPort;
    208   DMA_WIDTH DmaWidth;
    209   DMA_SPEED DmaSpeed;
    210   ULONG AlignmentMask;
    211   ULONG NumberOfAccessRanges;
    212   ACCESS_RANGE (*AccessRanges)[];
    213   PVOID Reserved;
    214   UCHAR NumberOfBuses;
    215   UCHAR InitiatorBusId[8];
    216   BOOLEAN ScatterGather;
    217   BOOLEAN Master;
    218   BOOLEAN CachesData;
    219   BOOLEAN AdapterScansDown;
    220   BOOLEAN AtdiskPrimaryClaimed;
    221   BOOLEAN AtdiskSecondaryClaimed;
    222   BOOLEAN Dma32BitAddresses;
    223   BOOLEAN DemandMode;
    224   BOOLEAN MapBuffers;
    225   BOOLEAN NeedPhysicalAddresses;
    226   BOOLEAN TaggedQueuing;
    227   BOOLEAN AutoRequestSense;
    228   BOOLEAN MultipleRequestPerLu;
    229   BOOLEAN ReceiveEvent;
    230   BOOLEAN RealModeInitialized;
    231   BOOLEAN BufferAccessScsiPortControlled;
    232   UCHAR MaximumNumberOfTargets;
    233   UCHAR ReservedUchars[2];
    234   ULONG SlotNumber;
    235   ULONG BusInterruptLevel2;
    236   ULONG BusInterruptVector2;
    237   KINTERRUPT_MODE InterruptMode2;
    238   ULONG DmaChannel2;
    239   ULONG DmaPort2;
    240   DMA_WIDTH DmaWidth2;
    241   DMA_SPEED DmaSpeed2;
    242   ULONG DeviceExtensionSize;
    243   ULONG SpecificLuExtensionSize;
    244   ULONG SrbExtensionSize;
    245   UCHAR Dma64BitAddresses;
    246   BOOLEAN ResetTargetSupported;
    247   UCHAR MaximumNumberOfLogicalUnits;
    248   BOOLEAN WmiDataProvider;
    249 } PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
    250 
    251 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
    252 
    253 #ifdef __GNUC__
    254 __extension__ /* enums limited to range of integer */
    255 #endif
    256 typedef enum _SCSI_ADAPTER_CONTROL_TYPE {
    257   ScsiQuerySupportedControlTypes = 0,
    258   ScsiStopAdapter,
    259   ScsiRestartAdapter,
    260   ScsiSetBootConfig,
    261   ScsiSetRunningConfig,
    262   ScsiAdapterControlMax,
    263   MakeAdapterControlTypeSizeOfUlong = 0xffffffff
    264 } SCSI_ADAPTER_CONTROL_TYPE, *PSCSI_ADAPTER_CONTROL_TYPE;
    265 
    266 typedef enum _SCSI_ADAPTER_CONTROL_STATUS {
    267   ScsiAdapterControlSuccess = 0,
    268   ScsiAdapterControlUnsuccessful
    269 } SCSI_ADAPTER_CONTROL_STATUS, *PSCSI_ADAPTER_CONTROL_STATUS;
    270 
    271 typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST {
    272   ULONG MaxControlType;
    273   BOOLEAN SupportedTypeList[0];
    274 } SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST;
    275 
    276 typedef struct _SCSI_REQUEST_BLOCK {
    277   USHORT Length;
    278   UCHAR Function;
    279   UCHAR SrbStatus;
    280   UCHAR ScsiStatus;
    281   UCHAR PathId;
    282   UCHAR TargetId;
    283   UCHAR Lun;
    284   UCHAR QueueTag;
    285   UCHAR QueueAction;
    286   UCHAR CdbLength;
    287   UCHAR SenseInfoBufferLength;
    288   ULONG SrbFlags;
    289   ULONG DataTransferLength;
    290   ULONG TimeOutValue;
    291   PVOID DataBuffer;
    292   PVOID SenseInfoBuffer;
    293   struct _SCSI_REQUEST_BLOCK *NextSrb;
    294   PVOID OriginalRequest;
    295   PVOID SrbExtension;
    296   _ANONYMOUS_UNION union {
    297     ULONG InternalStatus;
    298     ULONG QueueSortKey;
    299     ULONG LinkTimeoutValue;
    300   } DUMMYUNIONNAME;
    301 #if defined(_WIN64)
    302   ULONG Reserved;
    303 #endif
    304   UCHAR Cdb[16];
    305 } SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
    306 
    307 #define SCSI_REQUEST_BLOCK_SIZE           sizeof(SCSI_REQUEST_BLOCK)
    308 
    309 typedef struct _SCSI_WMI_REQUEST_BLOCK {
    310   USHORT Length;
    311   UCHAR Function;
    312   UCHAR SrbStatus;
    313   UCHAR WMISubFunction;
    314   UCHAR PathId;
    315   UCHAR TargetId;
    316   UCHAR Lun;
    317   UCHAR Reserved1;
    318   UCHAR WMIFlags;
    319   UCHAR Reserved2[2];
    320   ULONG SrbFlags;
    321   ULONG DataTransferLength;
    322   ULONG TimeOutValue;
    323   PVOID DataBuffer;
    324   PVOID DataPath;
    325   PVOID Reserved3;
    326   PVOID OriginalRequest;
    327   PVOID SrbExtension;
    328   ULONG Reserved4;
    329 #if (NTDDI_VERSION >= NTDDI_WS03SP1) && defined(_WIN64)
    330   ULONG Reserved6;
    331 #endif
    332   UCHAR Reserved5[16];
    333 } SCSI_WMI_REQUEST_BLOCK, *PSCSI_WMI_REQUEST_BLOCK;
    334 
    335 typedef enum _STOR_DEVICE_POWER_STATE {
    336   StorPowerDeviceUnspecified = 0,
    337   StorPowerDeviceD0,
    338   StorPowerDeviceD1,
    339   StorPowerDeviceD2,
    340   StorPowerDeviceD3,
    341   StorPowerDeviceMaximum
    342 } STOR_DEVICE_POWER_STATE, *PSTOR_DEVICE_POWER_STATE;
    343 
    344 typedef enum _STOR_POWER_ACTION {
    345   StorPowerActionNone = 0,
    346   StorPowerActionReserved,
    347   StorPowerActionSleep,
    348   StorPowerActionHibernate,
    349   StorPowerActionShutdown,
    350   StorPowerActionShutdownReset,
    351   StorPowerActionShutdownOff,
    352   StorPowerActionWarmEject
    353 } STOR_POWER_ACTION, *PSTOR_POWER_ACTION;
    354 
    355 typedef struct _SCSI_POWER_REQUEST_BLOCK {
    356   USHORT Length;
    357   UCHAR Function;
    358   UCHAR SrbStatus;
    359   UCHAR SrbPowerFlags;
    360   UCHAR PathId;
    361   UCHAR TargetId;
    362   UCHAR Lun;
    363   STOR_DEVICE_POWER_STATE DevicePowerState;
    364   ULONG SrbFlags;
    365   ULONG DataTransferLength;
    366   ULONG TimeOutValue;
    367   PVOID DataBuffer;
    368   PVOID SenseInfoBuffer;
    369   struct _SCSI_REQUEST_BLOCK *NextSrb;
    370   PVOID OriginalRequest;
    371   PVOID SrbExtension;
    372   STOR_POWER_ACTION PowerAction;
    373 #if defined(_WIN64)
    374   ULONG Reserved;
    375 #endif
    376   UCHAR Reserved5[16];
    377 } SCSI_POWER_REQUEST_BLOCK, *PSCSI_POWER_REQUEST_BLOCK;
    378 
    379 typedef enum _STOR_PNP_ACTION {
    380   StorStartDevice = 0x0,
    381   StorRemoveDevice = 0x2,
    382   StorStopDevice  = 0x4,
    383   StorQueryCapabilities = 0x9,
    384   StorQueryResourceRequirements = 0xB,
    385   StorFilterResourceRequirements = 0xD,
    386   StorSurpriseRemoval = 0x17
    387 } STOR_PNP_ACTION, *PSTOR_PNP_ACTION;
    388 
    389 typedef struct _STOR_DEVICE_CAPABILITIES {
    390   USHORT Version;
    391   ULONG DeviceD1:1;
    392   ULONG DeviceD2:1;
    393   ULONG LockSupported:1;
    394   ULONG EjectSupported:1;
    395   ULONG Removable:1;
    396   ULONG DockDevice:1;
    397   ULONG UniqueID:1;
    398   ULONG SilentInstall:1;
    399   ULONG SurpriseRemovalOK:1;
    400   ULONG NoDisplayInUI:1;
    401 } STOR_DEVICE_CAPABILITIES, *PSTOR_DEVICE_CAPABILITIES;
    402 
    403 typedef struct _SCSI_PNP_REQUEST_BLOCK {
    404   USHORT Length;
    405   UCHAR Function;
    406   UCHAR SrbStatus;
    407   UCHAR PnPSubFunction;
    408   UCHAR PathId;
    409   UCHAR TargetId;
    410   UCHAR Lun;
    411   STOR_PNP_ACTION PnPAction;
    412   ULONG SrbFlags;
    413   ULONG DataTransferLength;
    414   ULONG TimeOutValue;
    415   PVOID DataBuffer;
    416   PVOID SenseInfoBuffer;
    417   struct _SCSI_REQUEST_BLOCK *NextSrb;
    418   PVOID OriginalRequest;
    419   PVOID SrbExtension;
    420   ULONG SrbPnPFlags;
    421 #if defined(_WIN64)
    422   ULONG Reserved;
    423 #endif
    424   UCHAR Reserved4[16];
    425 } SCSI_PNP_REQUEST_BLOCK, *PSCSI_PNP_REQUEST_BLOCK;
    426 
    427 typedef BOOLEAN
    428 (NTAPI *PHW_INITIALIZE)(
    429   IN PVOID DeviceExtension);
    430 
    431 typedef BOOLEAN
    432 (NTAPI *PHW_STARTIO)(
    433   IN PVOID DeviceExtension,
    434   IN PSCSI_REQUEST_BLOCK Srb);
    435 
    436 typedef BOOLEAN
    437 (NTAPI *PHW_INTERRUPT)(
    438   IN PVOID DeviceExtension);
    439 
    440 typedef VOID
    441 (NTAPI *PHW_TIMER)(
    442   IN PVOID DeviceExtension);
    443 
    444 typedef VOID
    445 (NTAPI *PHW_DMA_STARTED)(
    446   IN PVOID DeviceExtension);
    447 
    448 typedef ULONG
    449 (NTAPI *PHW_FIND_ADAPTER)(
    450   IN PVOID DeviceExtension,
    451   IN PVOID HwContext,
    452   IN PVOID BusInformation,
    453   IN PCHAR ArgumentString,
    454   IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
    455   OUT PBOOLEAN Again);
    456 
    457 typedef BOOLEAN
    458 (NTAPI *PHW_RESET_BUS)(
    459   IN PVOID DeviceExtension,
    460   IN ULONG PathId);
    461 
    462 typedef BOOLEAN
    463 (NTAPI *PHW_ADAPTER_STATE)(
    464   IN PVOID DeviceExtension,
    465   IN PVOID Context,
    466   IN BOOLEAN SaveState);
    467 
    468 typedef SCSI_ADAPTER_CONTROL_STATUS
    469 (NTAPI *PHW_ADAPTER_CONTROL)(
    470   IN PVOID DeviceExtension,
    471   IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
    472   IN PVOID Parameters);
    473 
    474 typedef enum _SCSI_NOTIFICATION_TYPE {
    475   RequestComplete,
    476   NextRequest,
    477   NextLuRequest,
    478   ResetDetected,
    479   CallDisableInterrupts,
    480   CallEnableInterrupts,
    481   RequestTimerCall,
    482   BusChangeDetected,
    483   WMIEvent,
    484   WMIReregister,
    485   LinkUp,
    486   LinkDown,
    487   QueryTickCount,
    488   BufferOverrunDetected,
    489   TraceNotification
    490 } SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
    491 
    492 typedef struct _HW_INITIALIZATION_DATA {
    493   ULONG HwInitializationDataSize;
    494   INTERFACE_TYPE  AdapterInterfaceType;
    495   PHW_INITIALIZE HwInitialize;
    496   PHW_STARTIO HwStartIo;
    497   PHW_INTERRUPT HwInterrupt;
    498   PHW_FIND_ADAPTER HwFindAdapter;
    499   PHW_RESET_BUS HwResetBus;
    500   PHW_DMA_STARTED HwDmaStarted;
    501   PHW_ADAPTER_STATE HwAdapterState;
    502   ULONG DeviceExtensionSize;
    503   ULONG SpecificLuExtensionSize;
    504   ULONG SrbExtensionSize;
    505   ULONG NumberOfAccessRanges;
    506   PVOID Reserved;
    507   BOOLEAN MapBuffers;
    508   BOOLEAN NeedPhysicalAddresses;
    509   BOOLEAN TaggedQueuing;
    510   BOOLEAN AutoRequestSense;
    511   BOOLEAN MultipleRequestPerLu;
    512   BOOLEAN ReceiveEvent;
    513   USHORT VendorIdLength;
    514   PVOID VendorId;
    515   _ANONYMOUS_UNION union {
    516     USHORT ReservedUshort;
    517     USHORT PortVersionFlags;
    518   } DUMMYUNIONNAME;
    519   USHORT DeviceIdLength;
    520   PVOID DeviceId;
    521   PHW_ADAPTER_CONTROL HwAdapterControl;
    522 } HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
    523 
    524 #if defined(_NTDDK_)
    525 #define SCSIPORTAPI
    526 #else
    527 #define SCSIPORTAPI DECLSPEC_IMPORT
    528 #endif
    529 
    530 SCSIPORTAPI
    531 VOID
    532 NTAPI
    533 ScsiPortCompleteRequest(
    534   IN PVOID HwDeviceExtension,
    535   IN UCHAR PathId,
    536   IN UCHAR TargetId,
    537   IN UCHAR Lun,
    538   IN UCHAR SrbStatus);
    539 
    540 SCSIPORTAPI
    541 ULONG
    542 NTAPI
    543 ScsiPortConvertPhysicalAddressToUlong(
    544   IN SCSI_PHYSICAL_ADDRESS Address);
    545 
    546 #define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
    547 #define ScsiPortConvertPhysicalAddressToULongPtr(Address) ((ULONG_PTR)((Address).QuadPart))
    548 
    549 SCSIPORTAPI
    550 SCSI_PHYSICAL_ADDRESS
    551 NTAPI
    552 ScsiPortConvertUlongToPhysicalAddress(
    553   IN ULONG_PTR UlongAddress);
    554 
    555 SCSIPORTAPI
    556 VOID
    557 NTAPI
    558 ScsiPortFlushDma(
    559   IN PVOID DeviceExtension);
    560 
    561 SCSIPORTAPI
    562 VOID
    563 NTAPI
    564 ScsiPortFreeDeviceBase(
    565   IN PVOID HwDeviceExtension,
    566   IN PVOID MappedAddress);
    567 
    568 SCSIPORTAPI
    569 ULONG
    570 NTAPI
    571 ScsiPortGetBusData(
    572   IN PVOID DeviceExtension,
    573   IN ULONG BusDataType,
    574   IN ULONG SystemIoBusNumber,
    575   IN ULONG SlotNumber,
    576   IN PVOID Buffer,
    577   IN ULONG Length);
    578 
    579 SCSIPORTAPI
    580 PVOID
    581 NTAPI
    582 ScsiPortGetDeviceBase(
    583   IN PVOID HwDeviceExtension,
    584   IN INTERFACE_TYPE BusType,
    585   IN ULONG SystemIoBusNumber,
    586   IN SCSI_PHYSICAL_ADDRESS IoAddress,
    587   IN ULONG NumberOfBytes,
    588   IN BOOLEAN InIoSpace);
    589 
    590 SCSIPORTAPI
    591 PVOID
    592 NTAPI
    593 ScsiPortGetLogicalUnit(
    594   IN PVOID HwDeviceExtension,
    595   IN UCHAR PathId,
    596   IN UCHAR TargetId,
    597   IN UCHAR Lun);
    598 
    599 SCSIPORTAPI
    600 SCSI_PHYSICAL_ADDRESS
    601 NTAPI
    602 ScsiPortGetPhysicalAddress(
    603   IN PVOID HwDeviceExtension,
    604   IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
    605   IN PVOID VirtualAddress,
    606   OUT ULONG *Length);
    607 
    608 SCSIPORTAPI
    609 PSCSI_REQUEST_BLOCK
    610 NTAPI
    611 ScsiPortGetSrb(
    612   IN PVOID DeviceExtension,
    613   IN UCHAR PathId,
    614   IN UCHAR TargetId,
    615   IN UCHAR Lun,
    616   IN LONG QueueTag);
    617 
    618 SCSIPORTAPI
    619 PVOID
    620 NTAPI
    621 ScsiPortGetUncachedExtension(
    622   IN PVOID HwDeviceExtension,
    623   IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
    624   IN ULONG NumberOfBytes);
    625 
    626 SCSIPORTAPI
    627 PVOID
    628 NTAPI
    629 ScsiPortGetVirtualAddress(
    630   IN PVOID HwDeviceExtension,
    631   IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
    632 
    633 SCSIPORTAPI
    634 ULONG
    635 NTAPI
    636 ScsiPortInitialize(
    637   IN PVOID Argument1,
    638   IN PVOID Argument2,
    639   IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
    640   IN PVOID HwContext OPTIONAL);
    641 
    642 SCSIPORTAPI
    643 VOID
    644 NTAPI
    645 ScsiPortIoMapTransfer(
    646   IN PVOID HwDeviceExtension,
    647   IN PSCSI_REQUEST_BLOCK Srb,
    648   IN PVOID LogicalAddress,
    649   IN ULONG Length);
    650 
    651 SCSIPORTAPI
    652 VOID
    653 NTAPI
    654 ScsiPortLogError(
    655   IN PVOID HwDeviceExtension,
    656   IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
    657   IN UCHAR PathId,
    658   IN UCHAR TargetId,
    659   IN UCHAR Lun,
    660   IN ULONG ErrorCode,
    661   IN ULONG UniqueId);
    662 
    663 SCSIPORTAPI
    664 VOID
    665 __cdecl
    666 ScsiPortNotification(
    667   IN SCSI_NOTIFICATION_TYPE NotificationType,
    668   IN PVOID HwDeviceExtension,
    669   IN ...);
    670 
    671 SCSIPORTAPI
    672 VOID
    673 NTAPI
    674 ScsiPortQuerySystemTime(
    675   OUT PLARGE_INTEGER CurrentTime);
    676 
    677 SCSIPORTAPI
    678 ULONG
    679 NTAPI
    680 ScsiPortSetBusDataByOffset(
    681   IN PVOID DeviceExtension,
    682   IN ULONG BusDataType,
    683   IN ULONG SystemIoBusNumber,
    684   IN ULONG SlotNumber,
    685   IN PVOID Buffer,
    686   IN ULONG Offset,
    687   IN ULONG Length);
    688 
    689 SCSIPORTAPI
    690 VOID
    691 NTAPI
    692 ScsiPortStallExecution(
    693   IN ULONG Delay);
    694 
    695 SCSIPORTAPI
    696 BOOLEAN
    697 NTAPI
    698 ScsiPortValidateRange(
    699   IN PVOID HwDeviceExtension,
    700   IN INTERFACE_TYPE BusType,
    701   IN ULONG SystemIoBusNumber,
    702   IN SCSI_PHYSICAL_ADDRESS IoAddress,
    703   IN ULONG NumberOfBytes,
    704   IN BOOLEAN InIoSpace);
    705 
    706 SCSIPORTAPI
    707 VOID
    708 __cdecl
    709 ScsiDebugPrint(
    710   IN ULONG DebugPrintLevel,
    711   IN PCCHAR DebugMessage,
    712   IN ...);
    713 
    714 #if defined(_M_AMD64)
    715 
    716 #define ScsiPortReadPortUchar READ_PORT_UCHAR
    717 #define ScsiPortReadPortUshort READ_PORT_USHORT
    718 #define ScsiPortReadPortUlong READ_PORT_ULONG
    719 
    720 #define ScsiPortReadPortBufferUchar READ_PORT_BUFFER_UCHAR
    721 #define ScsiPortReadPortBufferUshort READ_PORT_BUFFER_USHORT
    722 #define ScsiPortReadPortBufferUlong READ_PORT_BUFFER_ULONG
    723 
    724 #define ScsiPortReadRegisterUchar READ_REGISTER_UCHAR
    725 #define ScsiPortReadRegisterUshort READ_REGISTER_USHORT
    726 #define ScsiPortReadRegisterUlong READ_REGISTER_ULONG
    727 
    728 #define ScsiPortReadRegisterBufferUchar READ_REGISTER_BUFFER_UCHAR
    729 #define ScsiPortReadRegisterBufferUshort READ_REGISTER_BUFFER_USHORT
    730 #define ScsiPortReadRegisterBufferUlong READ_REGISTER_BUFFER_ULONG
    731 
    732 #define ScsiPortWritePortUchar WRITE_PORT_UCHAR
    733 #define ScsiPortWritePortUshort WRITE_PORT_USHORT
    734 #define ScsiPortWritePortUlong WRITE_PORT_ULONG
    735 
    736 #define ScsiPortWritePortBufferUchar WRITE_PORT_BUFFER_UCHAR
    737 #define ScsiPortWritePortBufferUshort WRITE_PORT_BUFFER_USHORT
    738 #define ScsiPortWritePortBufferUlong WRITE_PORT_BUFFER_ULONG
    739 
    740 #define ScsiPortWriteRegisterUchar WRITE_REGISTER_UCHAR
    741 #define ScsiPortWriteRegisterUshort WRITE_REGISTER_USHORT
    742 #define ScsiPortWriteRegisterUlong WRITE_REGISTER_ULONG
    743 
    744 #define ScsiPortWriteRegisterBufferUchar WRITE_REGISTER_BUFFER_UCHAR
    745 #define ScsiPortWriteRegisterBufferUshort WRITE_REGISTER_BUFFER_USHORT
    746 #define ScsiPortWriteRegisterBufferUlong WRITE_REGISTER_BUFFER_ULONG
    747 
    748 #define ScsiPortMoveMemory memmove
    749 
    750 #else
    751 
    752 SCSIPORTAPI
    753 UCHAR
    754 NTAPI
    755 ScsiPortReadPortUchar(
    756   IN PUCHAR Port);
    757 
    758 SCSIPORTAPI
    759 ULONG
    760 NTAPI
    761 ScsiPortReadPortUlong(
    762   IN PULONG Port);
    763 
    764 SCSIPORTAPI
    765 USHORT
    766 NTAPI
    767 ScsiPortReadPortUshort(
    768   IN PUSHORT Port);
    769 
    770 SCSIPORTAPI
    771 VOID
    772 NTAPI
    773 ScsiPortReadPortBufferUchar(
    774   IN PUCHAR Port,
    775   IN PUCHAR Buffer,
    776   IN ULONG Count);
    777 
    778 SCSIPORTAPI
    779 VOID
    780 NTAPI
    781 ScsiPortReadPortBufferUlong(
    782   IN PULONG Port,
    783   IN PULONG Buffer,
    784   IN ULONG Count);
    785 
    786 SCSIPORTAPI
    787 VOID
    788 NTAPI
    789 ScsiPortReadPortBufferUshort(
    790   IN PUSHORT Port,
    791   IN PUSHORT Buffer,
    792   IN ULONG Count);
    793 
    794 SCSIPORTAPI
    795 UCHAR
    796 NTAPI
    797 ScsiPortReadRegisterUchar(
    798   IN PUCHAR Register);
    799 
    800 SCSIPORTAPI
    801 ULONG
    802 NTAPI
    803 ScsiPortReadRegisterUlong(
    804   IN PULONG Register);
    805 
    806 SCSIPORTAPI
    807 USHORT
    808 NTAPI
    809 ScsiPortReadRegisterUshort(
    810   IN PUSHORT Register);
    811 
    812 SCSIPORTAPI
    813 VOID
    814 NTAPI
    815 ScsiPortReadRegisterBufferUchar(
    816   IN PUCHAR Register,
    817   IN PUCHAR Buffer,
    818   IN ULONG Count);
    819 
    820 SCSIPORTAPI
    821 VOID
    822 NTAPI
    823 ScsiPortReadRegisterBufferUlong(
    824   IN PULONG Register,
    825   IN PULONG Buffer,
    826   IN ULONG Count);
    827 
    828 SCSIPORTAPI
    829 VOID
    830 NTAPI
    831 ScsiPortReadRegisterBufferUshort(
    832   IN PUSHORT Register,
    833   IN PUSHORT Buffer,
    834   IN ULONG Count);
    835 
    836 SCSIPORTAPI
    837 VOID
    838 NTAPI
    839 ScsiPortWritePortUchar(
    840   IN PUCHAR Port,
    841   IN UCHAR Value);
    842 
    843 SCSIPORTAPI
    844 VOID
    845 NTAPI
    846 ScsiPortWritePortUlong(
    847   IN PULONG Port,
    848   IN ULONG Value);
    849 
    850 SCSIPORTAPI
    851 VOID
    852 NTAPI
    853 ScsiPortWritePortUshort(
    854   IN PUSHORT Port,
    855   IN USHORT Value);
    856 
    857 SCSIPORTAPI
    858 VOID
    859 NTAPI
    860 ScsiPortWritePortBufferUchar(
    861   IN PUCHAR Port,
    862   IN PUCHAR Buffer,
    863   IN ULONG Count);
    864 
    865 SCSIPORTAPI
    866 VOID
    867 NTAPI
    868 ScsiPortWritePortBufferUlong(
    869   IN PULONG Port,
    870   IN PULONG Buffer,
    871   IN ULONG Count);
    872 
    873 SCSIPORTAPI
    874 VOID
    875 NTAPI
    876 ScsiPortWritePortBufferUshort(
    877   IN PUSHORT Port,
    878   IN PUSHORT Buffer,
    879   IN ULONG Count);
    880 
    881 SCSIPORTAPI
    882 VOID
    883 NTAPI
    884 ScsiPortWriteRegisterUchar(
    885   IN PUCHAR Register,
    886   IN UCHAR Value);
    887 
    888 SCSIPORTAPI
    889 VOID
    890 NTAPI
    891 ScsiPortWriteRegisterUlong(
    892   IN PULONG Register,
    893   IN ULONG Value);
    894 
    895 SCSIPORTAPI
    896 VOID
    897 NTAPI
    898 ScsiPortWriteRegisterUshort(
    899   IN PUSHORT Register,
    900   IN USHORT Value);
    901 
    902 SCSIPORTAPI
    903 VOID
    904 NTAPI
    905 ScsiPortWriteRegisterBufferUchar(
    906   IN PUCHAR Register,
    907   IN PUCHAR Buffer,
    908   IN ULONG Count);
    909 
    910 SCSIPORTAPI
    911 VOID
    912 NTAPI
    913 ScsiPortWriteRegisterBufferUlong(
    914   IN PULONG Register,
    915   IN PULONG Buffer,
    916   IN ULONG Count);
    917 
    918 SCSIPORTAPI
    919 VOID
    920 NTAPI
    921 ScsiPortWriteRegisterBufferUshort(
    922   IN PUSHORT Register,
    923   IN PUSHORT Buffer,
    924   IN ULONG Count);
    925 
    926 SCSIPORTAPI
    927 VOID
    928 NTAPI
    929 ScsiPortMoveMemory(
    930   IN PVOID WriteBuffer,
    931   IN PVOID ReadBuffer,
    932   IN ULONG Length);
    933 
    934 #endif /* defined(_M_AMD64) */
    935 
    936 #ifdef __cplusplus
    937 }
    938 #endif
    939 
    940 #endif /* _NTSRB_ */
    941