C 设置复杂马赫数消息头
我正在尝试设置一个mach消息,用于使用mach IPC发送一个线外字符串。但是,在尝试发送越界消息时,我收到一个C 设置复杂马赫数消息头,c,macos,ipc,mach,C,Macos,Ipc,Mach,我正在尝试设置一个mach消息,用于使用mach IPC发送一个线外字符串。但是,在尝试发送越界消息时,我收到一个(ipc/send)无效消息头错误 这是消息结构 struct ool_msg { mach_msg_header_t header; mach_msg_body_t body; mach_msg_ool_descriptor_t data; mach_msg_type_number_t count; }; 我正在这样设置标题。下面的变量msg是一个
(ipc/send)无效消息头
错误
这是消息结构
struct ool_msg
{
mach_msg_header_t header;
mach_msg_body_t body;
mach_msg_ool_descriptor_t data;
mach_msg_type_number_t count;
};
我正在这样设置标题。下面的变量msg
是一个struct ool\u msg
hdr = &(msg.header);
hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
hdr->msgh_size = sizeof(msg);
hdr->msgh_local_port = MACH_PORT_NULL;
hdr->msgh_remote_port = port;
这就是我设置马赫数信息其余部分的方式
msg.body.msgh_descriptor_count = 1;
msg.data.address = string;
msg.data.size = strlen(string) + 1;
msg.data.deallocate = FALSE;
msg.data.copy = MACH_MSG_VIRTUAL_COPY;
msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
msg.count = msg.data.size;
那么,如何正确设置OOL Mach IPC的消息头
编辑
这是一个重现我问题的程序
#include <stdio.h>
#include <mach/mach.h>
static char *string = "123456789";
struct ool_msg
{
mach_msg_header_t header;
mach_msg_body_t body;
mach_msg_ool_descriptor_t data;
mach_msg_type_number_t count;
};
int main(void)
{
kern_return_t err;
struct ool_msg msg;
mach_msg_header_t *hdr;
mach_port_t port = MACH_PORT_NULL;
err = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
if(err != KERN_SUCCESS)
{
mach_error("Can't allocate mach port\n", err);
return (-1);
}
err = mach_port_insert_right(mach_task_self(), port, port,
MACH_MSG_TYPE_MAKE_SEND);
if(err != KERN_SUCCESS)
{
mach_error("Can't insert port right\n", err);
return (-1);
}
hdr = &(msg.header);
hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
hdr->msgh_size = sizeof(msg);
hdr->msgh_local_port = MACH_PORT_NULL;
hdr->msgh_remote_port = port;
msg.body.msgh_descriptor_count = 1;
msg.data.address = string;
msg.data.size = strlen(string) + 1;
msg.data.deallocate = FALSE;
msg.data.copy = MACH_MSG_VIRTUAL_COPY;
msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
msg.count = msg.data.size;
err = mach_msg(hdr,
MACH_SEND_MSG,
hdr->msgh_size,
0,
MACH_PORT_NULL,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
if(err != KERN_SUCCESS)
{
mach_error("Can't send mach msg\n", err);
return (-1);
}
return (0);
}
#包括
#包括
静态字符*string=“123456789”;
结构工具
{
马赫数消息头;
机器本体;
马赫数工具描述符数据;
马赫数、信号类型、数量、计数;
};
内部主(空)
{
内核返回错误;
结构ool_msg msg;
马赫数消息头hdr;
马赫数端口=马赫数端口为空;
err=mach\u port\u allocate(mach\u task\u self(),mach\u port\u RIGHT\u RECEIVE,&port);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法分配马赫数端口”,错误);
返回(-1);
}
err=mach\u port\u insert\u right(mach\u task\u self(),port,port,
MACH_MSG_TYPE_MAKE_SEND);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法正确插入端口”,错误);
返回(-1);
}
hdr=&(消息头);
hdr->msgh\U位=马赫数msgh\U位\U本地(马赫数MSG\U类型\U复制\U发送);
hdr->msgh|U位|=马赫|msgh|U位|复合;
hdr->msgh_size=sizeof(msg);
hdr->msgh_本地_端口=马赫_端口_NULL;
hdr->msgh\U远程\U端口=端口;
msg.body.msgh_描述符_计数=1;
msg.data.address=字符串;
msg.data.size=strlen(字符串)+1;
msg.data.deallocate=FALSE;
msg.data.copy=马赫数msg虚拟拷贝;
msg.data.type=MACH\u msg\u OOL\u描述符;
msg.count=msg.data.size;
err=马赫数msg(hdr,
发送消息,
hdr->msgh\U尺寸,
0,
马赫数端口为空,
马赫数消息超时无,
马赫数(零端口);
if(err!=KERN_SUCCESS)
{
马赫数错误(“无法发送马赫数消息”,错误);
返回(-1);
}
返回(0);
}
作为状态:
MACH\u MSGH\u BITS\u REMOTE
和MACH\u MSGH\u BITS\u LOCAL
宏返回
给定msgh\u位
值,适当的mach\u msg\u type\u name\t值。这个
MACH\u MSGH\u位
宏为MSGH\u位
构造一个值,给定两个
mach\u msg\u type\u name\t
值
因此,在设置MACH\u MSGH\u头MSGH\u位时,需要使用MACH\u MSGH\u位
宏,而不是MACH\u MSGH\u位
宏。否则,您将其设置为mach\u msg\u type\u name\u t
,而不是您想要的msgh\u位
为了澄清这一点,您需要以下代码来获取msgh_位:
hdr->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND)
作为缔约国:
MACH\u MSGH\u BITS\u REMOTE
和MACH\u MSGH\u BITS\u LOCAL
宏返回
给定msgh\u位
值,适当的mach\u msg\u type\u name\t值。这个
MACH\u MSGH\u位
宏为MSGH\u位
构造一个值,给定两个
mach\u msg\u type\u name\t
值
因此,在设置MACH\u MSGH\u头MSGH\u位时,需要使用MACH\u MSGH\u位
宏,而不是MACH\u MSGH\u位
宏。否则,您将其设置为mach\u msg\u type\u name\u t
,而不是您想要的msgh\u位
为了澄清这一点,您需要以下代码来获取msgh_位:
hdr->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND)
你到底是如何发送字符串的?你能创建一个吗?@JoshdeKock我添加了一个例子。你到底是如何发送字符串的?你能创建一个新的吗?@JoshdeKock我添加了一个例子。