< 返回版块

chaoxi24 发表于 2021-04-28 03:42

这个函数是我编译成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);
			}
			
		});
	}
}


评论区

写评论
johnmave126 2021-04-30 11:34

有没有一个简单的可编译可运行重现的C和Rust代码啊。目前这个具体怎么调用的什么的还是很模糊。

--
👇
chaoxi24: 应该不是吧,我把与64进程相关的数据操作都删除了,仅仅是调用了回调,就崩溃了。

pub extern "C" fn pipe_new(ptr: *const i8, adr: usize, sz: usize) {
	call_back(); //在这调用是正常的
	std::thread::spawn(move || {
		loop
		{
			ConnectNamedPipe(pipe, null_mut());
			call_back(); // 在这调用就崩溃
		}
		
	});
}


--
👇
johnmave126: 会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?

作者 chaoxi24 2021-04-28 10:28

应该不是吧,我把与64进程相关的数据操作都删除了,仅仅是调用了回调,就崩溃了。

pub extern "C" fn pipe_new(ptr: *const i8, adr: usize, sz: usize) {
	call_back(); //在这调用是正常的
	std::thread::spawn(move || {
		loop
		{
			ConnectNamedPipe(pipe, null_mut());
			call_back(); // 在这调用就崩溃
		}
		
	});
}


--
👇
johnmave126: 会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?

johnmave126 2021-04-28 08:48

会是因为32/64位的usize和指针大小不一样,导致压栈然后call的时候32位程序读出了错误的参数吗?

1 共 3 条评论, 1 页