774{
779
780
781
784
788
790
792 "Irp %p, Context %p\n",
794
797
798
799
800
803 }
804 } else {
806 }
807
813
815
817 }
818
820
822
824
826
829
832 Irp->IoStatus.Status));
835 srbHeader->SrbStatus));
836
837
838
839
840
841
842
843
844
845
846
847
848
851
852
853
854
855
856
860 PowerContext,
864
868
870
873
875
877
878 } else {
879
880
881
882
883
885
886
887
888
889 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount = 0;
891
894
895
896
897
901 0);
904 } else {
905
906
907
912 }
913 } else {
917 }
918
921
929
932 PowerContext,
936
939
941
942 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_POWER,
"(%p)\tIoCallDriver returned %lx\n", fdoExtension->PrivateFdoData->PowerProcessIrp,
status));
943 break;
944 }
945
946 }
947
949
951
953
954
955
956
957
958
959
960 if (!
TEST_FLAG(fdoExtension->PrivateFdoData->HackFlags,
962
963
964
965
966
967 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
MAXIMUM_RETRIES;
969
974 1,
978
979
980
981
983
984 } else {
985
986
992 }
993
994 } else {
998 }
999
1000
1005
1013
1015
1017
1020
1023 PowerContext,
1027
1030
1032
1033 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_POWER,
"(%p)\tIoCallDriver returned %lx\n", fdoExtension->PrivateFdoData->PowerProcessIrp,
status));
1034 break;
1035
1036 } else {
1037
1038 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_POWER,
"(%p)\tPower Down: not sending SYNCH_CACHE\n",
1042
1043 }
1044
1045
1046 }
1047
1049
1051
1054
1055
1056
1057
1058
1060
1063
1064 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_POWER,
"(%p)\tError occured when issuing "
1065 "SYNCHRONIZE_CACHE command to device. "
1066 "Srb %p, Status %lx\n",
1068 srbHeader,
1069 srbHeader->SrbStatus));
1070
1074
1082 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount - PowerContext->
RetryCount,
1084 &delta100nsUnits);
1085
1086
1087
1088
1089
1090 delta100nsUnits += (10*1000*1000) - 1;
1091 delta100nsUnits /= (10*1000*1000);
1092
1094
1095
1097
1099
1100
1101
1102
1103
1104
1108 PowerContext);
1109 break;
1110 }
1111
1113 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
MAXIMUM_RETRIES;
1115 }
1116
1117
1118
1119
1120
1121
1122
1126
1127 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_POWER,
"(%p)\tPower Down: not sending SPIN DOWN due to hibernation path\n",
1129
1133
1134
1135
1136 } else {
1137
1138
1139
1140 ULONG secondsRemaining;
1142
1144
1145 if (PoQueryWatchdogTime(fdoExtension->
LowerPdo, &secondsRemaining)) {
1146
1147
1149 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
1151
1152
1153
1154
1155
1156
1157
1158 if (--fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount)
1159 {
1161 } else {
1163 }
1164
1165
1166
1167 if (fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount >
MAXIMUM_RETRIES) {
1168 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
MAXIMUM_RETRIES;
1169 }
1170 } else {
1171
1172 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount = 0;
1173
1174
1177 } else {
1179 }
1180
1181 }
1182
1183 } else {
1184
1185 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
MAXIMUM_RETRIES;
1187 }
1188
1189
1190
1191
1192
1193 PowerContext->
RetryCount = fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount;
1194
1199 1,
1203
1204
1205
1206
1208
1209 } else {
1210
1211
1212
1218 }
1219
1220 } else {
1224 }
1225
1230
1231
1239
1241
1244
1248
1251 PowerContext,
1255
1258
1260
1261 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_POWER,
"(%p)\tIoCallDriver returned %lx\n", fdoExtension->PrivateFdoData->PowerProcessIrp,
status));
1262 break;
1263 }
1264 }
1265
1267
1269
1270
1271
1272
1273
1275
1278
1279 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_POWER,
"(%p)\tError occured when issueing STOP_UNIT "
1280 "command to device. Srb %p, Status %lx\n",
1282 srbHeader,
1283 srbHeader->SrbStatus));
1284
1288
1296 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount - PowerContext->
RetryCount,
1298 &delta100nsUnits);
1299
1300
1301
1302
1303
1304 delta100nsUnits += (10*1000*1000) - 1;
1305 delta100nsUnits /= (10*1000*1000);
1306
1308
1309
1311
1313
1314
1315
1316
1317
1318
1320
1322
1325 PowerContext);
1326 break;
1327 }
1328
1330 fdoExtension->PrivateFdoData->MaxPowerOperationRetryCount =
MAXIMUM_RETRIES;
1332
1333 }
1334
1335
1337
1338
1339
1340
1341
1342
1344
1346
1348 (senseBuffer !=
NULL)) {
1349
1354
1355 validSense = ScsiGetSenseKeyAndCodes(senseBuffer,
1361
1366
1367 ignoreError =
FALSE;
1370 }
1371 }
1372 }
1373 }
1374
1376
1377
1378
1379
1380
1382
1385 PowerContext,
1389
1391
1393 break;
1394 }
1395
1396
1397
1398
1399
1400 }
1401
1403
1404
1405
1406
1407
1408
1410
1412
1414
1416
1417
1418
1422 0);
1425
1426
1427
1428
1430
1431 } else {
1432
1433
1434
1440 }
1441 } else {
1445 }
1446
1450
1453
1456 PowerContext,
1460
1463 fdoExtension->PrivateFdoData->PowerProcessIrp,
1465 break;
1466 }
1467
1468 }
1469
1471
1472
1473
1474
1475
1476
1479 } else {
1483
1486 }
1487 }
1488
1491
1494
1496
1497
1498
1499
1500
1503
1504 }
1505
1507
1509
1511
1513
1515
1516
1517 if (
Irp == fdoExtension->PrivateFdoData->PowerProcessIrp) {
1518
1519
1522 }
1523
1525 }
1526 }
1527
1529}
#define SCSI_ADSENSE_LUN_NOT_READY
#define SCSIOP_START_STOP_UNIT
#define SCSI_SENSE_NOT_READY
#define SCSI_SENSEQ_FORMAT_IN_PROGRESS
#define SCSIOP_SYNCHRONIZE_CACHE
NTSTATUS InitializeStorageRequestBlock(_Inout_bytecount_(ByteSize) PSTORAGE_REQUEST_BLOCK Srb, _In_ USHORT AddressType, _In_ ULONG ByteSize, _In_ ULONG NumSrbExData,...)
_In_ PTRANSFER_PACKET _In_ ULONG _In_ PIRP OriginalIrp
#define FDO_HACK_NO_SYNC_CACHE
FORCEINLINE UCHAR GET_FDO_EXTENSON_SENSE_DATA_LENGTH(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define CLASS_SRBEX_NO_SRBEX_DATA_BUFFER_SIZE
@ PowerDownDeviceUnlocked3
@ PowerDownDeviceFlushed3
@ PowerDownDeviceStopped3
@ PowerDownDeviceQuiesced3
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE
BOOLEAN InterpretSenseInfoWithoutHistory(_In_ PDEVICE_OBJECT Fdo, _In_opt_ PIRP OriginalRequest, _In_ PSCSI_REQUEST_BLOCK Srb, UCHAR MajorFunctionCode, ULONG IoDeviceCode, ULONG PreviousRetryCount, _Out_ NTSTATUS *Status, _Out_opt_ _Deref_out_range_(0, MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) LONGLONG *RetryIn100nsUnits)
VOID RetryPowerRequest(PDEVICE_OBJECT DeviceObject, PIRP Irp, PCLASS_POWER_CONTEXT Context)
IO_COMPLETION_ROUTINE ClasspPowerDownCompletion
#define DEFAULT_IO_TIMEOUT_VALUE
IO_COMPLETION_ROUTINE ClasspStartNextPowerIrpCompletion
#define TIME_LEFT_FOR_LOWER_DRIVERS
#define MINIMUM_STOP_UNIT_TIMEOUT_VALUE
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define SRB_FLAGS_FREE_SENSE_BUFFER
#define SRB_FUNCTION_EXECUTE_SCSI
#define SRB_FLAGS_NO_DATA_TRANSFER
#define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE
#define SRB_STATUS_AUTOSENSE_VALID
#define SRB_FLAGS_DISABLE_AUTOSENSE
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
#define SRB_FUNCTION_UNLOCK_QUEUE
#define SRB_FLAGS_BYPASS_LOCKED_QUEUE
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SRB_STATUS(Status)
#define SRB_STATUS_QUEUE_FROZEN
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define SRB_STATUS_SUCCESS
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
UCHAR additionalSenseCode
UCHAR additionalSenseCodeQualifier
#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED
#define SRB_FLAGS_D3_PROCESSING
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
#define STORAGE_ADDRESS_TYPE_BTL8
struct SRB_ALIGN _STORAGE_REQUEST_BLOCK_HEADER * PSTORAGE_REQUEST_BLOCK_HEADER
#define SRB_FUNCTION_QUIESCE_DEVICE
#define STATUS_MORE_PROCESSING_REQUIRED
FORCEINLINE VOID SrbAssignSrbFlags(_In_ PVOID Srb, _In_ ULONG Flags)
FORCEINLINE VOID SrbSetOriginalRequest(_In_ PVOID Srb, _In_opt_ PVOID OriginalRequest)
FORCEINLINE VOID SrbSetSenseInfoBufferLength(_In_ PVOID Srb, _In_ UCHAR SenseInfoBufferLength)
FORCEINLINE ULONG SrbGetSrbFlags(_In_ PVOID Srb)
FORCEINLINE VOID SrbSetSenseInfoBuffer(_In_ PVOID Srb, _In_opt_ PVOID SenseInfoBuffer)
FORCEINLINE VOID SrbSetCdbLength(_In_ PVOID Srb, _In_ UCHAR CdbLength)
FORCEINLINE VOID SrbSetTimeOutValue(_In_ PVOID Srb, _In_ ULONG TimeOutValue)
FORCEINLINE PVOID SrbGetSenseInfoBuffer(_In_ PVOID Srb)
FORCEINLINE UCHAR SrbGetSenseInfoBufferLength(_In_ PVOID Srb)
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_ERROR
CLASS_POWER_DOWN_STATE3 PowerDown3
union _CLASS_POWER_CONTEXT::@1926 PowerChangeState
CLASS_POWER_OPTIONS Options
ULONG HibernationPathCount
struct _FUNCTIONAL_DEVICE_EXTENSION * PartitionZeroExtension
PDEVICE_OBJECT DeviceObject
BOOLEAN PowerDownInProgress
PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor
struct _IO_STACK_LOCATION::@4026::@4048 Scsi
#define RtlZeroMemory(Destination, Length)
#define STATUS_DEVICE_BUSY
struct _CDB::_START_STOP START_STOP
struct _CDB::_SYNCHRONIZE_CACHE10 SYNCHRONIZE_CACHE10
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)