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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Опять системный драйвер LPT...  (Прочитано 27742 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« : 20-06-2003 13:33 » 

Добрый день/ночь.

На старом форуме я уже всем надоедал с подобными вопросами, но мои старания не увенчались успехом, и я вынужден продолжить.

Итак.
Есть железяка которую я хочу вставить в LPT, мне нужно писать/читать ее EPP-моде и ловить прерывания. Меня уже убедили в том, что надо поставить свой драйвер в стек исходящий из системного драйвера.
И вот проблема--как узнать DeviceObject этого самого системного драйвера:?:
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 20-06-2003 13:48 » 

Его тебе передадут при подключении твоего драйвера в AddDevice. Если ты только в реестре свой драйвер правильно пропишешь, как верхний или нижний фильтр.

P.S. Добавлено:
  У тебя в вопросе путаница- ты написал DeviceObject драйвера, такого не бывает, читай ниже.
Записан
Aleck D.Shadow
Опытный

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

« Ответ #2 : 20-06-2003 13:48 » 

Возможно что-то даст GUID LPT порта он известен.
Посмотри книгу про драйвера на этом сайте.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 20-06-2003 13:58 » 

Как я уже сказал официальный способ- получить в AddDevice, это стандартный способ при присоединении фильтра. Там тебе дадут PDO и можешь пройтись по всему стеку и узнать про все девайсы, что сидят до твоего, далее IoAttachDeviceToDeviceStack и получаешь указатель на девайс прямо под твоим, хотя его ты можешь получить и просто поднявшись по всем девайсам, начиная с PDO.
Если этот DriverObject нужно достать из отдельного драйвера- то можно через GUID, через драйвер этого девайса, наконец через указатель LPT1(только там ты получишь указатель на самый верхний драйвер в стеке LPT).
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 20-06-2003 14:09 » 

А можно и так IoGetDeviceObjectPointer.
г. Жуковский- а ты не на ФАЛТе случаем учишься?
Записан
SlavaI
Главный специалист

ru
Offline 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. Хотя тут уже про все рассказали.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #6 : 20-06-2003 17:40 » 

Цитата: SlavaI
Как я уже сказал официальный способ- получить в AddDevice, это стандартный способ при присоединении фильтра. Там тебе дадут PDO и можешь пройтись по всему стеку и узнать про все девайсы


 AddDevice это конечно здорово, но если я правильно понял, то эту самую AddDevice дергает PnP-менеджер. А моя железяка в LPT порту не поддерживает PnP.

Цитата: SlavaI
Интересно, а что ты все таки имел в виду- DeviceObject или DriverObject. Хотя тут уже про все рассказали.


Вообще-то я имел ввиду именно DeviceObject, ведь для IoAttachDeviceToDeviceStack нужен именно он. Правда DeviceObject можно получить  IoGetDeviceObjectPointer, но эта функция в свою очередь требует ObjectName (Points to a buffer containing a Unicode string that is the name of the device object.) И тогда появляется вопрос--какой  ObjectName использовать?
Записан
Артем
Опытный

nz
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #8 : 20-06-2003 18:15 » 

P.S. А я ФПФЭ закончил, год назад.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 20-06-2003 18:20 » 

Блин, да в чем проблема имя ты можешь получит через символьную ссылку LPТX или через реестр. Или открыв DRIVER_OBJECT LPT порта и пройтись по всем девайсам им созданным, посмотреть их имена и выбрать нужный порт. Если подубать еще несколько способов можно придумать.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #10 : 20-06-2003 18:35 » 

Цитата: SlavaI
Блин, да в чем проблема имя ты можешь получит через символьную ссылку LPТX или через реестр.

 Я вместо имени использую \\Device\\ParallelPort0 и просто хотел убедиться что мой драйвер не работает не из-за этого.

А чем IoGetAttachedDeviceReference отличается от IoAttachedDeviceToDeviceStack, и можно ли первое использовать вместо второго? А то IoAttachedDeviceToDeviceStack вертает НУЛЛ.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #11 : 20-06-2003 18:39 » 

Цитата: SlavaI
Или открыв DRIVER_OBJECT LPT порта и пройтись по всем девайсам им созданным


 А что это значит "пройтись по всем девайсам", т.е. какой функцией?
И какой функцией можно открыть DRIVER_OBJECT LPT порта?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 20-06-2003 20:51 » 

Цитата: Артем
Цитата: SlavaI
Блин, да в чем проблема имя ты можешь получит через символьную ссылку 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
Главный специалист

ru
Offline Offline

« Ответ #13 : 20-06-2003 20:55 » 

Цитата: Артем
А что это значит "пройтись по всем девайсам", т.е. какой функцией?
И какой функцией можно открыть DRIVER_OBJECT LPT порта?


Читай выше.
ObReferenceObjectByName.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #14 : 23-06-2003 14:57 » 

Понятно.  Громадное спасибо...
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #15 : 23-06-2003 15:13 » 

У меня родилася гениальная идея:
А зачем мне нужны всякие, там IoGetAttachedDeviceReference  IoAttachedDeviceToDeviceStack и т.д.?

Может обойтися только лишь IoGetDeviceObjectPointer, она вертает мне указатель на DeviceObject системного драйвера.
И вот это самый DeviceObject я и буду пользовать при вызове IoCallDriver.
Здорово? Да. А получается фигня какая та...
Записан
SlavaI
Главный специалист

ru
Offline 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.
То что ты предложил иногда используют для взаимодействия между драйверами из разных стеков, но очень редко.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #17 : 23-06-2003 20:20 » 

Цитата: SlavaI

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


 В общем то  я особо и не надеялся что енто прокатит.

Цитата: SlavaI

Что-то тебя колбасит сегодня.


Это мне с утра о сроках объявили... Я шокирован!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #18 : 23-06-2003 20:43 » 

Цитата: Артем

Это мне с утра о сроках объявили... Я шокирован!


Так ты сюда пиши, расскажи проблему. Подумаем вместе. Если что-то очень секретное и выставлять не хочешь- напиши в привате. Только я думаю ничего секретного в LPT порте нет. Вон у меня на IA-64 LPT портов уже нет, да и 64 разрядная винда для IA-64 не поддерживает LPT, устарели они. Для AMD 64 не знаю, может и поддерживает.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #19 : 24-06-2003 15:55 » 

Спасибо, Слава, ничего секретного в моей проблеме нету (она в первом постинге описана, только надо добавить что все этот делается под Win2000).

 Я тут только что выгреб кучу обидных ошибок и теперь мой драйвер приатачивается на вершину стека. Этот стек исходит, вроде, из Parallel.sys.

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

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

ru
Offline 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-номер порта.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines