Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Хелп. Блокировка LPT и COM порта.  (Прочитано 42014 раз)
0 Пользователей и 1 Гость смотрят эту тему.
good3p
Гость
« : 09-05-2007 09:20 » 

задание в том, чтобы переделать один из стандартных драйверов. например из примера в ДДК (kernel\parport). (кстати COM порта есть пример в ДДК? =) 

моя задача в создании приложения способного, по команде пользователя закрывать для всех приложений доступ к LPT и COM порту. и только с помощью этого приложения можно вернуть порты в нормальное, доступное состояние.

хочу подкрутить стандартный драйвер так, чтобы у него был флаг, который я могу менять, и только я. но где и что править? и вообще какой самый простой способ посоветует?
(п.с. задание не в написании драйвера, в поправке, либо в хитрости. по идее выход должен быть относительно простой. написать драйвер мне бы никто не доверил=))

заранее спасибо!

Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 09-05-2007 10:37 » 

кстати COM порта есть пример в ДДК?

Есть - см. serial

Про остальное... ну дык для одного драйвера ты это сможешь сделать. А если например принтер свои драйверы установит? Хм...

Может всё-таки в "Драйверы" пренести? Там тебе скорей помогут.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
good3p
Гость
« Ответ #2 : 09-05-2007 10:47 » 

насчет переноса в тему "драйверы" я не против. но это ужу пусть администратор делает, не хочу дублировать темы, еще по шапке попадет)

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

(п.с. мне тут советовали... вызовом какойто функции можно отключить (приостановить) работу текущего драйвера. каким образом я вообще могу это сделать?)

спасибо!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 09-05-2007 11:22 » 

насчет переноса в тему "драйверы" я не против. но это ужу пусть администратор делает, не хочу дублировать темы, еще по шапке попадет)

А всё-равно по шапке надаёт. Тк ты их уже наплодил. Чего ж теперь плакати?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 09-05-2007 12:45 » 

хм... написать свои parport.sys и serial.sys?
вроде оба примера есть в DDK. попробуй скомпилить и подменить существующие)
если все пройдет гладко, что вообще не факт, но вдруг?... то вписать туда две блокировки - не проблемно)

второй вариант, пишешь приложение которое переодически вызывает сущетсвующий драйвер и пишет туда мусор) - какой мусор можно писать чтобы нарушить работу порта - можешь по IOCTL этих драйверов определить)

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

кстати вопрос: на уровне этих прав - не проще ли сделать блокировку?

PS гы. найди оба драйвера в C:\WINDOWS\system32\drivers
и отбери у пользователей доступ к ним))) и у системы... короче сам поиграйся найстройками)
это вкладка "безопасность" и там дальше кнопка "дополнительно"
PPS ток не перестарайся)
« Последнее редактирование: 09-05-2007 13:01 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 09-05-2007 13:02 » 

Из DDK? Пройдёт. Я такое с serial уже делал. Подгонял для протокола Olivetti принтера.

Да вот только поможет ли для решения поставленной задачи? А ежели вместо serial.sys другой драйвер будет установлен и обращение к порту пойдёт через него? Я бы тоже посоветовал с правами поиграться. Хотя конечно недостаток - ты сам должен быть админом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #6 : 09-05-2007 17:11 » 

Ну в принципе этот вопрос можно решить вообще не влезая в режим ядра. Перехватывать функцию ZwCreateFile (можно в ядре, а можно и на пользовательском уровне). В любом случае обращение к портам ввода-вывода, да пожалуй и ко всем устройствам (реальным и виртуальным) происходит через эту функцию.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 10-05-2007 06:40 » 

zubr,
вы несовсем правы) из своего драйвера я могу обращатся к любым портам без CreateFile.
пользователь может использовать сторонний драйвер экспортирующий данные функции(таких в нете - лопатой греби), соответственно и имя у него может быть произвольное - не отследить.

практически, отладчик уровня ядра(а ля SoftIce) может перехватывать обращения к портам I/O из любого ринга. это, думаю, самый надежный способ блокировки... правда как написать подобное - увы пока не знаю... скорее всего реализовано через аппаратную генерацию исключения при обращении к портам... короче сильно не копался - не знаю)

Джон,
а те два примера из DDK - это исходные коды того драйвера который реально стоит? или "не совсем"?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #8 : 10-05-2007 08:20 » 

ууух. во первых огромное спасибо за ответы! Улыбаюсь)
на всякий случай напишу задание...
31. Разработать программу, которая позволяет заблокировать работу периферийных устройств LPT и COM по команде пользователя.

хм... написать свои parport.sys и serial.sys?
вроде оба примера есть в DDK. попробуй скомпилить и подменить существующие)
если все пройдет гладко, что вообще не факт, но вдруг?... то вписать туда две блокировки - не проблемно)
дело в том что я не понимаю как править драйвер (это первый испуганный опыт с драйверами), для меня это трудновато еще...куда эти блокировки вписывать? и как быть если какоето устройство при подключении , например, устанавливает свои PnP драйвера и пользуется уже ими? ведь начнёт работать?

второ вариант, пишешь приложение которое переодически вызывает сущетсвующий драйвер и пишет туда мусор) - какой мусор можно писать чтобы нарушить работу порта - можешь по IOCTL этих драйверов определить)
мне вот какой вариант нравится : http://www.pcports.ru/articles/4.php (никак не подумайте , что это реклама)
по этой статейке (их там кстати несколько) легко подключиться к порту и писать в него числа (можно подключить диоды в LPT и сделать мини гирлянду, в общем веселее)) я вот и думаю может ли это решить мою задачу? ведь когда порт захвачен мной и я с ним работаю никто другой не может с ним работать? или я не прав?
или надо писать туда определенный мусор (можно поподробнее) ? и тогда что такое IOCTL драйверов?

третий вариант... пишешь приложение которое напросто отключает и убивает эти два драйвера)
этот вариант мне нравится. только можно тоже чуть подробнее и желательно с примером или ссылочкой?

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

PS гы. найди оба драйвера в C:\WINDOWS\system32\drivers
и отбери у пользователей доступ к ним))) и у системы... короче сам поиграйся найстройками)
это вкладка "безопасность" и там дальше кнопка "дополнительно"
PPS ток не перестарайся)
скорее к решению моей задачи этот способ не подходит...ведь это должно делаться программно...

у меня еще мысля появилась (наверное думаете - неужели такое может быть? да, может))) может можно как-то тупо отключить питание этих портов?

Спасибо!!
« Последнее редактирование: 10-05-2007 08:22 от good3p » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 10-05-2007 09:11 » 

Джон, а те два примера из DDK - это исходные коды того драйвера который реально стоит? или "не совсем"?)

Ну по идее нужно просто сравнить исходные коды примера и "того, который реально стоит". Улыбаюсь) Только где их взять?

Серьёзно.

Про параллельный врать не буду. А с СОМ было так, ребята из Wincor (тогда они были ещё Siemens) откапали какие-то принтеры Olivetti с интересным протоколом - строб шёл на каждый байт. Они его назвали HARDWARE UNBUFFERED. А мы как раз для них прогу делали для тестирования всего ихнего железа. Ну мы вначале это на уровне АПИ ф-ций сделали, но работало очень медленно. Ну мы потыкались - собственный драйвер с нуля делать было очень дорого. В общем я взял serial из DDK, добавил в него необходимые ф-ции, которые считывли байт по прерыванию, компильнул. Режим включается/выключается через нормальную DeviceIoControl. При инсталляции "наш" serial.sys заменяет стандартный системный виндовский драйвер. Единственное условие - платформа w2k, XP (теоретически сервер 2003 - DDK было для этих платформ, но мы на нём не проверяли - он не стоял в списке поддерживаемых платформ).
Ну и было это в 2002м. Пока за пять лет никто не жаловался. А клиентов у них дай Бог каждому. Ага Так что "Пейте смело. И кильками в наш век отравиться гораздо легче." (с)

good3p, После твоего последнего предложения так и хочется посоветовать тебе разорвать контакты на материнской плате, впаять туда реллюху и управлять ей. Улыбаюсь)

А если серьёзно, то если  у тебя задание такое, а не просто "решить задачу ЛЮБЫМ способом", то сначала надо узнать побольше о тебе. Где учишься? На кого? Из какой области задание? Какой уровень? Какого решения от тебя ждут? От этого будет зависить выбор "лечения".
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 10-05-2007 09:28 » 

good3p,
в обратном порядке отвечаю:
сразу с последнего, снять питание с портов - можно только аппаратно)) хотя... не помню можно попробовать контроллер распрограммировать, но это тоже не очень просто.

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

насчет нарушить работу записывая мусор - хм. не во всех случаях сработает на самом деле. и коряво это как-то...

далее.... монопольно ты порт захватить штатными средствами... пожалуй и не сможешь) на самом деле это асемблерная команда а-ля"out(или in) addres, data"...
 
и все таки... попробуйте поискать что есть их похожего софта
http://www.protect-me.com/ru/dl/
http://webrusinfo.ru/lincs.php?ID=38 - описание ее же.
http://rew.ru/soft/4/48.html
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
zubr
Гость
« Ответ #11 : 10-05-2007 09:46 » 

Цитата
у меня еще мысля появилась (наверное думаете - неужели такое может быть? да, может))) может можно как-то тупо отключить питание этих портов?
Не советую, спалишь порты нахрен. Ну COM еще ладно, а LPT - понакладнее будет.
Цитата
zubr,
вы несовсем правы) из своего драйвера я могу обращатся к любым портам без CreateFile.
пользователь может использовать сторонний драйвер экспортирующий данные функции(таких в нете - лопатой греби), соответственно и имя у него может быть произвольное - не отследить.
Согласен, с именами как-то упустил.

Самым красивым видится решение - получить указатель на AttachedDevice родного драйвера и прикрутить к нему драйвер-фильтр. Но это сложновато, особенно для начинающего.
Есть неплохая программка WinDriver, позволяющая генерить драйвера. Я правда не помню, можно ли с помощью ее драйвер-фильтр сотворить (давно ею не пользовался), но посмотреть в ее направление, думаю, имеет смысл.
Записан
good3p
Гость
« Ответ #12 : 10-05-2007 11:43 » 

учусь я на программиста)) 3 курс. задание по предмету "системное программирование". не подвезло вот с темой и с преподавателем. слишком жесть он дал. я с ним говорил он дал три совета:
1. сказал что драйвер я сам не напишу, но можно попробовать "подкрутить" стандартный дравер-А, так чтобы только я мог его выключать и только я мог его включать.
2. но тут возникает проблема что другие устройства буду пытаться включать этот драйвер-А, и поэтому можно написать драйвер-Х, который будет отлавливать все запросы других приложений на включение драйвера-А.
3. написание драйвера фильтра.
4. типа ну уксперементируйте может вы найдете способ получше.

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

самый простой способ - самому занять порт какими либо действиями. впринципе это тоже решение задачи. правда там кода то не больше 50 строк. это уж совсем не солидно.

думаю самое целесообразное будет копать в направлении драйвера-фильтра. но как и что ? тут опускаются руки. если в папке \src\kernel\parport лежит 61 файл и весят они мегебайт)))) что тут править чтобы сделать фильтр. в общем товарищи я в печали...

Записан
Vlaor
Гость
« Ответ #13 : 10-05-2007 18:43 » 

Вообще можно попробовать производить инициализацию драйвера по к.л. управляющему коду через DeviceIoControl. Тогда сторонние программы уж точно не смогут нечего сделать. Улыбаюсь
Записан
good3p
Гость
« Ответ #14 : 10-05-2007 20:37 » 

Вообще можно попробовать производить инициализацию драйвера по к.л. управляющему коду через DeviceIoControl. Тогда сторонние программы уж точно не смогут нечего сделать. Улыбаюсь

а можно чуть подробнее?
« Последнее редактирование: 10-05-2007 21:49 от good3p » Записан
good3p
Гость
« Ответ #15 : 11-05-2007 18:20 » 

смотрю запустился драйвер или нет в MyComputer/Manage/ServicesAndApplications/Services и его там нету
а если смотрю в DeviceTree то он есть. это нормально?
« Последнее редактирование: 11-05-2007 21:25 от good3p » Записан
Vlaor
Гость
« Ответ #16 : 12-05-2007 09:33 » 

Можно например добавить к.л. переменную проверяемую при попытке обращения к порту сторонних драйверов. Если True то доступ есть, false того...
А по управляющему коду менять значение. Но тогда необходимо соответствующим образом изменить функции чтения/записи, обработки прерываний.
Теоретически должно сработать...
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 12-05-2007 16:35 » 

Vlaor,
практически - тоже, сработает)
если на "кул-хацкеров" не расчитывать)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 12-05-2007 19:08 » 

"Меня опять терзают смутные сомнения" (с) А как быть в том случае, если пользователь УЖЕ ползуется поротом? Например я захватил через стандартный драйвер СОМ1. Как у меня его отобрать?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Vlaor
Гость
« Ответ #19 : 13-05-2007 09:40 » 

Джон,
Это еще один довод в пользу драйвера, а не пользовательского приложения.
Забавно выйдет если неожиданно по ходу работы отрубить порт. Что вообще будет? Скорее всего все приложения выдадут unknown error или типа того. Улыбаюсь
практически - тоже, сработает)
если на "кул-хацкеров" не расчитывать)
А как раз на 3 курсе все мы "кул-хацкеры"!!!
« Последнее редактирование: 13-05-2007 09:42 от Vlaor » Записан
good3p
Гость
« Ответ #20 : 13-05-2007 20:22 » 

как сделать так чтобы драйвер один или несколько раз бибикнул писиспикером?
ато хочу наверняка знать достучался я до своего драйвера или нет. и как еще можно кроме писиспикера начинающему "услышать" драйвер.

но пока застопорился вот где:
Код:
CreateFile("\\\\.\\myDrv",  
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
  cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'
как же быть?Улыбаюсь


спасибо!


« Последнее редактирование: 13-05-2007 23:44 от good3p » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 14-05-2007 08:45 » 

"cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'"
- хм, как вам это удалось???)))))
у меня тот же код работает...


да, кстати FILE_SHARE помоему не обязательно.. но не помню уже точно)
hDrv = CreateFile(  lpNameDriver,
         GENERIC_READ | GENERIC_WRITE,
         0,NULL,OPEN_EXISTING,0,NULL);
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #22 : 14-05-2007 08:49 » 

У вас настройки проекта разные. good3p комппилит в UNICODE, а Ochkarik в ANSI

good3p, сделай так

_T("\\\\.\\myDrv")
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
good3p
Гость
« Ответ #23 : 14-05-2007 16:12 » 

#define IOCTL_SEND_BYTE_TO_USER CTL_CODE(\FILE_DEVICE_UNKNOWN, 0x705, METHOD_BUFFERED, FILE_ANY_ACCESS)
...
  unsigned long ioctlCode;
  ioctlCode=IOCTL_SEND_BYTE_TO_USER;   ---- error C2017: illegal escape sequence

это как? ))


и как бибикнуть писиспикером в коде драйвера?
« Последнее редактирование: 14-05-2007 19:02 от good3p » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #24 : 15-05-2007 09:14 » 

Вот так надо
#define IOCTL_SEND_BYTE_TO_USER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x705, METHOD_BUFFERED, FILE_ANY_ACCESS)

У тебя бэкслэш перед F в скобках был.

С него начинаютс эскейп-последовательности

как бибикнуть не знаю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
good3p
Гость
« Ответ #25 : 15-05-2007 11:27 » 

спасибо. в общем драйвер загружается и могу с ним общаться через CTL_КОДЫ. теперь ищу инфу как драйверу стать фильтром (копаю в сторону подключения моего драйвера в стеке драйверов над драйвером паралПорта или комПорта, чтобы перехватывать ИРП пакеты идущие от приложений к драйверам), как начну прочитанное реализовывать, посыпятся вопросы. держитесь))

п.с.
и как бибикнуть писиспикером в коде драйвера?)
Записан
Vlaor
Гость
« Ответ #26 : 15-05-2007 15:56 » 

good3p,
Насколько я знаю доступ к динамику реализован через порт 0х61. Если конечно в сверхсовремменных архитектурах его не отменили. Используем биты 0,1.
Для ВКЛ их устанавливаем в 1.
Для ВЫКЛ сбрасываем.
Главное чтобы сам динамик был подключен!!! Улыбаюсь
Записан
good3p
Гость
« Ответ #27 : 17-05-2007 21:38 » 

в общем возникли у меня сомнения по поводу
[NTSTATUS loGetDeviceObjectPointer(
IN PUNICODE_STRING ObjectName,
IN ACCESS_MASK DesiredAccess,
OUT PFILE_OBJECT FileObject,
OUT PDEVICE_OBJECT DeviceObjct);] FileObject и DeviceObjct  возвращает значения  например -2141716481.  по моему это лажа. гдебы посмотреть пример вызова этой функции и какое точно ObjectName в нее подавать?

и еще вопрос по [PDEVICE_OBJECT loAttachDeviceToDeviceStack ( IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice);]
как я понял в SourceDevice надо передавать полученный DeviceObjct из верхней ф-и, а в TargetDevice передавать указатель на сам фильтр. как фильтру получить указатель на себя? таким же вызовом  loGetDeviceObjectPointer ?

буду рад советам и поправкам. спасибо!

п.с.
и есть ли возможность как либо получить код ошибки при неудачном вызове функции?
« Последнее редактирование: 17-05-2007 21:39 от good3p » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 21-05-2007 09:09 » 

позавчерась приобрел книженцию Уолтера Они, Использование Microsoft Windows Driver Model. издание второе. попробуй найти, оч неплохая книженция) хм. могу от нее хелпы на английском выложить, если их еще нет. хелпы и примеры....
посмотрел - уже лежит на сайте https://club.shelek.ru/download.php?id=9. там был пример драйвера фильтра. думаю должен быть расписан по полочкам. правда на английском)

по вызову - посмотри что за статус тебе возвращается.
указатель на себя ты получаешь когда себя и создаешь:     
status = IoCreateDevice(    DriverObject,
                sizeof(DEVICE_EXTENSION_MY),
                &uniNtDeviceName,       //имя
                FILE_DEVICE_UNKNOWN,    //тип
                0,                      //FILE_AUTOGENERATED_DEVICE_NAME,   //характеристики
                FALSE,          //эксклюзивность процесса(толкьо один handle)
                &DeviceObject);
)))
PS
а код ошибки тебе как раз всегда возвращают) в статусе. допустимые варианты статуса расписаны в ддк на эту функцию
Return Value
IoGetDeviceObjectPointer can return one of the following NTSTATUS values:

STATUS_SUCCESS
STATUS_OBJECT_TYPE_MISMATCH
STATUS_INVALID_PARAMETER
STATUS_PRIVILEGE_NOT_HELD
STATUS_INSUFFICIENT_RESOURCES
STATUS_OBJECT_NAME_INVALID
« Последнее редактирование: 21-05-2007 09:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #29 : 21-05-2007 13:09 » 

УРА! Не может быть... С ума сойти...
в общем алярма)) работает!))
чего я добился : IoGetDeviceObjectPointer() - получаем ссылку на устройство.
IoAttachDeviceToDeviceStack () - "приделали" мой драйвер к устройству последним в стек. (работает с устройствами :
L"\\Device\\Beep"
L"\\Device\\ARP1394"             
L"\\Device\\smserial"
L"\\NTFS"...
вот. devicetree.exe дает наглядную картинку происшедшего - в конец дерева устройства поместился мой драйвер.
теперь собвственно вопрос :

какое имя носит устройсвто COM и LPT порт? (у меня нету LPT порта, но буду тестить где-нибудь на другой машине)
(если скажете что COM-serial, то у меня его нету. есть только smserial, но это модем...)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 21-05-2007 13:45 » 

FDO - \Device\ParallelPort0
PDO - \Device\Parallel0
вроде так.
FDO - \Device\Serial0 - соответственно...
если не путаю...
« Последнее редактирование: 21-05-2007 13:49 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #31 : 21-05-2007 14:03 » 

спасибо. но таких устройств у меня не оказалось. попробую на другой машине.

в общем еще вопрос. затестил я устройство beep - оно пипикало, но после работы моего драйвера, перестало, значит всё хорошо, будет работать и для других устройств.

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

спасибо!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 21-05-2007 14:37 » 

IoSkipCurrentIrpStackLocation (Irp);
IoCallDriver(LowerDevice, Irp);
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #33 : 22-05-2007 05:43 » 

в общем начались мучения) надоело мне наблюдать синюю смерть и опять я за советом. мой драйвер передает пакеты ниже, т.е. писиспикер бибикает, и через секунду улетает в синий экран) вот кусок кода:

было так и блокировало. хочу добиться обратного - не блокировать.
Код:
switch (ioControlCode)

  case...
  ...
  default:
  {
#if DBG
DbgPrint("-myDrvC- chto? kto tut komu meshajet?(1)...\n");
#endif
      Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
      break;
  }
}
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета
return ntStatus;
}


делаю так, чтобы передавало ниже: (что тут не правильно)
Код:
...
switch (ioControlCode)
{  ...
   case..

   case...

   default:{
#if DBG
DbgPrint("-myDrvC- peredacha vniz.(1)...\n");
#endif
        //Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
IoSkipCurrentIrpStackLocation (Irp); //
IoCallDriver(temp_vniz, Irp);  //
        break;
  }
  }
 
  ntStatus = Irp->IoStatus.Status;
  //IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета
  return ntStatus;
}

также бывает после синей смерти драйвер напроч отказывается загружаться (перезагрузка и чистка реестра помогает). либо загружается но глючит общение с ним по ioctl кодам.
спасибо!
« Последнее редактирование: 22-05-2007 05:52 от good3p » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 22-05-2007 07:03 » 

можно еше
   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
а возвращать лучше все таки:
    return STATUS_SUCCESS;
хотя черт его знает...


остальное должно быть не совсем так:
Код:
        Irp->IoStatus.Status = STATUS_SUCCESS;//здесь ты выставляешь свой статус. и передаешь ниже. если этого не сделать - вызов хоть и пройдет через стек но не....)))           
        IoSkipCurrentIrpStackLocation (Irp);
        status = IoCallDriver(devExt->LowerDevice, Irp);
        return status;


Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #35 : 22-05-2007 12:15 » 

спасибо за помощь. в общем решил я всетаки не мудрить и сделать правильную выгрузку драйвера. драйвер есть - нужные девайсы не работают. выгрузил - работают.
в общем как ситуация обстоит сейчас=) :
получаю поинтер на девайс beep (RtlInitUnicodeString(&usFatDriverObj[4], L"\\Device\\Beep")Ага
Код:
ntStatus = IoGetDeviceObjectPointer(
        &usFatDriverObj[4],               //ObjectName
        //FILE_READ_DATA,                //DesiredAccess
FILE_READ_ATTRIBUTES,
        OUT &lpFileObject[4],                 //FileObject
        OUT &lpDeviceObject[4]);              //DeviceObject
присоединяю свой драйвер к этому устройству:
Код:
IoAttachDeviceToDeviceStack ( IN deviceObject, IN lpDeviceObject[4]);

все хорошо, все работает. теперь выгружаю драйвер:
Код:
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
  UNICODE_STRING deviceLinkUnicodeString;
  PDEVICE_EXTENSION extension;
  PIRP pNewIrp = NULL;
  ULONG m_size;
  NTSTATUS  ntStatus;
  extension = DriverObject->DeviceObject->DeviceExtension;
 
//===================================  !!!!!!!!


IoDetachDevice(IN OUT lpDeviceObject[4]);


ObDereferenceObject(IN lpDeviceObject[4]);


//=====================================!!!!!!!!!!!!!
  // Create counted string version of our Win32 device name.
  RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);


  // Delete the link from our device name to a name in the Win32 namespace.
  IoDeleteSymbolicLink(&deviceLinkUnicodeString);


  // Finally delete our device object
  IoDeleteDevice(DriverObject->DeviceObject);
  }
и вот что странно.
1 раз загружаю драйвер. все хорошо бибикалка не работает.
1 раз выгружаю - работает.
2 раз загружаю - не работает.
2 раз выгружаю.
вроде бы все хорошо, но вот когда запускаю бибикалку или пытаюсь посмотреть дерево в devicetree.exe - синяя смерть. почему ? ведь один цикл загрузки-выгрузки-загрузки прощел успешно. не понимаю.

спасибо!
Записан
good3p
Гость
« Ответ #36 : 22-05-2007 14:43 » 

УРА!
в общем помучался я с выгрузкой и решил сделать через флажок. т.е. если флаг == 1 то передаю пакеты ниже, если ==0 то не делаю ничего.

вот код главной функции DriverDeviceControl: может будет полезно таким же новичкам как и я.
если что пишите сюда могу запостить весь код как драйвера так и приложения работающего с ним. всем спасибо!
Код:
//Эта функция вызывается каждый раз, когда драйверу приходит IRP-пакет с каким либо IOCTL_ кодом. 
//IRP-пакет - это структура, передавая указатель на которую, приложение может общаться с драйвером


NTSTATUS
DriverDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp)
{
  NTSTATUS ntStatus;
  PIO_STACK_LOCATION irpStack; //irpStack типа указателя на стековую область ввода-вывода PIO_STACK_LOCATION
  PDEVICE_EXTENSION extension;
  PULONG ioBuffer; //ioBuffer, в которую будет помещен адрес системного буфера обмена/ type mpzet bit drugim esli 40
  ULONG ioControlCode;
  ULONG port = 0;     
  int i;












  Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information = 0;
  irpStack = IoGetCurrentIrpStackLocation(Irp); //в переменную irpStack помещается адрес стековой области ввода-вывода
//
  extension = DeviceObject->DeviceExtension;
  ioBuffer = Irp->AssociatedIrp.SystemBuffer; // в переменную ioBuffer заносится адрес системного буфера из структуры IRP
// Системный буфер входит в объединение (union) с именем AssociatedIrp,
// поэтому мы используем конструкцию Irp->AssociatedIrp.SystemBuffer

  ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
  //Конструкция switch-case анализирует содержимое ячейки IoControlCode

  //В нашей программе только один код действия TEST_SMTH
  switch (ioControlCode)
  { 
  case TEST_SMTH:                 
  {
       ioBuffer[0] =(ULONG)DriverEntry;//В буфер обмена адрес функции DriverEntry
         Irp->IoStatus.Information = 4;//количество (4) пересылаемых байт
       
#if DBG
DbgPrint("-myDrvC- obrabotal TEST_SMTH.\n");
#endif




ntStatus = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000





break;
 
  }
 
 
  case IOCTL_SEND_BYTE_TO_USER: // шлём байтик юзерскому приложению
  {
       
ioBuffer[0] =(ULONG)("YES!");//В буфер обмена адрес функции DriverEntry
         Irp->IoStatus.Information = 4;//количество (4) пересылаемых байт
       
#if DBG
DbgPrint("-myDrvC- obrabotal IOCTL_SEND_BYTE_TO_USER.\n");
#endif

ntStatus = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000

if (GlobalFlag==0) GlobalFlag = 1;
else GlobalFlag = 0;

DbgPrint("-myDrvC- obrabotal IOCTL_SEND_BYTE_TO_USER. GlobalFlag stal:%d.\n",GlobalFlag);



break;

  }






default:


  {

DbgPrint("-myDrvC- popali v default!...)))))\n");

        if (GlobalFlag==0)
{
 
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
DbgPrint("-myDrvC- MESHAJU!)))))\n");
}
if (GlobalFlag==1)
{
Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp); //yo

DbgPrint("-myDrvC- NE MESHAJU!)))))\n");
IoCallDriver(LowLevel, Irp);  //beep yo
}


        break;
}

  }
 
DbgPrint("-myDrvC- vniz test GF(%d)!)))))\n",GlobalFlag);

  ntStatus = Irp->IoStatus.Status;
  //IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000
  return ntStatus;
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 23-05-2007 07:49 » 

то что один цикл выгрузки проходит а второй нет - видимо какие то IRP незавершенные остаются.
кстати когда IRP посылается, отправитель знает сколько устройств в стеке) соответственно и стек IRP с соотв. числом полей генерит.
вигрузка так с виду вроде нормально все выглядит.
хм. попробуй по шагам загружать выгружать и каждый раз смотреть дерево.

еще. ты уверен что твои IOCRL с родными по номерам не пересекаются? вдруг попал пальцем в небо)

а вообще - молодцом) быстро разобрался) зато теперь BSOD во сне видеть будешь ближайщие пол года)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
batanik
Гость
« Ответ #38 : 01-06-2007 13:23 » 

Как изменить код для блокировки Floppy и CD-Rom? А черт его знает...
Заранее спасибо.
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines