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

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

19.03.2015, 01:49. Показов 40431. Ответов 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
Регистрация: 24.09.2015
Сообщений: 18
14.06.2017, 19:16
Всякое бывает, может и я плохо описал код, да и там в глаза бросается так, что может смешиваться инфа на первый взгляд.

У меня опыта особого нет, но я вот дебажу пока через DbgView, делаю выводы и там просматриваю.

Кстати как я говорил у меня было предположение, что я саму логику кода, сам алгоритм не верно выстроил, криво реализовал, сейчас вроде обнаружил зацикленность, не правильно проверку задал. Это в другом списке, не в том, что я описал тут.

Ну со своим кодом я, конечно, сам разберусь) Мне просто было важно услышать от Вас - правильно ли я понимаю механику, как должно всё выглядеть, эта работа со списком. Если всё верно, то додебажу и надеюсь всё будет хорошо)

Добавлено через 3 часа 16 минут
Продебажил, нашел ошибку. Не ожидал такого, казалось бы, что Windows вроде параллелизм не поддерживает, всё равно передаётся управление между потоками: сразу один выполяется, потом операционная система когда нужно передаёт управление другому потому и т.д, а тут в общем как-то случилось так, что одновременно два потока выполнились, а мне этого нельзя.

В общем ситуация такая, что юзермодная программа делает запрос информации у драйвера, информации нет, я кидаю режим ожидания юзермодной программе, сохраняю пакет просто в глобальную переменную, устнавливаю глобальный флаг, что этот пакет есть и его можно юзать. В функции перехвата запуска процесса проверяется этот флаг и если он true, то завершается IoCompleteRequest для пакета, который хранится в глобальной переменной. Тут то и проблема, два потока одновременнно успевают зайти во флаг и два раза завершается один и тот же пакет. В итоге юзермодная программа первое завершение пакета игнорит, а второе завершение обрабатывается и в моём коде отправляется ответ драйверу. Таким образом первый процесс, который одновременно заюзал пакет со вторым процессом, завис, т.к я торможу его, пока не будет ответа от юзермодной программы, а ответа больше никогда не будет.

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

Добавлено через 1 час 3 минуты
Такс, попробовал спин блокировки, по тому что увидел в интернете сделал вот так:

Глобальные переменные
C
1
2
KSPIN_LOCK lok;
KIRQL Irql;
Там где нужно( в перехвате запуска)
C
1
2
3
KeAcquireSpinLock(&lok, &Irql)
//действия и самое главное завершение пакета
KeReleaseSpinLock(&lok,Irql);
Вроде проблема исчезла, кстати у меня проблема данная паралеллизма возникла может из-за того, что я 2 if отдельно делал, ifы были одинаковы, просто пакет завершал во втором(просто во время дебага вынес так). А пока оно доходило до второго ifа, может другой процесс в первый и заходил. Но думаю нет гарантии, что без синхронизациии даже с одним if такого не повторится, поэтому инхронизацию оставлю) Пока не знаю, может и дальше баги будут... если что не правильно сделал, подкорректируйте, пожалуйста
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.06.2017, 09:58
Цитата Сообщение от Ranege Посмотреть сообщение
Не ожидал такого, казалось бы, что Windows вроде параллелизм не поддерживает
С чего бы? Еще как поддерживает.
На двухъядерных и более процессорах потоки в системе могут физически
выполняться параллельно.

Цитата Сообщение от Ranege Посмотреть сообщение
в общем как-то случилось так, что одновременно два потока выполнились, а мне этого нельзя.
Ну я подразумевал из твоего кода, что синхронизация все-таки где-то есть...

Цитата Сообщение от Ranege Посмотреть сообщение
Там где нужно( в перехвате запуска)
C
1
2
3
KeAcquireSpinLock(&lok, &Irql)
//действия и самое главное завершение пакета
KeReleaseSpinLock(&lok,Irql);
Лучше так не делать.

Во-первых, спин-лок - это очень опасный объект синхронизации.
Неумелое его использование приводит к лишнему "прожиганию" CPU. А еще спин-лок накладывает
ограничения на используемый тип памяти под блокировкой (только non paged, потому что под
блокировкой всегда IRQL == DISPATCH_LEVEL). Этот объект синхронизации лучше использовать
только исключительно там, где без него ну никак. А для остальных случаев есть fast mutex,
ERESOURCE и т.д.

Во-вторых, завершать пакет лучше не под блокировкой, а вне ее:
C
1
2
3
4
5
6
7
8
9
10
11
IRP * pIrp;
 
AcquireLock();
pIrp = g_StoredIrp;
g_StoredIrp = NULL;
ReleaseLock();
 
if (pIrp)
{
    // Завершаем IRP здесь.
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2017, 09:58

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 ? У меня обе винды не ставится на...


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

Или воспользуйтесь поиском по форуму:
122
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru