ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

debug.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.