Артем
Опытный
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-номер порта.
|
|
|
Записан
|
|
|
|
|