这个函数是我编译成DLL,给脚本用的,它创建一个rust线程用以监听通道,接收到数据后回调函数给脚本。 我测试它在32位64位都是正常的,但当我用64位程序给32位发送数据时,接收读取之类的pipe函数都正常,但回调函数call_back会造成32位接收方的崩溃,似乎因为接收64位的数据,有什么地方导致函数被破坏了一样。
请问这个问题如何解决?我熬了个通宵硬是没找到解决办法。。。
pub extern "C" fn pipe_new(ptr: *const i8, adr: usize, sz: usize) {
unsafe {
let name: Vec<u16> = format!(r"\\.\pipe\{}", CStr::from_ptr(ptr).to_str().unwrap()).as_str().encode_utf16().chain(Some(0)).collect();
std::thread::spawn(move || {
let call_back = transmute::<_, extern "C" fn()>(adr); //*mut c_void, *const u8, u32
let mut len = 0u32;
loop
{
let pipe = CreateNamedPipeW(name.as_ptr(), 3, 0, 255, 0, 0, 0, null_mut());
ConnectNamedPipe(pipe, null_mut());
let mut buf = vec![0u8; sz];
ReadFile(pipe, buf.as_mut_ptr() as *mut c_void, sz as u32, &mut len, null_mut());
call_back(); //pipe, buf.as_ptr(), len
CloseHandle(pipe);
}
});
}
}
1
共 3 条评论, 1 页
评论区
写评论有没有一个简单的可编译可运行重现的C和Rust代码啊。目前这个具体怎么调用的什么的还是很模糊。
--
👇
chaoxi24: 应该不是吧,我把与64进程相关的数据操作都删除了,仅仅是调用了回调,就崩溃了。
--
👇
johnmave126: 会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?
应该不是吧,我把与64进程相关的数据操作都删除了,仅仅是调用了回调,就崩溃了。
--
👇
johnmave126: 会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?
会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?