Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/205: Рейтинг темы: голосов - 205, средняя оценка - 4.59
Заблокирован

Нужен пример простейшего драйвера на C/C++. Visual Studio 2008/новее. Win 8 x64, можно и XP x86 (а лучше оба)

19.03.2015, 01:49. Показов 40524. Ответов 121
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Совсем хорошо будет, если этот драйвер будет еще и делать что-то хоть как-то заметное юзером
И совсем замечательно, если будет еще и вкратце объяснено, как его установить на обеих ОС

P.S. Да-да, драйвер мне нужен на губозакаточную машину я хочу многого и притом на халяву. Но вы же с чего-то начинали? Писали, так сказать, helloworld.sys? Вот им и поделитесь. А то в инете везде либо не поймешь как компилировать, либо не поймешь чем компилировать, либо вообще ничего не поймешь

Добавлено через 43 секунды
И да, можно в принципе и не VS 2008, а что-то еще, хоть MinGW. Только тогда попрошу пояснить, какая у вас версия того компилятора и как его юзать.

Добавлено через 1 минуту
VS только Express, так что VisualDDK, к сожалению, никак не пойдет...
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.03.2015, 01:49
Ответы с готовыми решениями:

Как установить Windows 10 x64 (после обновления с Win 7 x86 до Win 10 x86) сохранив лицензию
Вопрос такой. У меня стояла седьмая 32-ух битная винда. Но процессор 64 разрядный. Так вот, я обновился до десятки, которая тоже 32-ух...

X86 и x64 в Visual Studio 2017
Здравствуйте! Во общем мне очень интересно есть ли разница если компилировать в x86 и x64, будет ли не работать x86 на x64 и т.д?

Разработка драйвера в Visual Studio 2008
Здравствуйте! На компьютере установлена Visual Studio 2008 и WDK. Я в Visual Studio написал небольшой драйвер, в Visual Studio он...

121
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
11.05.2016, 19:46
Студворк — интернет-сервис помощи студентам
Системная ошибка 2.
Не удается найти указанный файл
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.05.2016, 20:29
Значит, .sys-файла нет на месте.

Часто так бывает на 64-битной Windows, когда файл кидают в C:\Windows\system32\drivers, а
на самом деле из-за редиректа он оказывается в C:\Windows\SysWow64\drivers.
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
23.05.2016, 20:38
Подскажите, не пойму как дальше быть
Когда драйвер написан, скомпилирован, нужно еще написать программу, которая иллюстрирует его работу, которая вызывает этот драйвер. Я не совсем пойму, как это будет, если не сложно объясните максимально доступно, что должна представлять собой программа, которая вызывает драйвер и иллюстрирует его работу
Спасибо.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.05.2016, 20:50
Это зависит от того, что умеет делать драйвер. Обычно взаимодействие программы и
драйвера строится на базе стандартной схемы ввода-вывода: драйвер создает именованное
устройство и символьную ссылку на него (IoCreateDeviceSecure + IoCreateSymbolicLink), а
также реализует обработчики IRP_MJ_CREATE, IRP_MJ_DEVICE_CONTROL, IRP_MJ_CLEANUP и
IRP_MJ_CLOSE, после чего приложение может открывать его через CreateFile и слать
запросы - DeviceIoControl. Например, можно в драйвере собирать какую-нибудь интересную
системную информацию и отдавать по запросу в юзермодное приложение.
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
26.05.2016, 23:10
Подскажите пожалуйста, компиляция прошла успешно, а вот при попытке запуска выдает ошибку 31(на скрине)Это значит на более ранних версиях винды оно только работать будет или как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <ntddk.h>
 
 
static
VOID Unload(DRIVER_OBJECT * pDriverObj)
{
}
VOID MyCreateProcessNotifyRoutine(IN HANDLE  ParentId,
    IN HANDLE ProcessId,
    IN BOOLEAN Create)
{
    if (Create)
        DbgPrint("Create process. ParentId = %d, ProcessId = %d \n", ParentId, ProcessId);
    else
        DbgPrint("Delete process. ParentId = %d, ProcessId = %d \n", ParentId, ProcessId);
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDRIVERObject, IN PUNICODE_STRING pusRegistryPath)
{
    NTSTATUS Res3 = PsSetCreateProcessNotifyRoutine(*MyCreateProcessNotifyRoutine, TRUE);
    if (Res3 == STATUS_SUCCESS)
        return STATUS_SUCCESS;
    else
    return STATUS_UNSUCCESSFUL;
}
Миниатюры
Нужен пример простейшего драйвера на C/C++. Visual Studio 2008/новее. Win 8 x64, можно и XP x86 (а лучше оба)  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
27.05.2016, 10:06
Цитата Сообщение от Alex_86a Посмотреть сообщение
при попытке запуска выдает ошибку 31(на скрине)Это значит на более ранних версиях винды оно только работать будет или как?
Это значит, что твой драйвер (DriverEntry в данном случае) вернул ошибку,
только и всего. В данном коде параметры PsSetCreateProcessNotifyRoutine неправильные.
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
27.05.2016, 20:34
Изменил TRUE на FALSE в аргументах, служба успешно запущена, но в ДбгВью не выводит отладочные сообщения
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.05.2016, 07:47
Цитата Сообщение от Alex_86a Посмотреть сообщение
в ДбгВью не выводит отладочные сообщения
Какие настройки DbgView менялись? Там должна стоять галочка "Capture Kernel".
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
28.05.2016, 14:54
Ничего не менялось, запускаю от имени администратора,стоит галочка, но выводит какие-то сообщения периодически, но с того драйвера, что я запускаю не выводит ничего...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.05.2016, 15:32
А что-нибудь кроме DbgView пробовал? Я, например, этой утилитой вообще сейчас не пользуюсь.
Просто перевожу систему в режим отладки (bcdedit.exe) и подключаюсь WinDBG через com/pipe.
Там еще один флажок в реестре надо прописать - Debug Print Filter.

P.S. Убери звездочку перед MyCreateProcessNotifyRoutine. Странно, что вообще не падает...
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
28.05.2016, 20:32
Спасибо, сейчас попробую,

Добавлено через 30 секунд
Та то я пробовал даже не тот пример, просто банально два сообщения при загрузке и выгрузке драйвера сделал

Добавлено через 4 часа 27 минут
А можете объяснить как нужно правильно использовать функцию ZwCreateFile, что бы проверить есть ли файл на флешке, а то не получается совсем с ней...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2016, 10:50
Можешь попробовать ZwOpenFile, она для этой цели проще (т.к. меньше параметров).
Только не вызывай ее напрямую из нотификатора на запуск процессов, потому что на
время его выполнения отключена доставка APC, а без нее ZwOpenFile не работает.
1
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
30.05.2016, 12:27
Так а нужно тогда отдельный поток создавать, в котором вызывать ее или как?
И еще как будет выполняться сама проверка есть ли файл? Мне его открывать, и если удалось открыть то отдаю управление, а если не удалось открыть то сразу обрубать процесс??
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2016, 13:27
Цитата Сообщение от Alex_86a Посмотреть сообщение
Так а нужно тогда отдельный поток создавать, в котором вызывать ее или как?
Можно сразу в DriverEntry создать поток, который только и будет заниматься тем,
что по запросу вызывать ZwOpenFile и возвращать результат. А можно то же самое
поручить work item-ам, чтобы не заморачиваться с потоками.

Цитата Сообщение от Alex_86a Посмотреть сообщение
И еще как будет выполняться сама проверка есть ли файл? Мне его открывать, и если удалось открыть то отдаю управление, а если не удалось открыть то сразу обрубать процесс??
Да. Если не удалось открыть - ZwOpenProcess/ZwTerminateProcess/ZwClose.
1
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
30.05.2016, 15:02
А как мне возвращать управления, вот если ZwOpenFile возвращает STATUS_SUCCESS, то что дальше делать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2016, 15:46
У тебя срабатывает нотификатор на запуск процесса.
В этом нотификаторе ты запускаешь work item (или даешь сигнал своему
рабочему потоку) и ждешь, пока тот его не обработает и не вернет результат.
И по результату либо просто возвращаешь управление системе из нотификатора,
либо делаешь ZwTerminateProcess.
0
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
30.05.2016, 19:00
А можете написать, как будет выглядеть ZwOpenFile?
Пытался написать все функции и потом собрать и привести в действие, но зашел в дебри, если не сложно - поправьте в общем, очень запутался с параметрами вообще...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <ntddk.h>
#include <Wdm.h>
 
 
 
static
VOID Unload(DRIVER_OBJECT * pDriverObj)
{
}
VOID MyCreateProcessNotifyRoutine(IN HANDLE  ParentId, 
    IN HANDLE ProcessId,
    IN BOOLEAN Create)
{
    
    if (Create)
        DbgPrint("Create process. ParentId = %d, ProcessId = %d \n", ParentId, ProcessId);
    else
        DbgPrint("Delete process. ParentId = %d, ProcessId = %d \n", ParentId, ProcessId);
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDRIVERObject, IN PUNICODE_STRING pusRegistryPath)
{
    UNICODE_STRING          fileName;
    HANDLE                  handle;
    NTSTATUS                status; 
    OBJECT_ATTRIBUTES       objAttr;
    IO_STATUS_BLOCK         ioStatusBlock;
    ACCESS_MASK             DesiredAccess;
    CLIENT_ID               ClientId;
    IO_WORKITEM_ROUTINE     MyWorkItem;
    PDEVICE_OBJECT          DeviceObject;
    PVOID                   Context;
 
    status = PsSetCreateProcessNotifyRoutine(MyCreateProcessNotifyRoutine, FALSE);
    //if (status == STATUS_SUCCESS)
        //return STATUS_SUCCESS;
    //else
    //  return STATUS_UNSUCCESSFUL;
    
        VOID MyWorkItem(
        PDEVICE_OBJECT  DeviceObject,
        PVOID  Context
        )
    {
        status = ZwOpenFile
            (
            &handle,
            &DesiredAccess,
            &objAttr,
            &ioStatusBlock,
            &FILE_SHARE_READ,
            FILE_SYNCHRONOUS_IO_NONALERT
            );
        if (status == STATUS_SUCCESS)
            return STATUS_SUCCESS;
        else
            status = ZwOpenProcess(
            &handle,
            &DesiredAccess,
            &objAttr,
            &ClientId
            );
            status = ZwTerminateProcess(
            &handle,
            0
            );
        status = ZwClose(
            &handle
            );
    }
Добавлено через 59 секунд
Там в начале, то просто начал писать в этом файле остальные функции, то скинул как есть пока
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2016, 20:07
Почему у тебя в ZwOpenFile вместо ACCESS_MASK передается указатель на ACCESS_MASK?
И вместо ShareAccess указатель на ShareAccess? И почему обе эти переменные неинициализированы?
И почему реализация MyWorkItem находится внутри другой функции - DriverEntry?

Это похоже не на дебри, а на незнание языка C.
Если в документации MSDN написано, что такой-то параметр - это ULONG, значит, и
передавать туда надо ULONG, а не указатель на ULONG. Иначе оно просто не будет компилироваться.
1
0 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 38
30.05.2016, 20:16
Спасибо, половину уже по исправлял
А можно каким-то образом записывать в файл создание каждого нового процесса или удаление? получается выводить отладочные сообщения, о создании или удаления процесса, получается так же создавать файл в указанной папке и записывать туда указанную строку, А можно сделать так, что бы отладочные сообщения не выводились, а вместо них делались соответствующие записи в файл, который мы создаем?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2016, 20:52
Ну конечно можно. Используй ZwWriteFile, например.
Кстати, права доступа в ядре указывать не обязательно, все равно проверки безопасности
пропускаются. Можно, например, открывать процесс с ACCESS_MASK = 0 и с ним все
равно можно будет работать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2016, 20:52

User32.dll на Win x64 - это x86-библиотека, x64 или. и то и другое одновременно?
В проектах .NET функции из нее нормально импортируются при любой разрядности проекта - как x86, так и x64. Как написать такую библиотеку?

Установка Visual Studio 2008 на Windows 7 Professional x64 bit
Когда начинаю ставить визуал 2008 во время установки выбивает ошибку и дальше не продолжается, кто сталкивался может подскажете? Кроме...

Qt Creator & MS Visual Studio создание окна в Win 7 x64
Здравствуйте Нашел пример создания окна http://rastertek.com/gl40tut02.html все исходники и хедеры поместил в проект, созданный в Qt...

Win API в Microsoft Visual Studio 2008
Здравствуйте, уважаемые форумчане! Возникла такая проблема. Пишу простенькую программу с применением Win API, но компилятор ругается(( ...

Не ставится Win 7 x86 и Win 7 x64 на GPT раздел жесткого диска
Как пере конвертировать GPT в MBR без потери данных? или как установить Win 7 x86 на GPT, или Win 7 x64 ? У меня обе винды не ставится на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru