Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendebug.c
Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (C) Microsoft Corporation, 1991 - 1999 00004 00005 Module Name: 00006 00007 debug.c 00008 00009 Abstract: 00010 00011 CLASSPNP debug code and data 00012 00013 Environment: 00014 00015 kernel mode only 00016 00017 Notes: 00018 00019 00020 Revision History: 00021 00022 --*/ 00023 00024 00025 #include "classp.h" 00026 #include "debug.h" 00027 00028 #if DBG 00029 00030 // 00031 // default to not breaking in for lost irps, five minutes before we even 00032 // bother checking for lost irps, using standard debug print macros, and 00033 // using a 64k debug print buffer 00034 // 00035 00036 #ifndef CLASS_GLOBAL_BREAK_ON_LOST_IRPS 00037 #error "CLASS_GLOBAL_BREAK_ON_LOST_IRPS undefined" 00038 #define CLASS_GLOBAL_BREAK_ON_LOST_IRPS 0 00039 #endif // CLASS_GLOBAL_BREAK_ON_LOST_IRPS 00040 00041 #ifndef CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB 00042 #error "CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB undefined" 00043 #define CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB 300 00044 #endif // CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB 00045 00046 #ifndef CLASS_GLOBAL_USE_DELAYED_RETRY 00047 #error "CLASS_GLOBAL_USE_DELAYED_RETRY undefined" 00048 #define CLASS_GLOBAL_USE_DELAYED_RETRY 1 00049 #endif // CLASS_GLOBAL_USE_DELAYED_RETRY 00050 00051 #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT 00052 #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT undefined" 00053 #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT 0 00054 #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT 00055 00056 #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE 00057 #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE undefined" 00058 #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE 512 00059 #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE 00060 00061 #ifndef CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS 00062 #error "CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS undefined" 00063 #define CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS 512 00064 #endif // CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS 00065 00066 #pragma data_seg("NONPAGE") 00067 00068 00069 00070 CLASSPNP_GLOBALS ClasspnpGlobals; 00071 00072 // 00073 // the low sixteen bits are used to see if the debug level is high enough 00074 // the high sixteen bits are used to singly enable debug levels 1-16 00075 // 00076 LONG ClassDebug = 0xFFFFFFFF; 00077 00078 BOOLEAN DebugTrapOnWarn = FALSE; 00079 00080 VOID ClasspInitializeDebugGlobals() 00081 { 00082 KIRQL irql; 00083 00084 if (InterlockedCompareExchange(&ClasspnpGlobals.Initializing, 1, 0) == 0) { 00085 00086 KeInitializeSpinLock(&ClasspnpGlobals.SpinLock); 00087 00088 KeAcquireSpinLock(&ClasspnpGlobals.SpinLock, &irql); 00089 00090 DebugPrint((1, "CLASSPNP.SYS => Initializing ClasspnpGlobals...\n")); 00091 00092 ClasspnpGlobals.Buffer = NULL; 00093 ClasspnpGlobals.Index = -1; 00094 ClasspnpGlobals.BreakOnLostIrps = CLASS_GLOBAL_BREAK_ON_LOST_IRPS; 00095 ClasspnpGlobals.EachBufferSize = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFER_SIZE; 00096 ClasspnpGlobals.NumberOfBuffers = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT_BUFFERS; 00097 ClasspnpGlobals.SecondsToWaitForIrps = CLASS_GLOBAL_SECONDS_TO_WAIT_FOR_SYNCHRONOUS_SRB; 00098 00099 // 00100 // this should be the last item set 00101 // 00102 00103 ClasspnpGlobals.UseBufferedDebugPrint = CLASS_GLOBAL_BUFFERED_DEBUG_PRINT; 00104 00105 KeReleaseSpinLock(&ClasspnpGlobals.SpinLock, irql); 00106 00107 InterlockedExchange(&ClasspnpGlobals.Initialized, 1); 00108 00109 } 00110 } 00111 00112 00113 00114 /*++//////////////////////////////////////////////////////////////////////////// 00115 00116 ClassDebugPrint() 00117 00118 Routine Description: 00119 00120 Debug print for all class drivers, NOOP on FRE versions. 00121 Allows printing to a debug buffer (with auto fallback to kdprint) by 00122 properly setting the Globals in classpnp on CHK versions. 00123 00124 Arguments: 00125 00126 Debug print level, or from 0 to 3 for legacy drivers. 00127 00128 Return Value: 00129 00130 None 00131 00132 --*/ 00133 VOID ClassDebugPrint(CLASS_DEBUG_LEVEL DebugPrintLevel, PCCHAR DebugMessage, ...) 00134 { 00135 va_list ap; 00136 va_start(ap, DebugMessage); 00137 00138 if ((DebugPrintLevel <= (ClassDebug & 0x0000ffff)) || 00139 ((1 << (DebugPrintLevel + 15)) & ClassDebug)) { 00140 00141 if (ClasspnpGlobals.UseBufferedDebugPrint && 00142 ClasspnpGlobals.Buffer == NULL) { 00143 00144 // 00145 // this double-check prevents always taking 00146 // a spinlock just to ensure we have a buffer 00147 // 00148 00149 KIRQL irql; 00150 00151 KeAcquireSpinLock(&ClasspnpGlobals.SpinLock, &irql); 00152 if (ClasspnpGlobals.Buffer == NULL) { 00153 00154 SIZE_T bufferSize; 00155 bufferSize = ClasspnpGlobals.NumberOfBuffers * 00156 ClasspnpGlobals.EachBufferSize; 00157 DbgPrintEx(DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, 00158 "ClassDebugPrint: Allocating %x bytes for " 00159 "classdebugprint buffer\n", bufferSize); 00160 ClasspnpGlobals.Index = -1; 00161 ClasspnpGlobals.Buffer = 00162 ExAllocatePoolWithTag(NonPagedPool, bufferSize, 'bDcS'); 00163 DbgPrintEx(DPFLTR_CLASSPNP_ID, DPFLTR_ERROR_LEVEL, 00164 "ClassDebugPrint: Allocated buffer at %p\n", 00165 ClasspnpGlobals.Buffer); 00166 00167 } 00168 KeReleaseSpinLock(&ClasspnpGlobals.SpinLock, irql); 00169 00170 } 00171 00172 if (ClasspnpGlobals.UseBufferedDebugPrint && 00173 ClasspnpGlobals.Buffer != NULL) { 00174 00175 // 00176 // we never free the buffer, so once it exists, 00177 // we can just print to it with immunity 00178 // 00179 00180 ULONG index; 00181 PUCHAR buffer; 00182 index = InterlockedIncrement(&ClasspnpGlobals.Index); 00183 index %= ClasspnpGlobals.NumberOfBuffers; 00184 index *= (ULONG)ClasspnpGlobals.EachBufferSize; 00185 00186 buffer = ClasspnpGlobals.Buffer; 00187 buffer += index; 00188 00189 _vsnprintf(buffer, ClasspnpGlobals.EachBufferSize, DebugMessage, ap); 00190 00191 } else { 00192 00193 // 00194 // either we could not allocate a buffer for debug prints 00195 // or buffered debug prints are disabled 00196 // 00197 vDbgPrintEx(-1, DPFLTR_ERROR_LEVEL, DebugMessage, ap); 00198 00199 } 00200 00201 } 00202 00203 va_end(ap); 00204 00205 } 00206 00207 00208 char *DbgGetIoctlStr(ULONG ioctl) 00209 { 00210 char *ioctlStr = "?"; 00211 00212 switch (ioctl){ 00213 00214 #undef MAKE_CASE 00215 #define MAKE_CASE(ioctlCode) case ioctlCode: ioctlStr = #ioctlCode; break; 00216 00217 MAKE_CASE(IOCTL_STORAGE_CHECK_VERIFY) 00218 MAKE_CASE(IOCTL_STORAGE_CHECK_VERIFY2) 00219 MAKE_CASE(IOCTL_STORAGE_MEDIA_REMOVAL) 00220 MAKE_CASE(IOCTL_STORAGE_EJECT_MEDIA) 00221 MAKE_CASE(IOCTL_STORAGE_LOAD_MEDIA) 00222 MAKE_CASE(IOCTL_STORAGE_LOAD_MEDIA2) 00223 MAKE_CASE(IOCTL_STORAGE_RESERVE) 00224 MAKE_CASE(IOCTL_STORAGE_RELEASE) 00225 MAKE_CASE(IOCTL_STORAGE_FIND_NEW_DEVICES) 00226 MAKE_CASE(IOCTL_STORAGE_EJECTION_CONTROL) 00227 MAKE_CASE(IOCTL_STORAGE_MCN_CONTROL) 00228 MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_TYPES) 00229 MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_TYPES_EX) 00230 MAKE_CASE(IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER) 00231 MAKE_CASE(IOCTL_STORAGE_GET_HOTPLUG_INFO) 00232 MAKE_CASE(IOCTL_STORAGE_RESET_BUS) 00233 MAKE_CASE(IOCTL_STORAGE_RESET_DEVICE) 00234 MAKE_CASE(IOCTL_STORAGE_GET_DEVICE_NUMBER) 00235 MAKE_CASE(IOCTL_STORAGE_PREDICT_FAILURE) 00236 MAKE_CASE(IOCTL_STORAGE_QUERY_PROPERTY) 00237 MAKE_CASE(OBSOLETE_IOCTL_STORAGE_RESET_BUS) 00238 MAKE_CASE(OBSOLETE_IOCTL_STORAGE_RESET_DEVICE) 00239 } 00240 00241 return ioctlStr; 00242 } 00243 00244 char *DbgGetScsiOpStr(PSCSI_REQUEST_BLOCK Srb) 00245 { 00246 PCDB pCdb = (PCDB)Srb->Cdb; 00247 UCHAR scsiOp = pCdb->CDB6GENERIC.OperationCode; 00248 char *scsiOpStr = "?"; 00249 00250 switch (scsiOp){ 00251 00252 #undef MAKE_CASE 00253 #define MAKE_CASE(scsiOpCode) case scsiOpCode: scsiOpStr = #scsiOpCode; break; 00254 00255 MAKE_CASE(SCSIOP_TEST_UNIT_READY) 00256 MAKE_CASE(SCSIOP_REWIND) // aka SCSIOP_REZERO_UNIT 00257 MAKE_CASE(SCSIOP_REQUEST_BLOCK_ADDR) 00258 MAKE_CASE(SCSIOP_REQUEST_SENSE) 00259 MAKE_CASE(SCSIOP_FORMAT_UNIT) 00260 MAKE_CASE(SCSIOP_READ_BLOCK_LIMITS) 00261 MAKE_CASE(SCSIOP_INIT_ELEMENT_STATUS) // aka SCSIOP_REASSIGN_BLOCKS 00262 MAKE_CASE(SCSIOP_RECEIVE) // aka SCSIOP_READ6 00263 MAKE_CASE(SCSIOP_SEND) // aka SCSIOP_WRITE6, SCSIOP_PRINT 00264 MAKE_CASE(SCSIOP_SLEW_PRINT) // aka SCSIOP_SEEK6, SCSIOP_TRACK_SELECT 00265 MAKE_CASE(SCSIOP_SEEK_BLOCK) 00266 MAKE_CASE(SCSIOP_PARTITION) 00267 MAKE_CASE(SCSIOP_READ_REVERSE) 00268 MAKE_CASE(SCSIOP_FLUSH_BUFFER) // aka SCSIOP_WRITE_FILEMARKS 00269 MAKE_CASE(SCSIOP_SPACE) 00270 MAKE_CASE(SCSIOP_INQUIRY) 00271 MAKE_CASE(SCSIOP_VERIFY6) 00272 MAKE_CASE(SCSIOP_RECOVER_BUF_DATA) 00273 MAKE_CASE(SCSIOP_MODE_SELECT) 00274 MAKE_CASE(SCSIOP_RESERVE_UNIT) 00275 MAKE_CASE(SCSIOP_RELEASE_UNIT) 00276 MAKE_CASE(SCSIOP_COPY) 00277 MAKE_CASE(SCSIOP_ERASE) 00278 MAKE_CASE(SCSIOP_MODE_SENSE) 00279 MAKE_CASE(SCSIOP_START_STOP_UNIT) // aka SCSIOP_STOP_PRINT, SCSIOP_LOAD_UNLOAD 00280 MAKE_CASE(SCSIOP_RECEIVE_DIAGNOSTIC) 00281 MAKE_CASE(SCSIOP_SEND_DIAGNOSTIC) 00282 MAKE_CASE(SCSIOP_MEDIUM_REMOVAL) 00283 MAKE_CASE(SCSIOP_READ_FORMATTED_CAPACITY) 00284 MAKE_CASE(SCSIOP_READ_CAPACITY) 00285 MAKE_CASE(SCSIOP_READ) 00286 MAKE_CASE(SCSIOP_WRITE) 00287 MAKE_CASE(SCSIOP_SEEK) // aka SCSIOP_LOCATE, SCSIOP_POSITION_TO_ELEMENT 00288 MAKE_CASE(SCSIOP_WRITE_VERIFY) 00289 MAKE_CASE(SCSIOP_VERIFY) 00290 MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH) 00291 MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL) 00292 MAKE_CASE(SCSIOP_SEARCH_DATA_LOW) 00293 MAKE_CASE(SCSIOP_SET_LIMITS) 00294 MAKE_CASE(SCSIOP_READ_POSITION) 00295 MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE) 00296 MAKE_CASE(SCSIOP_COMPARE) 00297 MAKE_CASE(SCSIOP_COPY_COMPARE) 00298 MAKE_CASE(SCSIOP_WRITE_DATA_BUFF) 00299 MAKE_CASE(SCSIOP_READ_DATA_BUFF) 00300 MAKE_CASE(SCSIOP_CHANGE_DEFINITION) 00301 MAKE_CASE(SCSIOP_READ_SUB_CHANNEL) 00302 MAKE_CASE(SCSIOP_READ_TOC) 00303 MAKE_CASE(SCSIOP_READ_HEADER) 00304 MAKE_CASE(SCSIOP_PLAY_AUDIO) 00305 MAKE_CASE(SCSIOP_GET_CONFIGURATION) 00306 MAKE_CASE(SCSIOP_PLAY_AUDIO_MSF) 00307 MAKE_CASE(SCSIOP_PLAY_TRACK_INDEX) 00308 MAKE_CASE(SCSIOP_PLAY_TRACK_RELATIVE) 00309 MAKE_CASE(SCSIOP_GET_EVENT_STATUS) 00310 MAKE_CASE(SCSIOP_PAUSE_RESUME) 00311 MAKE_CASE(SCSIOP_LOG_SELECT) 00312 MAKE_CASE(SCSIOP_LOG_SENSE) 00313 MAKE_CASE(SCSIOP_STOP_PLAY_SCAN) 00314 MAKE_CASE(SCSIOP_READ_DISK_INFORMATION) 00315 MAKE_CASE(SCSIOP_READ_TRACK_INFORMATION) 00316 MAKE_CASE(SCSIOP_RESERVE_TRACK_RZONE) 00317 MAKE_CASE(SCSIOP_SEND_OPC_INFORMATION) 00318 MAKE_CASE(SCSIOP_MODE_SELECT10) 00319 MAKE_CASE(SCSIOP_MODE_SENSE10) 00320 MAKE_CASE(SCSIOP_CLOSE_TRACK_SESSION) 00321 MAKE_CASE(SCSIOP_READ_BUFFER_CAPACITY) 00322 MAKE_CASE(SCSIOP_SEND_CUE_SHEET) 00323 MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_IN) 00324 MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_OUT) 00325 MAKE_CASE(SCSIOP_REPORT_LUNS) 00326 MAKE_CASE(SCSIOP_BLANK) 00327 MAKE_CASE(SCSIOP_SEND_KEY) 00328 MAKE_CASE(SCSIOP_REPORT_KEY) 00329 MAKE_CASE(SCSIOP_MOVE_MEDIUM) 00330 MAKE_CASE(SCSIOP_LOAD_UNLOAD_SLOT) // aka SCSIOP_EXCHANGE_MEDIUM 00331 MAKE_CASE(SCSIOP_SET_READ_AHEAD) 00332 MAKE_CASE(SCSIOP_READ_DVD_STRUCTURE) 00333 MAKE_CASE(SCSIOP_REQUEST_VOL_ELEMENT) 00334 MAKE_CASE(SCSIOP_SEND_VOLUME_TAG) 00335 MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS) 00336 MAKE_CASE(SCSIOP_READ_CD_MSF) 00337 MAKE_CASE(SCSIOP_SCAN_CD) 00338 MAKE_CASE(SCSIOP_SET_CD_SPEED) 00339 MAKE_CASE(SCSIOP_PLAY_CD) 00340 MAKE_CASE(SCSIOP_MECHANISM_STATUS) 00341 MAKE_CASE(SCSIOP_READ_CD) 00342 MAKE_CASE(SCSIOP_SEND_DVD_STRUCTURE) 00343 MAKE_CASE(SCSIOP_INIT_ELEMENT_RANGE) 00344 } 00345 00346 return scsiOpStr; 00347 } 00348 00349 00350 char *DbgGetSrbStatusStr(PSCSI_REQUEST_BLOCK Srb) 00351 { 00352 char *srbStatStr = "?"; 00353 00354 switch (Srb->SrbStatus){ 00355 00356 #undef MAKE_CASE 00357 #define MAKE_CASE(srbStat) \ 00358 case srbStat: \ 00359 srbStatStr = #srbStat; \ 00360 break; \ 00361 case srbStat|SRB_STATUS_QUEUE_FROZEN: \ 00362 srbStatStr = #srbStat "|SRB_STATUS_QUEUE_FROZEN"; \ 00363 break; \ 00364 case srbStat|SRB_STATUS_AUTOSENSE_VALID: \ 00365 srbStatStr = #srbStat "|SRB_STATUS_AUTOSENSE_VALID"; \ 00366 break; \ 00367 case srbStat|SRB_STATUS_QUEUE_FROZEN|SRB_STATUS_AUTOSENSE_VALID: \ 00368 srbStatStr = #srbStat "|SRB_STATUS_QUEUE_FROZEN|SRB_STATUS_AUTOSENSE_VALID"; \ 00369 break; 00370 00371 MAKE_CASE(SRB_STATUS_PENDING) 00372 MAKE_CASE(SRB_STATUS_SUCCESS) 00373 MAKE_CASE(SRB_STATUS_ABORTED) 00374 MAKE_CASE(SRB_STATUS_ABORT_FAILED) 00375 MAKE_CASE(SRB_STATUS_ERROR) 00376 MAKE_CASE(SRB_STATUS_BUSY) 00377 MAKE_CASE(SRB_STATUS_INVALID_REQUEST) 00378 MAKE_CASE(SRB_STATUS_INVALID_PATH_ID) 00379 MAKE_CASE(SRB_STATUS_NO_DEVICE) 00380 MAKE_CASE(SRB_STATUS_TIMEOUT) 00381 MAKE_CASE(SRB_STATUS_SELECTION_TIMEOUT) 00382 MAKE_CASE(SRB_STATUS_COMMAND_TIMEOUT) 00383 MAKE_CASE(SRB_STATUS_MESSAGE_REJECTED) 00384 MAKE_CASE(SRB_STATUS_BUS_RESET) 00385 MAKE_CASE(SRB_STATUS_PARITY_ERROR) 00386 MAKE_CASE(SRB_STATUS_REQUEST_SENSE_FAILED) 00387 MAKE_CASE(SRB_STATUS_NO_HBA) 00388 MAKE_CASE(SRB_STATUS_DATA_OVERRUN) 00389 MAKE_CASE(SRB_STATUS_UNEXPECTED_BUS_FREE) 00390 MAKE_CASE(SRB_STATUS_PHASE_SEQUENCE_FAILURE) 00391 MAKE_CASE(SRB_STATUS_BAD_SRB_BLOCK_LENGTH) 00392 MAKE_CASE(SRB_STATUS_REQUEST_FLUSHED) 00393 MAKE_CASE(SRB_STATUS_INVALID_LUN) 00394 MAKE_CASE(SRB_STATUS_INVALID_TARGET_ID) 00395 MAKE_CASE(SRB_STATUS_BAD_FUNCTION) 00396 MAKE_CASE(SRB_STATUS_ERROR_RECOVERY) 00397 MAKE_CASE(SRB_STATUS_NOT_POWERED) 00398 MAKE_CASE(SRB_STATUS_INTERNAL_ERROR) 00399 } 00400 00401 return srbStatStr; 00402 } 00403 00404 00405 char *DbgGetSenseCodeStr(PSCSI_REQUEST_BLOCK Srb) 00406 { 00407 char *senseCodeStr = "?"; 00408 00409 if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ 00410 PSENSE_DATA senseData; 00411 UCHAR senseCode; 00412 00413 ASSERT(Srb->SenseInfoBuffer); 00414 senseData = Srb->SenseInfoBuffer; 00415 senseCode = senseData->SenseKey & 0xf; 00416 00417 switch (senseCode){ 00418 00419 #undef MAKE_CASE 00420 #define MAKE_CASE(snsCod) case snsCod: senseCodeStr = #snsCod; break; 00421 00422 MAKE_CASE(SCSI_SENSE_NO_SENSE) 00423 MAKE_CASE(SCSI_SENSE_RECOVERED_ERROR) 00424 MAKE_CASE(SCSI_SENSE_NOT_READY) 00425 MAKE_CASE(SCSI_SENSE_MEDIUM_ERROR) 00426 MAKE_CASE(SCSI_SENSE_HARDWARE_ERROR) 00427 MAKE_CASE(SCSI_SENSE_ILLEGAL_REQUEST) 00428 MAKE_CASE(SCSI_SENSE_UNIT_ATTENTION) 00429 MAKE_CASE(SCSI_SENSE_DATA_PROTECT) 00430 MAKE_CASE(SCSI_SENSE_BLANK_CHECK) 00431 MAKE_CASE(SCSI_SENSE_UNIQUE) 00432 MAKE_CASE(SCSI_SENSE_COPY_ABORTED) 00433 MAKE_CASE(SCSI_SENSE_ABORTED_COMMAND) 00434 MAKE_CASE(SCSI_SENSE_EQUAL) 00435 MAKE_CASE(SCSI_SENSE_VOL_OVERFLOW) 00436 MAKE_CASE(SCSI_SENSE_MISCOMPARE) 00437 MAKE_CASE(SCSI_SENSE_RESERVED) 00438 } 00439 } 00440 00441 return senseCodeStr; 00442 } 00443 00444 00445 char *DbgGetAdditionalSenseCodeStr(PSCSI_REQUEST_BLOCK Srb) 00446 { 00447 char *adSenseCodeStr = "?"; 00448 00449 if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ 00450 PSENSE_DATA senseData; 00451 UCHAR adSenseCode; 00452 00453 ASSERT(Srb->SenseInfoBuffer); 00454 senseData = Srb->SenseInfoBuffer; 00455 adSenseCode = senseData->AdditionalSenseCode; 00456 00457 switch (adSenseCode){ 00458 00459 #undef MAKE_CASE 00460 #define MAKE_CASE(adSnsCod) case adSnsCod: adSenseCodeStr = #adSnsCod; break; 00461 00462 MAKE_CASE(SCSI_ADSENSE_NO_SENSE) 00463 MAKE_CASE(SCSI_ADSENSE_LUN_NOT_READY) 00464 MAKE_CASE(SCSI_ADSENSE_TRACK_ERROR) 00465 MAKE_CASE(SCSI_ADSENSE_SEEK_ERROR) 00466 MAKE_CASE(SCSI_ADSENSE_REC_DATA_NOECC) 00467 MAKE_CASE(SCSI_ADSENSE_REC_DATA_ECC) 00468 MAKE_CASE(SCSI_ADSENSE_ILLEGAL_COMMAND) 00469 MAKE_CASE(SCSI_ADSENSE_ILLEGAL_BLOCK) 00470 MAKE_CASE(SCSI_ADSENSE_INVALID_CDB) 00471 MAKE_CASE(SCSI_ADSENSE_INVALID_LUN) 00472 MAKE_CASE(SCSI_ADSENSE_WRITE_PROTECT) // aka SCSI_ADWRITE_PROTECT 00473 MAKE_CASE(SCSI_ADSENSE_MEDIUM_CHANGED) 00474 MAKE_CASE(SCSI_ADSENSE_BUS_RESET) 00475 MAKE_CASE(SCSI_ADSENSE_INVALID_MEDIA) 00476 MAKE_CASE(SCSI_ADSENSE_NO_MEDIA_IN_DEVICE) 00477 MAKE_CASE(SCSI_ADSENSE_POSITION_ERROR) 00478 MAKE_CASE(SCSI_ADSENSE_OPERATOR_REQUEST) 00479 MAKE_CASE(SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED) 00480 MAKE_CASE(SCSI_ADSENSE_COPY_PROTECTION_FAILURE) 00481 MAKE_CASE(SCSI_ADSENSE_VENDOR_UNIQUE) 00482 MAKE_CASE(SCSI_ADSENSE_MUSIC_AREA) 00483 MAKE_CASE(SCSI_ADSENSE_DATA_AREA) 00484 MAKE_CASE(SCSI_ADSENSE_VOLUME_OVERFLOW) 00485 } 00486 } 00487 00488 return adSenseCodeStr; 00489 } 00490 00491 00492 char *DbgGetAdditionalSenseCodeQualifierStr(PSCSI_REQUEST_BLOCK Srb) 00493 { 00494 char *adSenseCodeQualStr = "?"; 00495 00496 if (Srb->SrbStatus & SRB_STATUS_AUTOSENSE_VALID){ 00497 PSENSE_DATA senseData; 00498 UCHAR adSenseCode; 00499 UCHAR adSenseCodeQual; 00500 00501 ASSERT(Srb->SenseInfoBuffer); 00502 senseData = Srb->SenseInfoBuffer; 00503 adSenseCode = senseData->AdditionalSenseCode; 00504 adSenseCodeQual = senseData->AdditionalSenseCodeQualifier; 00505 00506 switch (adSenseCode){ 00507 00508 #undef MAKE_CASE 00509 #define MAKE_CASE(adSnsCodQual) case adSnsCodQual: adSenseCodeQualStr = #adSnsCodQual; break; 00510 00511 case SCSI_ADSENSE_LUN_NOT_READY: 00512 switch (adSenseCodeQual){ 00513 MAKE_CASE(SCSI_SENSEQ_CAUSE_NOT_REPORTABLE) 00514 MAKE_CASE(SCSI_SENSEQ_BECOMING_READY) 00515 MAKE_CASE(SCSI_SENSEQ_INIT_COMMAND_REQUIRED) 00516 MAKE_CASE(SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED) 00517 MAKE_CASE(SCSI_SENSEQ_FORMAT_IN_PROGRESS) 00518 MAKE_CASE(SCSI_SENSEQ_REBUILD_IN_PROGRESS) 00519 MAKE_CASE(SCSI_SENSEQ_RECALCULATION_IN_PROGRESS) 00520 MAKE_CASE(SCSI_SENSEQ_OPERATION_IN_PROGRESS) 00521 MAKE_CASE(SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS) 00522 } 00523 break; 00524 case SCSI_ADSENSE_NO_SENSE: 00525 switch (adSenseCodeQual){ 00526 MAKE_CASE(SCSI_SENSEQ_FILEMARK_DETECTED) 00527 MAKE_CASE(SCSI_SENSEQ_END_OF_MEDIA_DETECTED) 00528 MAKE_CASE(SCSI_SENSEQ_SETMARK_DETECTED) 00529 MAKE_CASE(SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED) 00530 } 00531 break; 00532 case SCSI_ADSENSE_ILLEGAL_BLOCK: 00533 switch (adSenseCodeQual){ 00534 MAKE_CASE(SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR) 00535 } 00536 break; 00537 case SCSI_ADSENSE_POSITION_ERROR: 00538 switch (adSenseCodeQual){ 00539 MAKE_CASE(SCSI_SENSEQ_DESTINATION_FULL) 00540 MAKE_CASE(SCSI_SENSEQ_SOURCE_EMPTY) 00541 } 00542 break; 00543 case SCSI_ADSENSE_INVALID_MEDIA: 00544 switch (adSenseCodeQual){ 00545 MAKE_CASE(SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED) 00546 MAKE_CASE(SCSI_SENSEQ_UNKNOWN_FORMAT) 00547 MAKE_CASE(SCSI_SENSEQ_INCOMPATIBLE_FORMAT) 00548 MAKE_CASE(SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED) 00549 } 00550 break; 00551 case SCSI_ADSENSE_OPERATOR_REQUEST: 00552 switch (adSenseCodeQual){ 00553 MAKE_CASE(SCSI_SENSEQ_STATE_CHANGE_INPUT) 00554 MAKE_CASE(SCSI_SENSEQ_MEDIUM_REMOVAL) 00555 MAKE_CASE(SCSI_SENSEQ_WRITE_PROTECT_ENABLE) 00556 MAKE_CASE(SCSI_SENSEQ_WRITE_PROTECT_DISABLE) 00557 } 00558 break; 00559 case SCSI_ADSENSE_COPY_PROTECTION_FAILURE: 00560 switch (adSenseCodeQual){ 00561 MAKE_CASE(SCSI_SENSEQ_AUTHENTICATION_FAILURE) 00562 MAKE_CASE(SCSI_SENSEQ_KEY_NOT_PRESENT) 00563 MAKE_CASE(SCSI_SENSEQ_KEY_NOT_ESTABLISHED) 00564 MAKE_CASE(SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION) 00565 MAKE_CASE(SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT) 00566 MAKE_CASE(SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR) 00567 } 00568 break; 00569 } 00570 } 00571 00572 return adSenseCodeQualStr; 00573 } 00574 00575 00576 /* 00577 * DbgCheckReturnedPkt 00578 * 00579 * Check a completed TRANSFER_PACKET for all sorts of error conditions 00580 * and warn/trap appropriately. 00581 */ 00582 VOID DbgCheckReturnedPkt(TRANSFER_PACKET *Pkt) 00583 { 00584 PCDB pCdb = (PCDB)Pkt->Srb.Cdb; 00585 00586 ASSERT(Pkt->Srb.OriginalRequest == Pkt->Irp); 00587 ASSERT(Pkt->Srb.DataBuffer == Pkt->BufPtrCopy); 00588 ASSERT(Pkt->Srb.DataTransferLength <= Pkt->BufLenCopy); 00589 ASSERT(!Pkt->Irp->CancelRoutine); 00590 00591 if (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_PENDING){ 00592 DBGERR(("SRB completed with status PENDING in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", 00593 Pkt, 00594 DBGGETSCSIOPSTR(&Pkt->Srb), 00595 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00596 (ULONG)Pkt->Srb.SrbStatus, 00597 Pkt->Irp->IoStatus.Status)); 00598 } 00599 else if (SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_SUCCESS){ 00600 /* 00601 * Make sure SRB and IRP status match. 00602 */ 00603 if (!NT_SUCCESS(Pkt->Irp->IoStatus.Status)){ 00604 DBGWARN(("SRB and IRP status don't match in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", 00605 Pkt, 00606 DBGGETSCSIOPSTR(&Pkt->Srb), 00607 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00608 (ULONG)Pkt->Srb.SrbStatus, 00609 Pkt->Irp->IoStatus.Status)); 00610 } 00611 00612 if (Pkt->Irp->IoStatus.Information != Pkt->Srb.DataTransferLength){ 00613 DBGERR(("SRB and IRP result transfer lengths don't match in succeeded packet %ph: (op=%s, SrbStatus=%s, Srb.DataTransferLength=%xh, Irp->IoStatus.Information=%xh).", 00614 Pkt, 00615 DBGGETSCSIOPSTR(&Pkt->Srb), 00616 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00617 Pkt->Srb.DataTransferLength, 00618 Pkt->Irp->IoStatus.Information)); 00619 } 00620 } 00621 else { 00622 if (NT_SUCCESS(Pkt->Irp->IoStatus.Status)){ 00623 DBGWARN(("SRB and IRP status don't match in packet %ph: (op=%s srbstat=%s(%xh), irpstat=%xh)", 00624 Pkt, 00625 DBGGETSCSIOPSTR(&Pkt->Srb), 00626 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00627 (ULONG)Pkt->Srb.SrbStatus, 00628 Pkt->Irp->IoStatus.Status)); 00629 } 00630 DBGTRACE(ClassDebugWarning, ("Packet %ph failed (op=%s srbstat=%s(%xh), irpstat=%xh, sense=%s/%s/%s)", 00631 Pkt, 00632 DBGGETSCSIOPSTR(&Pkt->Srb), 00633 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00634 (ULONG)Pkt->Srb.SrbStatus, 00635 Pkt->Irp->IoStatus.Status, 00636 DBGGETSENSECODESTR(&Pkt->Srb), 00637 DBGGETADSENSECODESTR(&Pkt->Srb), 00638 DBGGETADSENSEQUALIFIERSTR(&Pkt->Srb))); 00639 00640 /* 00641 * If the SRB failed with underrun or overrun, then the actual 00642 * transferred length should be returned in both SRB and IRP. 00643 * (SRB's only have an error status for overrun, so it's overloaded). 00644 */ 00645 if ((SRB_STATUS(Pkt->Srb.SrbStatus) == SRB_STATUS_DATA_OVERRUN) && 00646 (Pkt->Irp->IoStatus.Information != Pkt->Srb.DataTransferLength)){ 00647 DBGERR(("SRB and IRP result transfer lengths don't match in failed packet %ph: (op=%s, SrbStatus=%s, Srb.DataTransferLength=%xh, Irp->IoStatus.Information=%xh).", 00648 Pkt, 00649 DBGGETSCSIOPSTR(&Pkt->Srb), 00650 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00651 Pkt->Srb.DataTransferLength, 00652 Pkt->Irp->IoStatus.Information)); 00653 } 00654 } 00655 00656 00657 /* 00658 * Some miniport drivers have been caught changing the SCSI operation 00659 * code in the SRB. This is absolutely disallowed as it breaks our error handling. 00660 */ 00661 switch (pCdb->CDB10.OperationCode){ 00662 case SCSIOP_MEDIUM_REMOVAL: 00663 case SCSIOP_MODE_SENSE: 00664 case SCSIOP_READ_CAPACITY: 00665 case SCSIOP_READ: 00666 case SCSIOP_WRITE: 00667 case SCSIOP_START_STOP_UNIT: 00668 break; 00669 default: 00670 DBGERR(("Miniport illegally changed Srb.Cdb.OperationCode in packet %ph failed (op=%s srbstat=%s(%xh), irpstat=%xh, sense=%s/%s/%s)", 00671 Pkt, 00672 DBGGETSCSIOPSTR(&Pkt->Srb), 00673 DBGGETSRBSTATUSSTR(&Pkt->Srb), 00674 (ULONG)Pkt->Srb.SrbStatus, 00675 Pkt->Irp->IoStatus.Status, 00676 DBGGETSENSECODESTR(&Pkt->Srb), 00677 DBGGETADSENSECODESTR(&Pkt->Srb), 00678 DBGGETADSENSEQUALIFIERSTR(&Pkt->Srb))); 00679 break; 00680 } 00681 00682 } 00683 00684 #else 00685 00686 // We have to keep this in the retail build for legacy. 00687 VOID ClassDebugPrint(CLASS_DEBUG_LEVEL DebugPrintLevel, PCCHAR DebugMessage, ...) 00688 { 00689 DbgPrint("retail build\n"); 00690 } 00691 00692 #endif 00693 Generated on Sun May 27 2012 04:17:45 for ReactOS by
1.7.6.1
|