引导问题如何从反编译的原始字节正确解释此 WAVEFORMATEX?
在这个问题中,一条评论让我意识到
sizeof(WAVEFORMATEX)
不等于 18,Windows(似乎)是这么期望的。
但是,我没有指定 /Zp 或 /pack 开关,因此编译器应该使用默认对齐方式。 为什么我的系统报告
sizeof(WAVEFORMATEX) = 20
?
我在x86上。我的compile_commands.json 文件列出了以下内容:
{
"directory": "E:\\FOO",
"arguments": ["D:\\Programme\\Visual Studio 2022\\VC\\Tools\\MSVC\\14.40.33807\\bin\\HostX64\\x86\\cl.exe", "/c", "/nologo", "/Zi", "/FS", "/Fdbuild\\windows\\x86\\debug\\compile.foo.pdb", "/WX", "/Od", "/std:clatest", "/MTd", "/IFOO", "/DXAUDIO2_HELPER_FUNCTIONS", "/DWIN32_LEAN_AND_MEAN", "/DNOMINMAX", "/D_CRT_SECURE_NO_WARNINGS", "/DCOBJMACROS", "/DCINTERFACE", "/DDO_LOG", "/D_DEBUG", "/D_USE_MATH_DEFINES", "/IE:\\FOO\\build\\.packages\\z\\zlib\\v1.3.1\\55fd28c48bc34b35b89c569e2dd7bcce\\include", "/IE:\\FOO\\build\\.packages\\x\\xaudio2redist\\1.2.11\\163bc5c6e48e49d98ea66f724aede6bf\\include", "/Fobuild\\.objs\\foo\\windows\\x86\\debug\\FOO\\specific\\windows\\dxsound.c.obj", "FOO\\specific\\windows\\dxsound.c"],
"file": "FOO\\specific\\windows\\dxsound.c"
},
我正在针对 x86_x64 进行编译并使用 C11 标准。
typedef struct tWAVEFORMATEX {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
DWORD
成员需要4字节对齐。这意味着整个结构需要 4 字节对齐,因此 nSamplesPerSec
将位于两个 WORD
成员之后从开头偏移 4 字节的位置。
由于结构体成员的大小加起来为 18,因此必须在大小上额外添加 2 个字节以获得 4 字节对齐。