44 ULONG timesAlreadyRetried;
51 Pkt->RetryIn100nsUnits = 0;
60 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_GENERAL,
"Unhandled SRB Function %xh in error path for packet %p (did miniport change Srb.Cdb.OperationCode ?)", (
ULONG)pCdb->
CDB10.OperationCode,
Pkt));
91 &
Pkt->RetryIn100nsUnits);
106 UCHAR additionalSenseQual = 0;
111 senseInfoBufferLength,
115 &additionalSenseQual);
119 ULONG retryIntervalSeconds = 0;
130 &retryIntervalSeconds);
142 setRetryIntervalSeconds =
TRUE;
147 setRetryIntervalSeconds =
TRUE;
150 if (setRetryIntervalSeconds) {
151 retryIntervalSeconds =
MAX(retryIntervalSeconds, 2);
157 Pkt->RetryIn100nsUnits = retryIntervalSeconds;
158 Pkt->RetryIn100nsUnits *= 1000 * 1000 * 10;
165 ULONG retryIntervalSeconds = 0;
176 &retryIntervalSeconds);
186 setRetryIntervalSeconds =
TRUE;
191 setRetryIntervalSeconds =
TRUE;
194 if (setRetryIntervalSeconds) {
195 retryIntervalSeconds =
MAX(retryIntervalSeconds, 2);
220 Pkt->RetryIn100nsUnits = retryIntervalSeconds;
221 Pkt->RetryIn100nsUnits *= 1000 * 1000 * 10;
228 ULONG retryIntervalSeconds = 0;
240 &retryIntervalSeconds);
244 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 245 else if (ClasspSrbTimeOutStatus(
Pkt->
Srb)) {
269 Pkt->RetryIn100nsUnits = retryIntervalSeconds;
270 Pkt->RetryIn100nsUnits *= 1000 * 1000 * 10;
276 ULONG retryIntervalSeconds = 0;
288 &retryIntervalSeconds);
310 #if (NTDDI_VERSION >= NTDDI_WINBLUE) 311 else if (ClasspSrbTimeOutStatus(
Pkt->
Srb)) {
335 Pkt->RetryIn100nsUnits = retryIntervalSeconds;
336 Pkt->RetryIn100nsUnits *= 1000 * 1000 * 10;
341 ULONG retryIntervalSeconds = 0;
352 &retryIntervalSeconds);
356 Pkt->RetryIn100nsUnits = retryIntervalSeconds;
357 Pkt->RetryIn100nsUnits *= 1000 * 1000 * 10;
381 UCHAR startBufferLength = 0;
387 &startBufferLength)) {
390 UCHAR outBufferLength = 0;
394 if (ScsiGetNextSenseDescriptorByType(startBuffer,
404 if (ScsiValidateInformationSenseDescriptor(
outBuffer, outBufferLength)) {
406 isInformationValid =
TRUE;
424 isInformationValid =
TRUE;
427 if (isInformationValid) {
437 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_GENERAL,
"Unhandled SRB Function %xh in error path for packet %p (did miniport change Srb.Cdb.OperationCode ?)", (
ULONG)pCdb->
CDB10.OperationCode,
Pkt));
FORCEINLINE UCHAR SrbGetSenseInfoBufferLength(_In_ PVOID Srb)
_In_ PTRANSFER_PACKET Pkt
#define STATUS_INSUFFICIENT_RESOURCES
struct _CDB::_MEDIA_REMOVAL MEDIA_REMOVAL
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
#define SCSIOP_MODE_SENSE
BOOLEAN NTAPI ClassInterpretSenseInfo(_In_ PDEVICE_OBJECT Fdo, _In_ PSCSI_REQUEST_BLOCK _Srb, _In_ UCHAR MajorFunctionCode, _In_ ULONG IoDeviceCode, _In_ ULONG RetryCount, _Out_ NTSTATUS *Status, _Out_opt_ _Deref_out_range_(0, 100) ULONG *RetryInterval)
COMMON_DEVICE_EXTENSION CommonExtension
#define REVERSE_BYTES(Destination, Source)
FORCEINLINE BOOLEAN ClasspIsTokenOperation(_In_ PCDB Cdb)
#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED
PSTORAGE_REQUEST_BLOCK_HEADER Srb
#define SCSI_ADSENSE_LUN_NOT_READY
UCHAR NumIoTimeoutRetries
struct _CDB::_CDB10 CDB10
#define STATUS_VERIFY_REQUIRED
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
#define SRB_STATUS(Status)
#define IsDescriptorSenseDataFormat(SenseInfoBuffer)
struct _CDB::_CDB16 CDB16
#define STATUS_IO_DEVICE_ERROR
FORCEINLINE UCHAR ClasspTransferPacketGetSenseInfoBufferLength(_In_ PTRANSFER_PACKET Pkt)
#define SCSIOP_MODE_SENSE10
#define SL_OVERRIDE_VERIFY_VOLUME
FORCEINLINE BOOLEAN ClasspIsOffloadDataTransferCommand(_In_ PCDB Cdb)
#define TEST_FLAG(Flags, Bit)
UCHAR additionalSenseCode
struct _CDB::_MODE_SENSE MODE_SENSE
VOID ClasspConvertToScsiRequestBlock(_Out_ PSCSI_REQUEST_BLOCK Srb, _In_ PSTORAGE_REQUEST_BLOCK SrbEx)
PSRB_HISTORY RetryHistory
PFIXED_SENSE_DATA senseInfoBuffer
#define SRB_STATUS_DATA_OVERRUN
#define SRB_FUNCTION_STORAGE_REQUEST_BLOCK
#define SCSI_SENSE_COPY_ABORTED
#define SCSIOP_READ_CAPACITY16
#define SCSIOP_MEDIUM_REMOVAL
#define SRB_STATUS_SELECTION_TIMEOUT
#define SCSI_SENSE_ABORTED_COMMAND
PFIXED_SENSE_DATA outBuffer
#define TRACE_LEVEL_ERROR
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define SCSI_SENSEQ_DATA_UNDERRUN
#define IS_SCSIOP_READWRITE(opCode)
#define SCSI_SENSE_DESCRIPTOR_TYPE_INFORMATION
#define SCSIOP_READ_CAPACITY
static PDB_INFORMATION information
FORCEINLINE BOOLEAN ClasspTransferPacketGetNumberOfRetriesDone(_In_ PTRANSFER_PACKET Pkt, _In_ PCDB Cdb, _Out_ PULONG TimesAlreadyRetried)
FORCEINLINE PCDB ClasspTransferPacketGetCdb(_In_ PTRANSFER_PACKET Pkt)
PCLASS_INTERPRET_SENSE_INFO2 InterpretSenseInfo
#define SCSI_ADSENSE_COPY_TARGET_DEVICE_ERROR
#define CLASS_SRB_STORAGE_REQUEST_BLOCK
__callback PCLASS_INTERPRET_SENSE_INFO Interpret
FORCEINLINE PVOID ClasspTransferPacketGetSenseInfoBuffer(_In_ PTRANSFER_PACKET Pkt)
#define REVERSE_BYTES_QUAD(Destination, Source)
#define STATUS_DEVICE_NOT_READY