为什么从winapi复制到我的代码中的结构定义没有相同的行为?

为什么从winapi复制到我的代码中的结构定义没有相同的行为?,winapi,rust,Winapi,Rust,我正在尝试使用winapi板条箱中的读取模块的IMAGE\u DOS\u头 这是我的工作代码: let mut IDH: IMAGE_DOS_HEADER = uninitialized(); copy_nonoverlapping(library, (&mut IDH as *mut IMAGE_DOS_HEADER) as *mut c_void, size_of::<IMAGE_DOS_HEADER>()); 当我这样做时,结构的所有字段都会得到奇怪的值,例如:e_m

我正在尝试使用winapi板条箱中的读取模块的IMAGE\u DOS\u头

这是我的工作代码:

let mut IDH: IMAGE_DOS_HEADER = uninitialized();
copy_nonoverlapping(library, (&mut IDH as *mut IMAGE_DOS_HEADER) as *mut c_void, size_of::<IMAGE_DOS_HEADER>());
当我这样做时,结构的所有字段都会得到奇怪的值,例如:e_magic=0x3

我决定在这两种情况下都将结构转换为数组,即使它们在编程上完全相同

println!("{:?}", std::mem::transmute::<IMAGE_DOS_HEADER, [u8;0x40]>(IDH).to_vec());
真奇怪。它们字段的值之间不应该有任何差异。然后我复制打印的数组并将其转换为我的结构,然后查看所有字段是否都正常

let dos: [u8;0x40] = [77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0];
println!("{}", std::mem::transmute::<[u8;0x40], _IMAGE_DOS_HEADER>(dos).e_magic);
第一个字段等于3。我有两个结构,具有相同的字段和我验证过的完全相同的大小,我取一个数组,将它转换为这些结构,得到不同的字段

正如你所看到的,数组转储中有一个3,但它不应该与结构e_magic的第一个字段相关联,这毫无意义,为什么它会与另一个字段一起工作

我想我在初始化结构时遗漏了一些东西,但是什么呢?

您没有复制相同的定义,而是复制了文档中显示的零件。这是被截断的:

值得注意的是,它使用了,它定义了一些特征,但更重要的是将类型标记为reprC:

Rust结构的布局没有指定,因此与C结构相比,您的结构有一些其他的排序和填充,因此将无法工作

我意识到winapi太大了,我希望我的二进制文件小于1兆字节,所以我自己声明了IMAGE_DOS_头结构

这是不正确的推理。库中未使用的代码将从最终二进制文件中删除

另见:

您没有复制相同的定义,而是复制了文档中显示的零件。这是被截断的:

值得注意的是,它使用了,它定义了一些特征,但更重要的是将类型标记为reprC:

Rust结构的布局没有指定,因此与C结构相比,您的结构有一些其他的排序和填充,因此将无法工作

我意识到winapi太大了,我希望我的二进制文件小于1兆字节,所以我自己声明了IMAGE_DOS_头结构

这是不正确的推理。库中未使用的代码将从最终二进制文件中删除

另见:


我认为这是因为winapi,但这是因为我忘了删除一个巨大的缓冲区。谢谢,它现在可以正常工作了。我认为这是因为winapi,但这是因为我忘了删除一个巨大的缓冲区。谢谢,现在很好用。
let dos: [u8;0x40] = [77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, 0];
println!("{}", std::mem::transmute::<[u8;0x40], _IMAGE_DOS_HEADER>(dos).e_magic);
STRUCT!{struct IMAGE_DOS_HEADER {
    e_magic: WORD,
    e_cblp: WORD,
    // ...
    e_res2: [WORD; 10],
    e_lfanew: LONG,
}}
#[repr(C)] #[derive(Copy)] $(#[$attrs])*
pub struct $name {
    $(pub $field: $ftype,)+
}