有关事件 ID 51 的信息

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

适用于:Windows 7 Service Pack 1,Windows Server 2012 R2
原始 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 = Read,0x04 = Write,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 中的十六进制数据解释为状态代码时,请记住,这些值以小 endian 格式表示。

最终状态代码

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

0010:2d 01 00 00 00 00 00

FinalStatus = 0x00000000

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

注意

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

目标磁盘

可以使用此数据来帮助确定问题发生在哪个磁盘上:

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 在第 0038) ( 第一个字节0x02,SrbStatus 在第 0038) 0x84 (秒字节。 它提供以下信息:

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 位于偏移量为 003d 的第 0038 行的第六个字节中,值为 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

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

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 数据部分不采用 little-endian 格式。 因此,不应翻转字节。 解码此部分时要小心,因为格式与以前的部分不同。

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