gpt4 book ai didi

kernel-extension - 内核通讯

转载 作者:行者123 更新时间:2023-12-04 07:27:13 25 4
gpt4 key购买 nike

我想向内核空间发送一个数据数组,(我在我的kext中使用了回调函数)问题是当我使用 send 函数时,我看到一些奇怪的东西,我在 2 个场景中解释过:1)...char f[]={'1','2','3','4','5','6'};发送( socks ,f,sizeof(f),0);好吧,当我打印我在 kext 中收到的内容时:123456

2)...//我将 f[2] 替换为 0

char f[]={'1','2',0,'4','5','6'};发送 (sock,f,sizeof(f),0);

但是这一次,当我打印我在 kext 中收到的内容时:120000

似乎发送函数在第一个 0 字节之后的每个字节都置零?到底是怎么回事?这是发送功能错误吗?我使用 xcode 4.1,我的操作系统是 lion这是用户空间部分:

int main(int argc, char* const*argv)
{
struct ctl_info ctl_info;
struct sockaddr_ctl sc;
char str[MAX_STRING_LEN];
int sock = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
if (sock < 0)
return -1;
bzero(&ctl_info, sizeof(struct ctl_info));
strcpy(ctl_info.ctl_name, "pana.ifmonitor.nke.foo");
if (ioctl(sock, CTLIOCGINFO, &ctl_info) == -1)
return -1;
bzero(&sc, sizeof(struct sockaddr_ctl));
sc.sc_len = sizeof(struct sockaddr_ctl);
sc.sc_family = AF_SYSTEM;
sc.ss_sysaddr = SYSPROTO_CONTROL;
sc.sc_id = ctl_info.ctl_id;
sc.sc_unit = 0;
if (connect(sock, (struct sockaddr *)&sc, sizeof(struct sockaddr_ctl)))
return -1;


unsigned char data_send[]={'a','l','i','0','1','2','4','l','i',0,'1','2','4','l','i','0','1'};


size_t data_recive;
int j=0;
char data_rcv[8192];


send( sock, data_send, 17*sizeof(char), 10 );


printf("\n");
sleep(1);


close(sock);
return 0;

}

这是内核空间代码的一部分,负责获取用户空间数据:

errno_t EPHandleWrite(kern_ctl_ref ctlref, unsigned int unit, void *userdata,mbuf_t m, int flags)
{

printf("\n EPHandleWrite called---------------------- \n");
//char data_rec[50];

//unsigned char *ptr = (unsigned char*)mbuf_data(m);
//char ch;
//mbuf_copydata(m, 0, 50, data_rec);

//strncpy(&ch, ptr, 1 );


size_t data_lenght;
data_lenght = mbuf_pkthdr_len(m);

char data_receive[data_lenght];
strncpy( data_receive, ( char * ) mbuf_data(m) , data_lenght );

printf("data recied %lu\n",data_lenght);

for(int i=0;i<data_lenght;++i)
{
printf("%X ",data_receive[i]);
}
return 0
}

好吧,它在控制台打印:61 6C 69 30 31 32 34 6C 69 0 0 0 0 0 0 0 0当我更改发送数据到:{'a','l','i','0','1','2','4','l','i',**'0'**,'1 ','2','4','l','i','0','1'};我是对的,事实上我在发送数据的第一个零字节后得到全 0

最佳答案

问题出在 strncpy 行 - 如果您查看 strncpy 的文档,您会注意到它只会复制直到达到 0 字节,所以它是只适合处理 C 字符串。如果需要复制任意二进制数据,请使用 memcpy。

关于kernel-extension - 内核通讯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11969961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com