| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | «  : 20-06-2003 13:33 »  |  | 
 
 Добрый день/ночь.
 На старом форуме я уже всем надоедал с подобными вопросами, но мои старания не увенчались успехом, и я вынужден продолжить.
 
 Итак.
 Есть железяка которую я хочу вставить в LPT, мне нужно писать/читать ее EPP-моде и ловить прерывания. Меня уже убедили в том, что надо поставить свой драйвер в стек исходящий из системного драйвера.
 И вот проблема--как узнать DeviceObject этого самого системного драйвера:?:
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #1 : 20-06-2003 13:48 »  |  | 
 
 Его тебе передадут при подключении твоего драйвера в AddDevice. Если ты только в реестре свой драйвер правильно пропишешь, как верхний или нижний фильтр.
 P.S. Добавлено:
 У тебя в вопросе путаница- ты написал DeviceObject драйвера, такого не бывает, читай ниже.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Aleck D.Shadow | 
								|  | « Ответ #2 : 20-06-2003 13:48 »  |  | 
 
 Возможно что-то даст GUID LPT порта он известен.Посмотри книгу про драйвера на этом сайте.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #3 : 20-06-2003 13:58 »  |  | 
 
 Как я уже сказал официальный способ- получить в AddDevice, это стандартный способ при присоединении фильтра. Там тебе дадут PDO и можешь пройтись по всему стеку и узнать про все девайсы, что сидят до твоего, далее IoAttachDeviceToDeviceStack и получаешь указатель на девайс прямо под твоим, хотя его ты можешь получить и просто поднявшись по всем девайсам, начиная с PDO.Если этот DriverObject нужно достать из отдельного драйвера- то можно через GUID, через драйвер этого девайса, наконец через указатель LPT1(только там ты получишь указатель на самый верхний драйвер в стеке LPT).
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #4 : 20-06-2003 14:09 »  |  | 
 
 А можно и так IoGetDeviceObjectPointer.г. Жуковский- а ты не на ФАЛТе случаем учишься?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #5 : 20-06-2003 14:39 »  |  | 
 
 Я немного сглючил- ты спросил DeviceObject драйвера, вот меня и понесло на DeviceObject. У драйвера DriverObject.
 DriverObject можно получить через указатель в DeviceObject(как его получить- тебе уже рассказали), через GUID( читай в DDK), а также во так
 
 RtlInitUnicodeString(&usDriverName,lpDriverName);
 
 if (!NT_SUCCESS(ObReferenceObjectByName(&usDriverName,OBJ_CASE_INSENSITIVE,NULL,FILE_READ_ACCESS,*IoDriverObjectType,KernelMode,NULL,&pDriverObject)))
 {
 Error!
 }
 else
 {
 Sucсess
 не забудь сделать вот это после обработки-
 ObDereferenceObject(pDriverObject);
 }
 в pDriverObject нужный указатель.
 То есть надо знать имя созданного DriverObject оно не меняется в пределах одной версии ядра и всегда одно и то же.
 
 Прототип
 NTKERNELAPI
 NTSTATUS
 ObReferenceObjectByName (
 IN PUNICODE_STRING  ObjectName,
 IN ULONG            Attributes,
 IN PACCESS_STATE    PassedAccessState OPTIONAL,
 IN ACCESS_MASK      DesiredAccess OPTIONAL,
 IN POBJECT_TYPE     ObjectType,
 IN KPROCESSOR_MODE  AccessMode,
 IN OUT PVOID        ParseContext OPTIONAL,
 OUT PVOID           *Object
 );
 
 И больше не путай DeviceObject и DriverObject - это разные вещи.
 Интересно, а что ты все таки имел в виду- DeviceObject или DriverObject. Хотя тут уже про все рассказали.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #6 : 20-06-2003 17:40 »  |  | 
 
 Как я уже сказал официальный способ- получить в AddDevice, это стандартный способ при присоединении фильтра. Там тебе дадут PDO и можешь пройтись по всему стеку и узнать про все девайсы  AddDevice это конечно здорово, но если я правильно понял, то эту самую AddDevice дергает PnP-менеджер. А моя железяка в LPT порту не поддерживает PnP. Интересно, а что ты все таки имел в виду- DeviceObject или DriverObject. Хотя тут уже про все рассказали. Вообще-то я имел ввиду именно DeviceObject, ведь для IoAttachDeviceToDeviceStack нужен именно он. Правда DeviceObject можно получить  IoGetDeviceObjectPointer, но эта функция в свою очередь требует ObjectName (Points to a buffer containing a Unicode string that is the name of the device object.) И тогда появляется вопрос--какой  ObjectName использовать? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 20-06-2003 17:50 »  |  | 
 
 И еще. Я действительно решил написать верхний фильтр, и решил что для этого достаточно корректно вызвать IoAttachDeviceToDeviceStack, а дальше просто кидать IRP-пакеты с помощью IOCallDriver. В подобном пакете можно послать запрос IOCTL_INTERNAL_PARALLEL_CONNECT_INTERRUPT и ловит прерывания, а запросами IRP_MJ_READ/IRP_MJ_WRITE читать/писать.
 Разве это не так?
 
 P.S. Случаем на ФАЛТе, но вернее уже УЧИЛСЯ--16 июня защитил диплом, а 30-го получу корочки и официально перестану носить гордое имя студента.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #8 : 20-06-2003 18:15 »  |  | 
 
 P.S. А я ФПФЭ закончил, год назад. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #9 : 20-06-2003 18:20 »  |  | 
 
 Блин, да в чем проблема имя ты можешь получит через символьную ссылку LPТX или через реестр. Или открыв DRIVER_OBJECT LPT порта и пройтись по всем девайсам им созданным, посмотреть их имена и выбрать нужный порт. Если подубать еще несколько способов можно придумать. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #10 : 20-06-2003 18:35 »  |  | 
 
 Блин, да в чем проблема имя ты можешь получит через символьную ссылку LPТX или через реестр.  Я вместо имени использую \\Device\\ParallelPort0 и просто хотел убедиться что мой драйвер не работает не из-за этого. А чем IoGetAttachedDeviceReference отличается от IoAttachedDeviceToDeviceStack, и можно ли первое использовать вместо второго? А то IoAttachedDeviceToDeviceStack вертает НУЛЛ. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 20-06-2003 18:39 »  |  | 
 
 Или открыв DRIVER_OBJECT LPT порта и пройтись по всем девайсам им созданным  А что это значит "пройтись по всем девайсам", т.е. какой функцией? И какой функцией можно открыть DRIVER_OBJECT LPT порта? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #12 : 20-06-2003 20:51 »  |  | 
 
 Блин, да в чем проблема имя ты можешь получит через символьную ссылку LPТX или через реестр. А чем IoGetAttachedDeviceReference отличается от IoAttachedDeviceToDeviceStack, и можно ли первое использовать вместо второго? А то IoAttachedDeviceToDeviceStack вертает НУЛЛ.Это разные ф-ции, первая возвращает самый верхний девайс в стеке, получив указатель на любой другой. Вторая включает девайс в стек, при этом изменяет некоторые поля в DEVICE_OBJECT, такие как StackCount- он равен StackCount нижележащего девайса +1, а также DeviceObject->AttachedDevice нижележащего девайса, сделав его равным тому который присоединяют. IoGetAttachedDeviceReference делает вот что for(pUpperDeviceObject = pDeviceObject->AttachedDevice; pUpperDeviceObject != NULL ; pUpperDeviceObject = pUpperDeviceObject->AttachedDevice) {      if(NULL == pUpperDeviceObject->AttachedDevice)             return pUpperDeviceObject;                } |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #13 : 20-06-2003 20:55 »  |  | 
 
  А что это значит "пройтись по всем девайсам", т.е. какой функцией?И какой функцией можно открыть DRIVER_OBJECT LPT порта?
 Читай выше. ObReferenceObjectByName. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #14 : 23-06-2003 14:57 »  |  | 
 
 Понятно.  Громадное спасибо... |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #15 : 23-06-2003 15:13 »  |  | 
 
 У меня родилася гениальная идея: А зачем мне нужны всякие, там IoGetAttachedDeviceReference  IoAttachedDeviceToDeviceStack и т.д.?
 
 Может обойтися только лишь IoGetDeviceObjectPointer, она вертает мне указатель на DeviceObject системного драйвера.
 И вот это самый DeviceObject я и буду пользовать при вызове IoCallDriver.
 Здорово? Да. А получается фигня какая та...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #16 : 23-06-2003 19:10 »  |  | 
 
 У меня родилася гениальная идея: А зачем мне нужны всякие, там IoGetAttachedDeviceReference  IoAttachedDeviceToDeviceStack и т.д.?
 
 Может обойтися только лишь IoGetDeviceObjectPointer, она вертает мне указатель на DeviceObject системного драйвера.
 И вот это самый DeviceObject я и буду пользовать при вызове IoCallDriver.
 Здорово? Да. А получается фигня какая та...
 Еще раз повторю "DeviceObject системного драйвера" не бывает, есть DRIVER_OBJECT и DEVICE_OBJECT- это разные вещи. DRIVER_OBJECT - один для каждого драйвера. DEVICE_OBJECT- может быть сколько угодно(пока память в системе не кончится) Что-то тебя колбасит сегодня. Во первых количество стеков для IRP будет определятся по указателю в верхнем девайсе в стеке, если твой девайс не в стеке и у него неправильный указатель на количество стеков, то создадут IRP, который обвалит систему, ты можешь сам установить StackCount у своего DEVICE_OBJECT. Или придется самому создавать IRP с правильным количеством StackCount. То что ты предложил иногда используют для взаимодействия между драйверами из разных стеков, но очень редко. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 23-06-2003 20:20 »  |  | 
 
  Во первых количество стеков для IRP будет определятся по указателю в верхнем девайсе в стеке, если твой девайс не в стеке и у него неправильный указатель на количество стеков, то создадут IRP, который обвалит систему.
  В общем то  я особо и не надеялся что енто прокатит.  Что-то тебя колбасит сегодня.
 
 Это мне с утра о сроках объявили...   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #18 : 23-06-2003 20:43 »  |  | 
 
 Это мне с утра о сроках объявили...  Так ты сюда пиши, расскажи проблему. Подумаем вместе. Если что-то очень секретное и выставлять не хочешь- напиши в привате. Только я думаю ничего секретного в LPT порте нет. Вон у меня на IA-64 LPT портов уже нет, да и 64 разрядная винда для IA-64 не поддерживает LPT, устарели они. Для AMD 64 не знаю, может и поддерживает. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Артем 
								Опытный    Offline 
								Пол:   
								Beware the wolf in sheep's clothing.
								
								
								
								
								
							 | 
								|  | « Ответ #19 : 24-06-2003 15:55 »  |  | 
 
 Спасибо, Слава, ничего секретного в моей проблеме нету (она в первом постинге описана, только надо добавить что все этот делается под Win2000).
 Я тут только что выгреб кучу обидных ошибок и теперь мой драйвер приатачивается на вершину стека. Этот стек исходит, вроде, из Parallel.sys.
 
 Дальше, собираюсь научиться в самом драйвере создавать Irp-пакеты, и жонглируя запросами типа IOCTL_INTERNAL_PARALLEL_...   попытаться научиться ловить прерывания, когда это удасться моя задача будет решена.
 
 Если это "генеральное" направление не верно, громадная просьба подкорректировать, ну а конкретные вопросы (по мере появления и неразрешения самостоятельно) я конечно же буду кидать сюда.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #20 :  25-06-2003 12:07 »   |  | 
 
  Дальше, собираюсь научиться в самом драйвере создавать Irp-пакеты, и жонглируя запросами типа IOCTL_INTERNAL_PARALLEL_...   попытаться научиться ловить прерывания, когда это удасться моя задача будет решена.
 Чтобы ловить прерывания надо зарегистрироваться на них. Там какой-то INTERNAL запрос для этого есть. На XP драйвер параллельного порта parport.sys создает DRIVER_OBJECT с именем \Driver\parport, на 2k - драйвер parallel.sys создает \Driver\parallel. DEVICE_OBJECT всегда называется \Device\ParallelPortX, где X-номер порта. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |