LINUX.ORG.RU

Всё ли нормально в символьном устройстве?

 , ,


2

5

Вот код. При открытии устройства драйвер получает список процессов. При чтении с устройства в пользовательский буфер копируется часть данных, но я ещё не уверен, использовал *pos для указания откуда начать копировать данные, если их будет очень много, но наверное можно было бы и обойтись и без них.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/sched.h>
#include <linux/string.h>
MODULE_LICENSE("Dual BSD/GPL");

dev_t dev;
int lock;
unsigned baseminor = 0;
unsigned count = 1;
unsigned scull_major = 0;
char *name = "scull";
struct scull_dev {
	int quantum;
	int qset;
	unsigned long size;
	unsigned int access_key;
	struct semaphore sem;
struct cdev cdev;
};
struct scull_dev *sdev;
char *data;

loff_t scull_llseek ( struct file *file, loff_t pos, int n )
{
}
ssize_t scull_read ( struct file *file, char __user *buf, size_t count, loff_t *pos)
{
	char *p;
	p = data;
	p += *pos;

	int len = strlen ( p );

	len = len > 4096 ? count : len;

	memset ( buf, 0, sizeof buf );
	
	copy_to_user ( buf, p, len ); 

	*pos += len;

	return len;
}
ssize_t scull_write ( struct file *file, const char __user *buf, size_t n, loff_t *lt )
{

}
int scull_open ( struct inode *inode, struct file *filp )
{
	if ( lock ) while ( lock ){};
	lock = 1;
	struct scull_dev *scdev;
	struct task_struct *task;

	scdev = container_of ( inode->i_cdev, struct scull_dev, cdev );
	filp->private_data = scdev;

	data = kmalloc ( 16386, GFP_USER );
	char *p, *h;
	p = data;
	int len = 0;

	for_each_process(task) 
	{
		h = &task->comm[0];
		for ( ; *h != 0 && len < 16384; p++, h++, len++ ) *p = *h;
		*p = 32;
		p++;
		len++;
		if ( len > 16384 ) break;
		printk ( "%s\n", task->comm );
	}
	*p = 0;

	return 0;
}
int scull_release ( struct inode *inode, struct file *file )
{
	kfree ( data );
	lock = 0;
	return 0;
}

struct file_operations scull = {
	.owner = THIS_MODULE,
	.llseek = scull_llseek,
	.read = scull_read,
	.write = scull_write,
	.open = scull_open,
	.release = scull_release
};

static int hello_init ( void )
{
	sdev = kmalloc ( sizeof ( struct scull_dev ), GFP_KERNEL );
	int err;
	int result = alloc_chrdev_region ( &dev, baseminor, count, name );
	scull_major = MAJOR(dev);
	cdev_init ( &sdev->cdev, &scull );
	sdev->cdev.owner = THIS_MODULE;
	sdev->cdev.ops = &scull;
	err = cdev_add ( &sdev->cdev, dev, 1 );
	if ( err )
		printk (KERN_NOTICE "Error %d adding scull%d", err, 0 );
	
}

static void hello_exit ( void )
{
	cdev_del ( &sdev->cdev );
	kfree ( sdev );
	unregister_chrdev_region ( dev, count );
}

module_init ( hello_init );
module_exit ( hello_exit );

Ответ на: комментарий от SZT

От вас толку короче мало. Посмотрел твои созданные темы на форуме, они оказались ещё тупее чем мои, так что не надо брызгать слюнями и пытаться обьяснить от чего вопросы могут появляться.

чтобы плодить кучу тупых тем на ЛОРе с одинаково тупыми детскими ошибками в коде, надеясь что кто-то бесплатно будет разгребать твой говнокод

Ну а что ты хотел? Это ведь форум. Если ты не можешь применить свои способности по этой теме, то о чём вообще разговор, конечно же не по теме. Нравиться пообсуждать у кого какой код, идите с бабушками на скамейке обсуждать, а тут ведётся точная тема, в которой нужны новые сверх ответы. Ну вот например, ты пишешь код, ( надеюсь не глядя на клавиатуру ), за сколько ты можешь функцию написать? Я вот думаю при большом желании ты бы мог мне помочь, и показать как на твой взгляд может выглядеть символьный драйвер, а от нежелания помогать возникают только советы. Показал бы класс, чтоб я понел.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

От вас толку короче мало. Посмотрел твои созданные темы на форуме, они оказались ещё тупее чем мои

Ах, ну ты прямо оскорбил меня до глубины души. Пойду повешусь.

Я между прочим программированием зарабатываю деньги, а ты?

SZT ★★★★★
()
Ответ на: комментарий от SZT

Я нет. Но зарабатывать своим любимым делом это хорошо. Но знайте, вам когда то тоже помогали невзирая на ваши знания. А теперь когда вы знаете всё это, ленитесь помогать. Сами выбираете системы с исходными кодами чтобы можно было всё увидеть, а сами ни строчки кода не можете предоставить. Наверное ты скажешь, «А что, зачем плодить такой простой код, ведь я могу делами полезнее заниматься».

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Во-первых я вообще-то занимался репетиторством и обучал людей именно конкретно языку Си. Во-вторых, когда мои познания Си были на уровне твоих, я не лез спамить на ЛОР, а просто брал книгу K&R и решал задачи оттуда, что я и тебе уже в который раз настоятельно советую сделать. Если тебя такой вариант не устраивает по каким-либо причинам, можешь взять другую книжку или же найти человека, который бы за деньги или бесплатно стал бы с тобой заниматься. Но начинать с написания ядерных модулей точно не стоит

SZT ★★★★★
()
Ответ на: комментарий от SZT

Почему не стоит? Ничего не случиться. Я даже как то встраивал системную функцию, правда только через ассемблер смог её выполнить.

Во-вторых, когда мои познания Си были на уровне твоих, я не лез спамить на ЛОР, а просто брал книгу K&R и решал задачи оттуда, что я и тебе уже в который раз настоятельно советую сделать.

Пока ты читаешь k&r, я уже с ядром знакомлюсь. Так что, молодец. Хорошо что ты книжку выбрал. Но я её читал, а задания не интересные были, я их не выполнял, но язык понел.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от post-factum

Что ты прикалываешься? Значил линукс бесплатно, открытый код пожалуйста. А как сам написать, так за деньги сразу. Я имел ввиду за какое время можешь написать функцию?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

А что не так? Время - деньги.

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

А что тебе не нравится все хорошо. Ты заплатил за работу - он выполнил, код выложили в общий доступ - все логично.

Silerus ★★★★
()
Ответ на: комментарий от u0atgKIRznY5

еще раз. opensource != freeware. Любой труд должен быть оплачен, как это другой вопрос. Про твой код уже многие здесь сказали - я промолчу.

Silerus ★★★★
()
Ответ на: комментарий от Unicode4all

Ты чё? Толку от форума если здесь пытаются заработать люди с образованием? Видимо совсем худо у них, раз уж за любую работу беруться.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от post-factum

Ну говорю же, начнём с 50$.

Вы такие умные наверное. Хорошо разбираетесь да? Как помню читал в форензике, что человек, который становиться профессионалом в программировании, переходит к созданию вирусов. Так что всякие xor надеюсь вы уже умеете делать. Потом пишут в новостях, что вот мол вирусы заражают компьютеры, а такое ведь такие умники как вы пишут. Так что, сначала лучше бесплатно делать, так вы хоть не спалитесь. Вот ты можешь написать кейлоггер?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Да все уже поняли, чем ты тут занимаешься.

Hezký den.

post-factum ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

человек, который становиться профессионалом в программировании, переходит к созданию вирусов

Всякое вредоносное ПО я писал ещё в школе, а потом из этого вырос. Сколько наблюдаю за тобой в тредах — всё время складывается ощущение, что у тебя какое-то школьно-дилетантское восприятие уровня профессионализма. Мол, «профессионалы пишут на Си, а на остальное смотрят как на говно», «профессионал наизусть помнит всё, связанное с тем, что я сейчас изучаю», «есть чёткий набор навыков, позволяющий отделить новичков от продвинутых» и тому подобное, а ты пытаешься себя под это восприятие загнать. Не надо так, это весьма далеко от реальности.

Ещё такой момент: ты ждёшь, что тебе укажут на ошибки, ты их исправишь и от этого твой уровень мастерства повысится. Даже если так будет, в чём я довольно сильно сомневаюсь, это гораздо медленнее, чем последовать советам из этого и предыдущих тредов. От того, что, допустим, я укажу тебе, что функция hello_init() должна возвращать int, а на деле не возвращает ничего, твой менталитет не поменяется. А должен.


Так что всякие xor надеюсь вы уже умеете делать

Я очень надеюсь, что ты это так пошутил. Упоминать в одной строчке «профессионал», «создание вирусов» и «xor» — это даже не моветон.


мол вирусы заражают компьютеры

К слову, вирусов я с начала двухтысячных не видел, вымерли все. Сейчас в основном шифровальщики да трояны

XMs ★★★★★
()
Ответ на: комментарий от XMs

WannaCry, совсем недавно же, буквально на днях. Заражал, эксплуатируя уязвимость в samba, которая в виндах наружу по дефолту.

mersinvald ★★★★★
()
Ответ на: комментарий от mersinvald

Шифровальщик, не вирус. Для ясности: под вирусами я подразумеваю класс зловредов, характерных заражением уже существующих файлов вместо создания новых, ставший бичом доса и линейки win95/98/ME

XMs ★★★★★
()
Ответ на: комментарий от XMs

Ты знаешь что такое защита и нападение. Как атака помогает развиваться в защите, некой прогресс такой. Так вот, человек ищет уязвимость в программной обеспечении, находит и обьявляет об этом. Разработчик закрывает уязвимость тем самым развиваясь.
В твоём случае, в направлении создании вредоносов и защиты от них, ты остановился в развитии аж со школьных лет. Это находится в самом левом узле красно-чёрного дерева в твоём планировании.

Ещё такой момент: ты ждёшь, что тебе укажут на ошибки, ты их исправишь и от этого твой уровень мастерства повысится. Даже если так будет, в чём я довольно сильно сомневаюсь, это гораздо медленнее, чем последовать советам из этого и предыдущих тредов. От того, что, допустим, я укажу тебе, что функция hello_init() должна возвращать int, а на деле не возвращает ничего, твой менталитет не поменяется. А должен.

В любом случае, информация, которую можно получить быстро, тоже бывает полезна.
Что скажешь насчёт кода. Что такое likely и unlikely, и где об этом можно почитать, а то тут человек не захотел подробно писать об этом, вот сам знает, а рассказать об этом не хочет. В каких случаях применять, пишет что мне не нужно это использовать, а сам использует.
Раз уж ты хочешь помочь, со своей вступительной речью решил на тему зайти, то скажи, как можно было бы улучшить символьное устройство, хотелось бы на код посмотреть. Ну если не сложно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от XMs

Я очень надеюсь, что ты это так пошутил. Упоминать в одной строчке «профессионал», «создание вирусов» и «xor» — это даже не моветон.

Ты незнаешь форензику.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Что такое likely и unlikely

likely нужно использовать в антивирусах, чтобы они лучше вирусы ловили. А unlikely — в операционных системах, чтобы они меньше ломались.

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Я не верю, что это не троллинг. Не верю.

anonymous
()
Ответ на: комментарий от i-rinat

Дополню ответ, чтобы было яснее:
likely — переводится как вероятно, что значит «вероятно этот код стоит проверить». Антивирусы работают с ОС и по этим директивам проверяют код и данные, чтобы вредоносы там не смогли ничего сделать. Это, так сказать, защищенный код.
unlikely — значит что скорее всего код и так безопасен, не стоит тратить время на его проверку.

В линуксе в роли антимируса выступают SELinux и SystemD, первый применяет политики безопасности к блокам, комеченным как likely во время работы системы, а SystemD на этапе загрузки. Плюс SystemD в том что он интегрирован с pulseaudio и gnome-shell, что гарантирует безопасность воспроизведения аудио и аутентификации в гноме, в отличии от простых скриптовых систем инициализации.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.