sizeof(CharBuffer) / sizeof(CharBuffer[0])
没有。这只是sizeof(char*)/sizeof(char)
。
sizeof(Argz) / sizeof(Argz[0])
没有。这正好等于sizeof(char**)/sizeof(char*)
。
sizeof
不会让你知道数组中元素的数量。sizeof
返回基础类型的大小。
要获取字符串的长度(即找到终止零字符之前的字符数),请使用strlen
. strlen
返回size_t
类型,sizeof
.
argv
数组以标记值 NULL
结尾。要打印char **argv
数组的内容,请迭代直到找到空值:
for (char *i = argv; *i != NULL; ++i) {
printf("%s\n", *i);
}
或者:
for (size_t i = 0; argv[i] != NULL; ++i) {
printf("%s\n", argv[i]);
}
char CharBuffer [255] = {'\0'}; &字符缓冲区
虽然等于值,&CharBuffer
但不是char*
类型。&CharBuffer
具有类型char (*)[255]
- 它是一个指向 255 个字符的数组的指针。启用编译器警告并解决它们 - 在内核中不要犯错误。只需使用CharBuffer
which 转换为char*
type in strcpy
-likeish 函数。
你似乎有点想要:
char char_buffer[255] = {0};
// Note: Do not name variables similar, especially globals.
// The argc <-> argz <-> argv differ only in one char.
// and 2d array to hold arguments strings
char argz[255][255] = {0};
// the count of arguments
size_t argc = 0;
asmlinkage int (*origional_execve)(const char *filename, char *const argv[], char *const envp[]);
asmlinkage int HookExecve(const char *filename, char *const argv[], char *const envp[]) {
if (strlen_user(filename) + 1 > sizeof(char_buffer)) {
// TODO: no memory for filename
return -1;
}
copy_from_user(char_buffer, filename, strlen_user(filename) + 1);
size_t i = 0;
for (i = 0; argv[i] != 0; ++i) {
// note: argz has type `char (*)[255][255]`
// so: sizeof(argz) = 255 * 255 * sizeof(char)
// *argz has type `char (*)[255]`
// so: sizeof(*argz) = 255 * 255 * sizeof(char)
// so: sizeof(argz)/sizeof(*argz) = 255
// This would NOT work if `argz` would be a `char**`...
// if (i > sizeof(argz)/sizeof(*argz)) {
// but there is ARRAY_SIZE macro that does the same
if (i > ARRAY_SIZE(argz)) {
// TODO: not enough indexes
return -1;
}
// sizeof(argz[i]) = sizeof(char(*)[255]) =
// = 255 * sizeof(char) = 255
if (strlen_user(argv[i]) + 1 > sizeof(argz[i])) {
// TODO: no memory to copy
return -1;
}
copy_from_user(argz[i], argv[i], strlen_user(argv[i]) + 1);
}
argc = i;
printk( KERN_INFO "Executable Name %s \n", char_buffer);
for (size_t i = 0; i < argc; ++i) {
printk( KERN_INFO "arg[i] = %s\n", argz[i]);
}
return (*origional_execve)(filename, argv, envp);
}
我没有测试代码,很可能它包含许多错误。更好地处理错误并仅使用动态分配并处理分配错误也会更好。