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

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

19.03.2015, 01:49. Показов 40880. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru