有关事件 ID 51 的信息

将信息写入物理磁盘时,可能会发生事件 ID 51。 本文介绍如何解码事件 ID 51 事件消息的数据部分。

原始 KB 编号: 244780

总结

将信息写入物理磁盘时,系统日志中可能会记录以下事件消息:

Event ID: 51  
Event Type: Warning  
Event Source: Disk  
Description: An error was detected on device \Device\Harddisk3\DR3 during a paging operation.  
Data:  
0000: 04 00 22 00 01 00 72 00  
0008: 00 00 00 00 33 00 04 80  
0010: 2d 01 00 00 00 00 00 00  
0018: 00 00 00 00 00 00 00 00  
0020: 00 52 ea 04 15 00 00 00  
0028: 01 00 00 00 04 00 00 00  
0030: 03 00 00 00 2a 00 00 00  
0038: 02 84 00 00 00 29 06 00  
0040: 2a 60 0a 82 75 29 00 00  
0048: 80 00

注意

说明中的设备以及特定的十六进制数据可能会有所不同。

详细信息

如果计算机向磁盘或从磁盘页信息时发生泛型错误,则会记录事件 ID 51 事件消息。 在分页操作中,操作系统将内存页从内存交换到磁盘,或从磁盘检索内存页到内存。 它是 Windows 内存管理的一部分。

但是,当计算机从存储设备加载图像、读取和写入本地映射文件或任何文件(只要已缓冲 I/O),计算机可能会记录此事件消息。 计算机在执行非缓冲区 I/O 时不会记录此事件消息。 可以对事件 ID 51 事件消息进行故障排除,就像对事件 ID 9 或事件 ID 11 事件消息进行故障排除。

在某些情况下,系统会记录以下事件 ID 51 事件消息:

An error was detected on device \Device\DeviceName during a paging operation

在这种情况下,没有任何有害影响。 例如,当插入 USB 设备时,空白媒体(如 CDR、CDRW、DVDR)插入可写驱动器时,将记录事件 ID 51。 系统记录事件,即使光盘是可写的,USB 设备仍然可用。 在这些特定情况下,可以安全地忽略日志条目。 无需执行任何操作。

注意

在 Windows XP 和 Windows Server 2003 上,由于事件日志条目的大小限制,DeviceName 可能会被截断。 因此,显示的硬盘编号或设备对象名称本身可能不正确。 由于数据节中存储了大量信息,因此可减少 DeviceName 可用的空间。 在这种情况下,可以通过查看存储在数据部分中的目标磁盘数据来查找相应的设备。 有关详细信息,请参阅 解码事件 ID 51 事件消息的数据部分。

在 Windows Vista 及更高版本上,事件日志条目大小已增加,并且 DeviceName 不会被截断。

可以使用与任何 DISK 错误(事件 ID 7、9、11、51 和其他事件 ID)关联的二进制数据,通过解码数据部分来帮助识别问题。

事件 ID 51 具有额外的命令描述符块(CDB)框。 查看事件 ID 51 事件消息的数据部分时,请考虑以下信息。

解码事件 ID 51 事件消息的数据部分

在“摘要”部分中解码示例的数据部分时,可以看到尝试从扇区0x2975820a开始对 LUN 3 执行写入操作,0x0080扇区失败,因为总线已重置,但请求将重试。 稍后,本文列出了解码此示例的具体步骤。

下表描述了每个偏移量表示的内容:

Offset 长度
0x00 1 操作类型:0x03 = 读取,0x04 = 写入,0x0F = IOCTL
0x01 1 剩余重试次数
0x02 2 转储数据大小0x0068
0x04 2 0x0001字符串数
0x06 2 偏移到设备名称
0x08 2 未使用
0x0a 2 填充字节
0x0c 4 NTSTATUS 错误代码
0x10 4 唯一错误值
0x14 4 NTSTATUS 最终状态0x00000000 = 将重试请求
0x18 4 序列号 - 未使用
0x1c 4 Io 控制代码(不适用于此事件)
0x20 8 字节偏移到坏扇区(如果有)
0x28 8 发生错误的时钟周期计数
0x30 4 端口号 - 未使用
0x34 1 错误标志
0x35 3 未使用
0x38 88 SCSI 请求块结构
0x90 18 感知数据结构

要解码的关键部分

下面是解码的关键部分。

错误代码

在“摘要”部分中的示例中,错误代码列在第二行中。 该行以 0008 开头: 并在行中包含最后 4 个字节。

0008: 00 00 00 00 33 00 04 80

ErrorCode = 0x80040033

此代码是错误 51 的代码。 对于所有事件 ID 51 事件消息,此代码相同:

IO_WARNING_PAGING_FAILURE

注意

将事件 ID 中的十六进制数据解释为状态代码时,请记住,这些值以小尾数格式表示。

最终状态代码

在“摘要”部分中的示例中,最终状态代码列在以 0010 开头的0x14(第三行)中:并包括此行中的最后四个八进制数。

0010:2d 01 00 00 00 00 00

FinalStatus = 0x00000000

它映射到 STATUS_SUCCESS 并暗示将重试请求。

注意

将事件 ID 中的十六进制数据解释为状态代码时,请记住,这些值以小尾数格式表示。

目标磁盘

可以使用此数据来帮助确定发生问题的磁盘:

0028: 01 00 00 00 04 00 00 00

路径 ID = 0x0000001,目标 ID = 0x0000004

0030:03 00 00 00 2a 00 00 00

LUN = 0x0000003

使用事件 ID 说明中列出到驱动器的符号链接来识别卷可能更容易。 例如,\Device\Harddisk3\DR3

注意

目标磁盘信息是它对操作系统的显示方式。 存储虚拟化和多路径 I/O 软件可能会屏蔽提供给操作系统的内容。 此信息可能与物理映射不直接对应。

SCSI 请求块 (SRB) 参数

在“摘要”部分中的示例中,ScsiStatus 是0x02(第 0038中的第一个字节),SrbStatus 是0x84(第 0038中的第二个字节)。 它提供以下信息:

0038: 02 84 00 00 00 29 06 00

0x02的 ScsiStatus:
SCSISTAT_CHECK_CONDITION

SCSI 状态代码:(来自 SCSI。H)

0x00 = SCSISTAT_GOOD
0x02 = SCSISTAT_CHECK_CONDITION
0x04 = SCSISTAT_CONDITION_MET
0x08 = SCSISTAT_BUSY
0x10 = SCSISTAT_INTERMEDIATE
0x14 = SCSISTAT_INTERMEDIATE_COND_MET
0x18 = SCSISTAT_RESERVATION_CONFLICT
0x22 = SCSISTAT_COMMAND_TERMINATED
0x28 = SCSISTAT_QUEUE_FULL

0x84的 SrbStatus:
SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_ERROR

0x00 = SRB_STATUS_PENDING
0x01 = SRB_STATUS_SUCCESS
0x02 = SRB_STATUS_ABORTED
0x03 = SRB_STATUS_ABORT_FAILED
0x04 = SRB_STATUS_ERROR
0x05 = SRB_STATUS_BUSY
0x06 = SRB_STATUS_INVALID_REQUEST
0x07 = SRB_STATUS_INVALID_PATH_ID
0x08 = SRB_STATUS_NO_DEVICE
0x09 = SRB_STATUS_TIMEOUT
0x0A = SRB_STATUS_SELECTION_TIMEOUT
0x0B = SRB_STATUS_COMMAND_TIMEOUT
0x0D = SRB_STATUS_MESSAGE_REJECTED
0x0E = SRB_STATUS_BUS_RESET
0x0F = SRB_STATUS_PARITY_ERROR
0x10 = SRB_STATUS_REQUEST_SENSE_FAILED
0x11 = SRB_STATUS_NO_HBA
0x12 = SRB_STATUS_DATA_OVERRUN
0x13 = SRB_STATUS_UNEXPECTED_BUS_FREE
0x14 = SRB_STATUS_PHASE_SEQUENCE_FAILURE
0x15 = SRB_STATUS_BAD_SRB_BLOCK_LENGTH
0x16 = SRB_STATUS_REQUEST_FLUSHED
0x20 = SRB_STATUS_INVALID_LUN
0x21 = SRB_STATUS_INVALID_TARGET_ID
0x22 = SRB_STATUS_BAD_FUNCTION
0x23 = SRB_STATUS_ERROR_RECOVERY
0x24 = SRB_STATUS_NOT_POWERED
0x30 = SRB_STATUS_INTERNAL_ERROR
(used by the port driver to indicate that a non-scsi-related error occurred)
0x38 - 0x3f = Srb status values reserved for internal port driver use.

SRB 状态掩码:

0x80 = SRB_STATUS_AUTOSENSE_VALID
0x40 = SRB_STATUS_QUEUE_FROZEN

必须分解 SRB 状态掩码,因为它们是子状态。 它们与 SRB 状态代码结合使用。

在前面的 0x84 示例中, 0x8_ 是状态掩码。 因此, SRB_STATUS_AUTOSENSE_VALID 0x04 是 SRB 状态代码。 这意味着 SRB_STATUS_ERROR

感知代码

如果 SRB 状态为自动感知有效,则感知代码提供更多信息。 在“摘要”部分中的示例中,感知代码0x06(第 0038中的第七个字节),其他感知代码0x29(第 0038的第六个八位字节)。 它提供以下信息:

0038: 02 84 00 00 00 29 06 00

0x06的感觉关键:

偏移量为 003e 的字节是感知键。 它映射到:

0x06 = SCSI_SENSE_UNIT_ATTENTION

感知代码:(来自 SCSI。H)

0x00 = SCSI_SENSE_NO_SENSE
0x01 = SCSI_SENSE_RECOVERED_ERROR
0x02 = SCSI_SENSE_NOT_READY
0x03 = SCSI_SENSE_MEDIUM_ERROR
0x04 = SCSI_SENSE_HARDWARE_ERROR
0x05 = SCSI_SENSE_ILLEGAL_REQUEST
0x06 = SCSI_SENSE_UNIT_ATTENTION
0x07 = SCSI_SENSE_DATA_PROTECT
0x08 = SCSI_SENSE_BLANK_CHECK
0x09 = SCSI_SENSE_UNIQUE
0x0A = SCSI_SENSE_COPY_ABORTED
0x0B = SCSI_SENSE_ABORTED_COMMAND
0x0C = SCSI_SENSE_EQUAL
0x0D = SCSI_SENSE_VOL_OVERFLOW
0x0E = SCSI_SENSE_MISCOMPARE
0x0F = SCSI_SENSE_RESERVED

0x29的其他感知代码(ASC):

ASC 位于第 0038 行的第六个字节中,偏移量为 003d,值为 29。 对于指定的感知键,它映射到:

0x29 = SCSI_ADSENSE_BUS_RESET

其他感知代码:(来自 SCSI。H)

0x00 = SCSI_ADSENSE_NO_SENSE
0x02 = SCSI_ADSENSE_NO_SEEK_COMPLETE
0x04 = SCSI_ADSENSE_LUN_NOT_READY
0x0C = SCSI_ADSENSE_WRITE_ERROR
0x14 = SCSI_ADSENSE_TRACK_ERROR
0x15 = SCSI_ADSENSE_SEEK_ERROR
0x17 = SCSI_ADSENSE_REC_DATA_NOECC
0x18 = SCSI_ADSENSE_REC_DATA_ECC
0x20 = SCSI_ADSENSE_ILLEGAL_COMMAND
0x21 = SCSI_ADSENSE_ILLEGAL_BLOCK
0x24 = SCSI_ADSENSE_INVALID_CDB
0x25 = SCSI_ADSENSE_INVALID_LUN
0x27 = SCSI_ADSENSE_WRITE_PROTECT
0x28 = SCSI_ADSENSE_MEDIUM_CHANGED
0x29 = SCSI_ADSENSE_BUS_RESET
0x2E = SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION
0x30 = SCSI_ADSENSE_INVALID_MEDIA
0x3a = SCSI_ADSENSE_NO_MEDIA_IN_DEVICE
0x3b = SCSI_ADSENSE_POSITION_ERROR
0x5a = SCSI_ADSENSE_OPERATOR_REQUEST
0x5d = SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED
0x64 = SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK
0x6f = SCSI_ADSENSE_COPY_PROTECTION_FAILURE
0x73 = SCSI_ADSENSE_POWER_CALIBRATION_ERROR
0x80 = SCSI_ADSENSE_VENDOR_UNIQUE
0xA0 = SCSI_ADSENSE_MUSIC_AREA
0xA1 = SCSI_ADSENSE_DATA_AREA
0xA7 = SCSI_ADSENSE_VOLUME_OVERFLOW

0x00的其他感知代码限定符(ASCQ):

ASCQ 位于偏移量为 003C 的第 0038 行的第五个字节中,值为 00 此示例中为 00 ,因此它不适用于指定的 ASC。 每个感知代码的 ASCQ 列表太大,无法包含在本文中。 查看 SCSI。有关详细信息,DDK 中的 H。

注意

0x80以上所有 ASC 和 ASCQ 值都是特定于供应商的,未记录在 SCSI 规范或 Microsoft DDK 中。 请参阅硬件供应商。

命令描述符块 (CDB) 参数

CDB 从偏移量 为 0040 的行开始:

0040:2a 60 0a 82 75 29 00 00
0048: 80 00

偏移量处的字节0x40表示 CDB 代码。 从偏移量0x43到0x46的字节表示起始扇区,将0x47偏移量0x49表示操作中涉及的扇区数。

注意

CDB 数据部分不采用小端格式。 因此,不应翻转字节。 解码此部分时请小心,因为格式与前面的部分不同。

0x2a = Write request
0x0a827529 = The starting sector
0x0080 = The number of sectors

SCSI CDB 代码:(来自 SCSI。H)

0x00 = SCSIOP_TEST_UNIT_READY
0x01 = SCSIOP_REZERO_UNIT
0x01 = SCSIOP_REWIND
0x02 = SCSIOP_REQUEST_BLOCK_ADDR
0x03 = SCSIOP_REQUEST_SENSE
0x04 = SCSIOP_FORMAT_UNIT
0x05 = SCSIOP_READ_BLOCK_LIMITS
0x07 = SCSIOP_REASSIGN_BLOCKS
0x07 = SCSIOP_INIT_ELEMENT_STATUS
0x08 = SCSIOP_READ6
0x08 = SCSIOP_RECEIVE
0x0A = SCSIOP_WRITE6
0x0A = SCSIOP_PRINT
0x0A = SCSIOP_SEND
0x0B = SCSIOP_SEEK6
0x0B = SCSIOP_TRACK_SELECT
0x0B = SCSIOP_SLEW_PRINT
0x0C = SCSIOP_SEEK_BLOCK
0x0D = SCSIOP_PARTITION
0x0F = SCSIOP_READ_REVERSE
0x10 = SCSIOP_WRITE_FILEMARKS
0x10 = SCSIOP_FLUSH_BUFFER
0x11 = SCSIOP_SPACE
0x12 = SCSIOP_INQUIRY
0x13 = SCSIOP_VERIFY6
0x14 = SCSIOP_RECOVER_BUF_DATA
0x15 = SCSIOP_MODE_SELECT
0x16 = SCSIOP_RESERVE_UNIT
0x17 = SCSIOP_RELEASE_UNIT
0x18 = SCSIOP_COPY
0x19 = SCSIOP_ERASE
0x1A = SCSIOP_MODE_SENSE
0x1B = SCSIOP_START_STOP_UNIT
0x1B = SCSIOP_STOP_PRINT
0x1B = SCSIOP_LOAD_UNLOAD
0x1C = SCSIOP_RECEIVE_DIAGNOSTIC
0x1D = SCSIOP_SEND_DIAGNOSTIC
0x1E = SCSIOP_MEDIUM_REMOVAL
0x23 = SCSIOP_READ_FORMATTED_CAPACITY
0x25 = SCSIOP_READ_CAPACITY
0x28 = SCSIOP_READ
0x2A = SCSIOP_WRITE
0x2B = SCSIOP_SEEK
0x2B = SCSIOP_LOCATE
0x2B = SCSIOP_POSITION_TO_ELEMENT
0x2E = SCSIOP_WRITE_VERIFY
0x2F = SCSIOP_VERIFY
0x30 = SCSIOP_SEARCH_DATA_HIGH
0x31 = SCSIOP_SEARCH_DATA_EQUAL
0x32 = SCSIOP_SEARCH_DATA_LOW
0x33 = SCSIOP_SET_LIMITS
0x34 = SCSIOP_READ_POSITION
0x35 = SCSIOP_SYNCHRONIZE_CACHE
0x39 = SCSIOP_COMPARE
0x3A = SCSIOP_COPY_COMPARE
0x3B = SCSIOP_WRITE_DATA_BUFF
0x3C = SCSIOP_READ_DATA_BUFF
0x40 = SCSIOP_CHANGE_DEFINITION
0x42 = SCSIOP_READ_SUB_CHANNEL
0x43 = SCSIOP_READ_TOC
0x44 = SCSIOP_READ_HEADER
0x45 = SCSIOP_PLAY_AUDIO
0x46 = SCSIOP_GET_CONFIGURATION
0x47 = SCSIOP_PLAY_AUDIO_MSF
0x48 = SCSIOP_PLAY_TRACK_INDEX
0x49 = SCSIOP_PLAY_TRACK_RELATIVE
0x4A = SCSIOP_GET_EVENT_STATUS
0x4B = SCSIOP_PAUSE_RESUME
0x4C = SCSIOP_LOG_SELECT
0x4D = SCSIOP_LOG_SENSE
0x4E = SCSIOP_STOP_PLAY_SCAN
0x51 = SCSIOP_READ_DISK_INFORMATION
0x52 = SCSIOP_READ_TRACK_INFORMATION
0x53 = SCSIOP_RESERVE_TRACK_RZONE
0x54 = SCSIOP_SEND_OPC_INFORMATION
0x55 = SCSIOP_MODE_SELECT10
0x5A = SCSIOP_MODE_SENSE10
0x5B = SCSIOP_CLOSE_TRACK_SESSION
0x5C = SCSIOP_READ_BUFFER_CAPACITY
0x5D = SCSIOP_SEND_CUE_SHEET
0x5E = SCSIOP_PERSISTENT_RESERVE_IN
0x5F = SCSIOP_PERSISTENT_RESERVE_OUT
0xA0 = SCSIOP_REPORT_LUNS
0xA1 = SCSIOP_BLANK
0xA3 = SCSIOP_SEND_KEY
0xA4 = SCSIOP_REPORT_KEY
0xA5 = SCSIOP_MOVE_MEDIUM
0xA6 = SCSIOP_LOAD_UNLOAD_SLOT
0xA6 = SCSIOP_EXCHANGE_MEDIUM
0xA7 = SCSIOP_SET_READ_AHEAD
0xAD = SCSIOP_READ_DVD_STRUCTURE
0xB5 = SCSIOP_REQUEST_VOL_ELEMENT
0xB6 = SCSIOP_SEND_VOLUME_TAG
0xB8 = SCSIOP_READ_ELEMENT_STATUS
0xB9 = SCSIOP_READ_CD_MSF
0xBA = SCSIOP_SCAN_CD
0xBB = SCSIOP_SET_CD_SPEED
0xBC = SCSIOP_PLAY_CD
0xBD = SCSIOP_MECHANISM_STATUS
0xBE = SCSIOP_READ_CD
0xBF = SCSIOP_SEND_DVD_STRUCTURE
0xE7 = SCSIOP_INIT_ELEMENT_RANGE