У меня есть адрес памяти начала ряда структур, но мне нужно исключить некоторые из моего вывода. Я думаю, что пространство памяти будет выглядеть примерно так:
+------------------+------------------+------------------+
| struct | struct | struct |
| linux_dirent64{ | linux_dirent64{ | linux_dirent64{ |
| first} | second} | third} |
+------------------+------------------+------------------+
|*p|-------------->| |
Поскольку я перебираю каждую структуру и возвращаю в нее некоторые данные, я могу пропустить одну из них. Будет ли перезапись первой части структуры указателем на следующую, дать мне результат, который мне нужен? Если да, то как мне это сделать? И если нет, то как мне подойти к этому?
Я знаю, что было бы более простое решение, если бы я изменил структуру, включив в нее то, что мне нужно, но, к сожалению, это не вариант, поскольку он является частью ядра Linux.
Спасибо за любые ответы.
РЕДАКТИРОВАТЬ: Поскольку все заинтересованы, я фильтрую структуры на основе имени файла. В данный момент я буквально перезаписываю часть d_name буквой O, чтобы она не возвращалась системным вызовом. Однако это вызывает различные проблемы в зависимости от того, какое приложение выдает системный вызов, поэтому мне нужен более тщательный способ избавиться от экземпляра структуры.
С тех пор я придумал следующее, однако ядро убивает его, если тест d_name возвращает true.
while(pos < length){
printk("d_name = %s\t| pos = %i\t| d_reclen = %i\t| st = %i|\n", dirent->d_name, pos, dirent->d_reclen, st);
if((st = strcmp(dirent->d_name, "testFile")) == 0){
printk("Out of context file %s\n", dirent->d_name);
posOverwrite = pos;
size = dirent->d_reclen;
while(posOverwrite < length){
struct linux_dirent64 *next = (struct linux_dirent64 *)(pos + dirent->d_reclen);
memcpy(dirent, next, sizeof(next));
dirent = next;
next = next + next->d_reclen;
}
dirent = (struct linux_dirent64 *) pos;
continue;
}
pos = pos + dirent->d_reclen; //Push our position along according to the size of the dirent
dirent = (struct linux_dirent64 *) (p+pos); //point our dirent to the next calculated system dirent
}
В конце концов я решил эту проблему, создав новый буфер памяти и скопировав все необходимые мне структуры в новый буфер, исключив все, что я не сделал, основываясь на тесте d_name. После того, как я просмотрел весь список, я запомнил весь новый список. Спасибо за помощь, ребята:)