调用GetBinaryTypeA时的Segfault

时间:2017-07-31 20:29:39

标签: winapi rust ffi

我尝试导入GetBinaryTypeA函数:

use std::ffi::CString;

use ::std::os::raw::{c_char, c_ulong};
extern { fn GetBinaryTypeA(s: *const c_char, out: *mut c_ulong) -> i32; }

fn main() {
    let path = "absolute/path/to/bin.exe";

    let cpath = CString::new(path).unwrap();
    let mut out: c_ulong = 0;

    println!("{:?}", cpath);
    unsafe { GetBinaryTypeA(cpath.as_ptr(), out as *mut c_ulong); }
    println!("{:?}", cpath);
}

输出:

error: process didn't exit successfully: `target\debug\bin_deploy.exe` (exit code: 3221225477)
Process finished with exit code -1073741819 (0xC0000005)

如果我设置了无效路径,那么它会成功执行,而GetLastError()会返回2("系统找不到指定的文件"),所以它看起来像导入的函数有效。

我使用kernel32-sys crate收到了同样的错误。还有哪处可以出错?

1 个答案:

答案 0 :(得分:2)

您正在将值0转换为指针。在当今使用的绝大多数计算机上,值为0的指针称为NULL。因此,您试图写入NULL指针,这会导致崩溃。

您想要写入值的地址:

&mut out as *mut c_ulong

哪个甚至不需要演员:

unsafe {
    GetBinaryTypeA(cpath.as_ptr(), &mut out);
}