有关事件 ID 51 的信息

本文介绍有关在将信息写入物理磁盘时发生的事件 ID 51 的信息,以及如何解码事件 ID 51 事件消息中的数据部分。

原始产品版本:   Windows 7 Service Pack 1、Windows Server 2012 R2
原始 KB 数:   244780

摘要

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

事件 ID:51
事件类型:警告
事件源:磁盘
说明:在分页操作过程中,在设备 \Device\Harddisk3\DR3 上检测到错误。
数据
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) ,计算机就可以在将图像从存储设备、读取和写入加载到本地映射的文件或任何文件 (时记录此事件消息。 计算机在执行 nonbuffered i/o 时不记录此事件消息。 您可以对事件 ID 51 事件消息进行故障排除,就像对事件 ID 9 或事件 ID 11 事件消息进行故障排除一样。

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

在分页操作过程中,在设备 \Device\DeviceName 上检测到错误

在这种情况下,不会遇到任何有害影响。 例如,当插入一个 USB 设备时,会在一个可写驱动器中插入一个空介质(如 CDR、CDRW、DVDR 等),并记录事件 ID 51。 即使光盘可写且 USB 设备仍可用,系统也会记录该事件。 在这些特定情况下,您可以安全地忽略日志条目,无需执行任何其他操作。

备注

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

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

您可以使用与任何磁盘错误关联的二进制数据, (事件 ID 7、9、11、51和其他事件 Id) ,以帮助您通过对 data 节进行解码来确定问题。

由于事件 ID 51 具有一个额外的命令描述符块 (CDB) 框中,当您查看事件 ID 51 事件消息的数据部分时,必须考虑以下信息。

对事件 ID 为51的事件消息的数据节进行解码

解码 " 摘要 " 部分的示例中的 "数据" 部分时,您会看到尝试对0x0080 扇区启动的 LUN 3 执行写入操作失败,因为该总线已重置但请求将重试。 本文稍后将列出对此示例进行解码的具体步骤。

下表描述了每个偏移量表示的含义。

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

要解码的关键部分

下面是要进行解码的关键部分。

错误代码

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

0008: 00 00 00 00 33 00 04 80

ErrorCode = 0x80040033

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

IO_WARNING_PAGING_FAILURE

备注

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

最终状态代码

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

0010: 2d 01 00 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 在第 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) 中的第七个字节,另一个感知代码是 (0x290038 行中的第6个八位字节) 。 这将提供以下信息:

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) (其他感知代码:

其他检测代码位于第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) :

其他检测代码限定符位于第 0038 行的第五个字节中偏移量003C,值为 00。 在此示例中,它是 00 ,因此它不适用于指定的 ASC。 每个感知代码的其他感知代码限定符列表太大,无法包括在本文中。 查看 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 data 部分未采用小端格式,因此不应翻转字节。 对此分区进行解码时要小心,因为其格式与前面的节不同。

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