为什么 sizeof(IO_ERROR_LOG_PACKET) == 48 而不是 44?
Why is sizeof(IO_ERROR_LOG_PACKET) == 48 and not 44?
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; offset: 0 byte, size: 1 byte
UCHAR RetryCount ; offset: 1 byte, size: 1 byte
USHORT DumpDataSize ; offset: 2 byte, size: 2 byte
USHORT NumberOfStrings ; offset: 4 byte, size: 2 byte
USHORT StringOffset ; offset: 6 byte, size: 2 byte
USHORT EventCategory ; offset: 8 byte, size: 2 byte + 2 byte for alignment
NTSTATUS ErrorCode ; offset: 12 byte, size: 4 byte
ULONG UniqueErrorValue ; offset: 16 byte, size: 4 byte
NTSTATUS FinalStatus ; offset: 20 byte, size: 4 byte
ULONG SequenceNumber ; offset: 24 byte, size: 4 byte
ULONG IoControlCode ; offset: 28 byte, size: 4 byte
LARGE_INTEGER DeviceOffset; offset: 32 byte, size: 8 byte
ULONG DumpData[1] ; offset: 40 byte, size: 4 byte
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 44 byte
我预计 sizeof(IO_ERROR_LOG_PACKET)
为 44 字节。但是我反汇编的时候,竟然是48字节。有人知道为什么吗?
LARGE_INTEGER
需要对齐到 8 字节边界。成员在结构内对齐是不够的,而且结构要对齐到 8 字节。为此,结构被填充到 8 字节(否则你会对这种结构的数组产生问题):
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; 1 byte
UCHAR RetryCount ; 1 byte
USHORT DumpDataSize ; 2 byte
USHORT NumberOfStrings ; 2 byte
USHORT StringOffset ; 2 byte
USHORT EventCategory ; 2 byte + 2 byte for alignment
NTSTATUS ErrorCode ; 4 byte
ULONG UniqueErrorValue ; 4 byte
NTSTATUS FinalStatus ; 4 byte
ULONG SequenceNumber ; 4 byte
ULONG IoControlCode ; 4 byte
LARGE_INTEGER DeviceOffset; 8 byte
ULONG DumpData[1] ; 4 byte + 4 byte for alignment
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 48 byte
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; offset: 0 byte, size: 1 byte
UCHAR RetryCount ; offset: 1 byte, size: 1 byte
USHORT DumpDataSize ; offset: 2 byte, size: 2 byte
USHORT NumberOfStrings ; offset: 4 byte, size: 2 byte
USHORT StringOffset ; offset: 6 byte, size: 2 byte
USHORT EventCategory ; offset: 8 byte, size: 2 byte + 2 byte for alignment
NTSTATUS ErrorCode ; offset: 12 byte, size: 4 byte
ULONG UniqueErrorValue ; offset: 16 byte, size: 4 byte
NTSTATUS FinalStatus ; offset: 20 byte, size: 4 byte
ULONG SequenceNumber ; offset: 24 byte, size: 4 byte
ULONG IoControlCode ; offset: 28 byte, size: 4 byte
LARGE_INTEGER DeviceOffset; offset: 32 byte, size: 8 byte
ULONG DumpData[1] ; offset: 40 byte, size: 4 byte
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 44 byte
我预计 sizeof(IO_ERROR_LOG_PACKET)
为 44 字节。但是我反汇编的时候,竟然是48字节。有人知道为什么吗?
LARGE_INTEGER
需要对齐到 8 字节边界。成员在结构内对齐是不够的,而且结构要对齐到 8 字节。为此,结构被填充到 8 字节(否则你会对这种结构的数组产生问题):
typedef struct _IO_ERROR_LOG_PACKET {
UCHAR MajorFunctionCode; 1 byte
UCHAR RetryCount ; 1 byte
USHORT DumpDataSize ; 2 byte
USHORT NumberOfStrings ; 2 byte
USHORT StringOffset ; 2 byte
USHORT EventCategory ; 2 byte + 2 byte for alignment
NTSTATUS ErrorCode ; 4 byte
ULONG UniqueErrorValue ; 4 byte
NTSTATUS FinalStatus ; 4 byte
ULONG SequenceNumber ; 4 byte
ULONG IoControlCode ; 4 byte
LARGE_INTEGER DeviceOffset; 8 byte
ULONG DumpData[1] ; 4 byte + 4 byte for alignment
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
; total = 48 byte