4 * Interface between SCSI miniport drivers and the SCSI port driver.
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
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.
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
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
45 #define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
46 #define SP_UNTAGGED ((UCHAR) ~0)
48 /* Asynchronous events */
49 #define SRBEV_BUS_RESET 0x0001
50 #define SRBEV_SCSI_ASYNC_NOTIFICATION 0x0002
52 #define MAXIMUM_CDB_SIZE 12
55 #define DebugPrint(x) ScsiDebugPrint x
60 #define SCSI_COMBINE_BUS_TARGET(Bus, Target)( \
61 ((((UCHAR) (Target)) & ~(0x20 - 1)) << 8) | \
62 (((UCHAR) (Bus)) << 5) | \
63 (((UCHAR) (Target)) & (0x20 - 1)))
65 #define SCSI_DECODE_BUS_TARGET(Value, Bus, Target)( \
66 Bus = (UCHAR) ((Value) >> 5), \
67 Target = (UCHAR) ((((Value) >> 8) & ~(0x20 - 1)) | ((Value) & (0x20 - 1))))
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
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
128 #define SRB_STATUS_QUEUE_FROZEN 0x40
129 #define SRB_STATUS_AUTOSENSE_VALID 0x80
131 #define SRB_STATUS(Status) \
132 (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
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
159 #define SCSI_PORT_SIGNATURE 0x54524f50
162 #define SRB_SIMPLE_TAG_REQUEST 0x20
163 #define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
164 #define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
166 #define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
167 #define SRB_POWER_FLAGS_ADAPTER_REQUEST 0x0001
168 #define SRB_PNP_FLAGS_ADAPTER_REQUEST 0x0001
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
182 #define SP_VER_TRACE_SUPPORT 0x0010
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
189 typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS
, *PSCSI_PHYSICAL_ADDRESS
;
191 typedef struct _ACCESS_RANGE
{
192 SCSI_PHYSICAL_ADDRESS RangeStart
;
194 BOOLEAN RangeInMemory
;
195 } ACCESS_RANGE
, *PACCESS_RANGE
;
197 typedef struct _PORT_CONFIGURATION_INFORMATION
{
199 ULONG SystemIoBusNumber
;
200 INTERFACE_TYPE AdapterInterfaceType
;
201 ULONG BusInterruptLevel
;
202 ULONG BusInterruptVector
;
203 KINTERRUPT_MODE InterruptMode
;
204 ULONG MaximumTransferLength
;
205 ULONG NumberOfPhysicalBreaks
;
211 ULONG NumberOfAccessRanges
;
212 ACCESS_RANGE (*AccessRanges
)[];
215 UCHAR InitiatorBusId
[8];
216 BOOLEAN ScatterGather
;
219 BOOLEAN AdapterScansDown
;
220 BOOLEAN AtdiskPrimaryClaimed
;
221 BOOLEAN AtdiskSecondaryClaimed
;
222 BOOLEAN Dma32BitAddresses
;
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];
235 ULONG BusInterruptLevel2
;
236 ULONG BusInterruptVector2
;
237 KINTERRUPT_MODE InterruptMode2
;
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
;
251 #define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
254 __extension__
/* enums limited to range of integer */
256 typedef enum _SCSI_ADAPTER_CONTROL_TYPE
{
257 ScsiQuerySupportedControlTypes
= 0,
261 ScsiSetRunningConfig
,
262 ScsiAdapterControlMax
,
263 MakeAdapterControlTypeSizeOfUlong
= 0xffffffff
264 } SCSI_ADAPTER_CONTROL_TYPE
, *PSCSI_ADAPTER_CONTROL_TYPE
;
266 typedef enum _SCSI_ADAPTER_CONTROL_STATUS
{
267 ScsiAdapterControlSuccess
= 0,
268 ScsiAdapterControlUnsuccessful
269 } SCSI_ADAPTER_CONTROL_STATUS
, *PSCSI_ADAPTER_CONTROL_STATUS
;
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
;
276 typedef struct _SCSI_REQUEST_BLOCK
{
287 UCHAR SenseInfoBufferLength
;
289 ULONG DataTransferLength
;
291 _Field_size_bytes_(DataTransferLength
) PVOID DataBuffer
;
292 PVOID SenseInfoBuffer
;
293 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
294 PVOID OriginalRequest
;
296 _ANONYMOUS_UNION
union {
297 ULONG InternalStatus
;
299 ULONG LinkTimeoutValue
;
305 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
307 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
309 typedef struct _SCSI_WMI_REQUEST_BLOCK
{
313 UCHAR WMISubFunction
;
321 ULONG DataTransferLength
;
326 PVOID OriginalRequest
;
329 #if (NTDDI_VERSION >= NTDDI_WS03SP1) && defined(_WIN64)
333 } SCSI_WMI_REQUEST_BLOCK
, *PSCSI_WMI_REQUEST_BLOCK
;
335 typedef enum _STOR_DEVICE_POWER_STATE
{
336 StorPowerDeviceUnspecified
= 0,
341 StorPowerDeviceMaximum
342 } STOR_DEVICE_POWER_STATE
, *PSTOR_DEVICE_POWER_STATE
;
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
;
355 typedef struct _SCSI_POWER_REQUEST_BLOCK
{
363 STOR_DEVICE_POWER_STATE DevicePowerState
;
365 ULONG DataTransferLength
;
368 PVOID SenseInfoBuffer
;
369 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
370 PVOID OriginalRequest
;
372 STOR_POWER_ACTION PowerAction
;
377 } SCSI_POWER_REQUEST_BLOCK
, *PSCSI_POWER_REQUEST_BLOCK
;
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
;
389 typedef struct _STOR_DEVICE_CAPABILITIES
{
393 ULONG LockSupported
:1;
394 ULONG EjectSupported
:1;
398 ULONG SilentInstall
:1;
399 ULONG SurpriseRemovalOK
:1;
400 ULONG NoDisplayInUI
:1;
401 } STOR_DEVICE_CAPABILITIES
, *PSTOR_DEVICE_CAPABILITIES
;
403 typedef struct _SCSI_PNP_REQUEST_BLOCK
{
407 UCHAR PnPSubFunction
;
411 STOR_PNP_ACTION PnPAction
;
413 ULONG DataTransferLength
;
416 PVOID SenseInfoBuffer
;
417 struct _SCSI_REQUEST_BLOCK
*NextSrb
;
418 PVOID OriginalRequest
;
425 } SCSI_PNP_REQUEST_BLOCK
, *PSCSI_PNP_REQUEST_BLOCK
;
428 _Must_inspect_result_
430 (NTAPI
*PHW_INITIALIZE
)(
431 _In_ PVOID DeviceExtension
);
434 _Must_inspect_result_
436 (NTAPI
*PHW_STARTIO
)(
437 _In_ PVOID DeviceExtension
,
438 _In_ PSCSI_REQUEST_BLOCK Srb
);
441 _Must_inspect_result_
443 (NTAPI
*PHW_INTERRUPT
)(
444 _In_ PVOID DeviceExtension
);
448 _In_ PVOID DeviceExtension
);
451 (NTAPI
*PHW_DMA_STARTED
)(
452 _In_ PVOID DeviceExtension
);
455 _Must_inspect_result_
457 (NTAPI
*PHW_FIND_ADAPTER
)(
458 _In_ PVOID DeviceExtension
,
459 _In_ PVOID HwContext
,
460 _In_ PVOID BusInformation
,
461 _In_ PCHAR ArgumentString
,
462 _Inout_ PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
463 _Out_ PBOOLEAN Again
);
466 _Must_inspect_result_
468 (NTAPI
*PHW_RESET_BUS
)(
469 _In_ PVOID DeviceExtension
,
473 _Must_inspect_result_
475 (NTAPI
*PHW_ADAPTER_STATE
)(
476 _In_ PVOID DeviceExtension
,
478 _In_ BOOLEAN SaveState
);
481 _Must_inspect_result_
482 SCSI_ADAPTER_CONTROL_STATUS
483 (NTAPI
*PHW_ADAPTER_CONTROL
)(
484 _In_ PVOID DeviceExtension
,
485 _In_ SCSI_ADAPTER_CONTROL_TYPE ControlType
,
486 _In_ PVOID Parameters
);
488 typedef enum _SCSI_NOTIFICATION_TYPE
{
493 CallDisableInterrupts
,
494 CallEnableInterrupts
,
502 BufferOverrunDetected
,
504 } SCSI_NOTIFICATION_TYPE
, *PSCSI_NOTIFICATION_TYPE
;
506 typedef struct _HW_INITIALIZATION_DATA
{
507 ULONG HwInitializationDataSize
;
508 INTERFACE_TYPE AdapterInterfaceType
;
509 PHW_INITIALIZE HwInitialize
;
510 PHW_STARTIO HwStartIo
;
511 PHW_INTERRUPT HwInterrupt
;
512 PHW_FIND_ADAPTER HwFindAdapter
;
513 PHW_RESET_BUS HwResetBus
;
514 PHW_DMA_STARTED HwDmaStarted
;
515 PHW_ADAPTER_STATE HwAdapterState
;
516 ULONG DeviceExtensionSize
;
517 ULONG SpecificLuExtensionSize
;
518 ULONG SrbExtensionSize
;
519 ULONG NumberOfAccessRanges
;
522 BOOLEAN NeedPhysicalAddresses
;
523 BOOLEAN TaggedQueuing
;
524 BOOLEAN AutoRequestSense
;
525 BOOLEAN MultipleRequestPerLu
;
526 BOOLEAN ReceiveEvent
;
527 USHORT VendorIdLength
;
529 _ANONYMOUS_UNION
union {
530 USHORT ReservedUshort
;
531 USHORT PortVersionFlags
;
533 USHORT DeviceIdLength
;
535 PHW_ADAPTER_CONTROL HwAdapterControl
;
536 } HW_INITIALIZATION_DATA
, *PHW_INITIALIZATION_DATA
;
541 #define SCSIPORTAPI DECLSPEC_IMPORT
547 ScsiPortCompleteRequest(
548 _In_ PVOID HwDeviceExtension
,
552 _In_ UCHAR SrbStatus
);
554 _Must_inspect_result_
558 ScsiPortConvertPhysicalAddressToUlong(
559 _In_ SCSI_PHYSICAL_ADDRESS Address
);
561 #define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
562 #define ScsiPortConvertPhysicalAddressToULongPtr(Address) ((ULONG_PTR)((Address).QuadPart))
564 _Must_inspect_result_
566 SCSI_PHYSICAL_ADDRESS
568 ScsiPortConvertUlongToPhysicalAddress(
569 _In_ ULONG_PTR UlongAddress
);
575 _In_ PVOID DeviceExtension
);
580 ScsiPortFreeDeviceBase(
581 _In_ PVOID HwDeviceExtension
,
582 _In_ PVOID MappedAddress
);
584 _Must_inspect_result_
589 _In_ PVOID DeviceExtension
,
590 _In_ ULONG BusDataType
,
591 _In_ ULONG SystemIoBusNumber
,
592 _In_ ULONG SlotNumber
,
593 _In_reads_bytes_(Length
) PVOID Buffer
,
596 _Must_inspect_result_
600 ScsiPortGetDeviceBase(
601 _In_ PVOID HwDeviceExtension
,
602 _In_ INTERFACE_TYPE BusType
,
603 _In_ ULONG SystemIoBusNumber
,
604 _In_ SCSI_PHYSICAL_ADDRESS IoAddress
,
605 _In_ ULONG NumberOfBytes
,
606 _In_ BOOLEAN InIoSpace
);
608 _Must_inspect_result_
612 ScsiPortGetLogicalUnit(
613 _In_ PVOID HwDeviceExtension
,
618 _Must_inspect_result_
620 SCSI_PHYSICAL_ADDRESS
622 ScsiPortGetPhysicalAddress(
623 _In_ PVOID HwDeviceExtension
,
624 _In_ PSCSI_REQUEST_BLOCK Srb
,
625 _In_ PVOID VirtualAddress
,
626 _Out_ ULONG
*Length
);
628 _Must_inspect_result_
633 _In_ PVOID DeviceExtension
,
639 _Must_inspect_result_
643 ScsiPortGetUncachedExtension(
644 _In_ PVOID HwDeviceExtension
,
645 _In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
646 _In_ ULONG NumberOfBytes
);
648 _Must_inspect_result_
652 ScsiPortGetVirtualAddress(
653 _In_ PVOID HwDeviceExtension
,
654 _In_ SCSI_PHYSICAL_ADDRESS PhysicalAddress
);
656 _Must_inspect_result_
657 _IRQL_requires_max_(PASSIVE_LEVEL
)
662 _In_ PVOID Argument1
,
663 _In_ PVOID Argument2
,
664 _In_
struct _HW_INITIALIZATION_DATA
*HwInitializationData
,
665 _In_ PVOID HwContext
);
670 ScsiPortIoMapTransfer(
671 _In_ PVOID HwDeviceExtension
,
672 _In_ PSCSI_REQUEST_BLOCK Srb
,
673 _In_ PVOID LogicalAddress
,
680 _In_ PVOID HwDeviceExtension
,
681 _In_opt_ PSCSI_REQUEST_BLOCK Srb
,
685 _In_ ULONG ErrorCode
,
686 _In_ ULONG UniqueId
);
691 ScsiPortNotification(
692 _In_ SCSI_NOTIFICATION_TYPE NotificationType
,
693 _In_ PVOID HwDeviceExtension
,
699 ScsiPortQuerySystemTime(
700 _Out_ PLARGE_INTEGER CurrentTime
);
702 _Must_inspect_result_
706 ScsiPortSetBusDataByOffset(
707 _In_ PVOID DeviceExtension
,
708 _In_ ULONG BusDataType
,
709 _In_ ULONG SystemIoBusNumber
,
710 _In_ ULONG SlotNumber
,
711 _In_reads_bytes_(Length
) PVOID Buffer
,
718 ScsiPortStallExecution(
721 _Must_inspect_result_
725 ScsiPortValidateRange(
726 _In_ PVOID HwDeviceExtension
,
727 _In_ INTERFACE_TYPE BusType
,
728 _In_ ULONG SystemIoBusNumber
,
729 _In_ SCSI_PHYSICAL_ADDRESS IoAddress
,
730 _In_ ULONG NumberOfBytes
,
731 _In_ BOOLEAN InIoSpace
);
737 ULONG DebugPrintLevel
,
741 #if defined(_M_AMD64)
743 #define ScsiPortReadPortUchar READ_PORT_UCHAR
744 #define ScsiPortReadPortUshort READ_PORT_USHORT
745 #define ScsiPortReadPortUlong READ_PORT_ULONG
747 #define ScsiPortReadPortBufferUchar READ_PORT_BUFFER_UCHAR
748 #define ScsiPortReadPortBufferUshort READ_PORT_BUFFER_USHORT
749 #define ScsiPortReadPortBufferUlong READ_PORT_BUFFER_ULONG
751 #define ScsiPortReadRegisterUchar READ_REGISTER_UCHAR
752 #define ScsiPortReadRegisterUshort READ_REGISTER_USHORT
753 #define ScsiPortReadRegisterUlong READ_REGISTER_ULONG
755 #define ScsiPortReadRegisterBufferUchar READ_REGISTER_BUFFER_UCHAR
756 #define ScsiPortReadRegisterBufferUshort READ_REGISTER_BUFFER_USHORT
757 #define ScsiPortReadRegisterBufferUlong READ_REGISTER_BUFFER_ULONG
759 #define ScsiPortWritePortUchar WRITE_PORT_UCHAR
760 #define ScsiPortWritePortUshort WRITE_PORT_USHORT
761 #define ScsiPortWritePortUlong WRITE_PORT_ULONG
763 #define ScsiPortWritePortBufferUchar WRITE_PORT_BUFFER_UCHAR
764 #define ScsiPortWritePortBufferUshort WRITE_PORT_BUFFER_USHORT
765 #define ScsiPortWritePortBufferUlong WRITE_PORT_BUFFER_ULONG
767 #define ScsiPortWriteRegisterUchar WRITE_REGISTER_UCHAR
768 #define ScsiPortWriteRegisterUshort WRITE_REGISTER_USHORT
769 #define ScsiPortWriteRegisterUlong WRITE_REGISTER_ULONG
771 #define ScsiPortWriteRegisterBufferUchar WRITE_REGISTER_BUFFER_UCHAR
772 #define ScsiPortWriteRegisterBufferUshort WRITE_REGISTER_BUFFER_USHORT
773 #define ScsiPortWriteRegisterBufferUlong WRITE_REGISTER_BUFFER_ULONG
775 #define ScsiPortMoveMemory memmove
779 _Must_inspect_result_
783 ScsiPortReadPortUchar(
786 _Must_inspect_result_
790 ScsiPortReadPortUlong(
793 _Must_inspect_result_
797 ScsiPortReadPortUshort(
803 ScsiPortReadPortBufferUchar(
811 ScsiPortReadPortBufferUlong(
819 ScsiPortReadPortBufferUshort(
824 _Must_inspect_result_
828 ScsiPortReadRegisterUchar(
829 _In_ PUCHAR Register
);
831 _Must_inspect_result_
835 ScsiPortReadRegisterUlong(
836 _In_ PULONG Register
);
838 _Must_inspect_result_
842 ScsiPortReadRegisterUshort(
843 _In_ PUSHORT Register
);
848 ScsiPortReadRegisterBufferUchar(
849 _In_ PUCHAR Register
,
856 ScsiPortReadRegisterBufferUlong(
857 _In_ PULONG Register
,
864 ScsiPortReadRegisterBufferUshort(
865 _In_ PUSHORT Register
,
872 ScsiPortWritePortUchar(
879 ScsiPortWritePortUlong(
886 ScsiPortWritePortUshort(
893 ScsiPortWritePortBufferUchar(
901 ScsiPortWritePortBufferUlong(
909 ScsiPortWritePortBufferUshort(
917 ScsiPortWriteRegisterUchar(
918 _In_ PUCHAR Register
,
924 ScsiPortWriteRegisterUlong(
925 _In_ PULONG Register
,
931 ScsiPortWriteRegisterUshort(
932 _In_ PUSHORT Register
,
938 ScsiPortWriteRegisterBufferUchar(
939 _In_ PUCHAR Register
,
946 ScsiPortWriteRegisterBufferUlong(
947 _In_ PULONG Register
,
954 ScsiPortWriteRegisterBufferUshort(
955 _In_ PUSHORT Register
,
963 _In_ PVOID WriteBuffer
,
964 _In_ PVOID ReadBuffer
,
967 #endif /* defined(_M_AMD64) */