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

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

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 07-11-2005 10:32 » 

Типа DeviceIOControl только для драйверов
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Ochkarik
Модератор

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

« Ответ #1 : 07-11-2005 11:08 » 

NTSTATUS
  IoCallDriver(
    IN PDEVICE_OBJECT  DeviceObject,
    IN OUT PIRP  Irp
    );
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 07-11-2005 11:11 » 

я уже думал использовать эту функцию только вот у меня вопрос возник
Я открываю драйвер через ZWCreateFile и получаю HANDLE, как его преобразовать к PDEVICE_OBJECT?

Или так можно:
PDEVICE_OBJECT pDevObj=hDriver;
?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Ochkarik
Модератор

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

« Ответ #3 : 07-11-2005 11:55 » 

NTSTATUS
  ObReferenceObjectByHandle(
    IN HANDLE  Handle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_TYPE  ObjectType  OPTIONAL,
    IN KPROCESSOR_MODE  AccessMode,
    OUT PVOID  *Object,
    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
    );
кажись....Отлично
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 08-11-2005 04:14 » 

Ага похоже на правду)
Только как я понял  ObReferenceObjectByHandle в вых параметре FILE_OBJECT  если это файл, а если это не файл а какойто device то имя файла равно нулю и тогда нужно смотреть объект DEVICE_OBJECT в FILE_OBJECT
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 08-11-2005 04:39 » 

Возникает тогда другой вопрос)
Лопустим я вызвал IoAllocateIrp а как ее заполнять чтобы потом вызвать
IOCallDriver?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 08-11-2005 04:49 » 

Или лучше использовать IoBuildDeviceIoControlRequest?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
ILIS
Гость
« Ответ #7 : 08-11-2005 12:46 » 

Если у тебя есть DeviceObject драйвера, проще будет использовать IoBuildDeviceIoControlRequest,
целевой драйвер получит IRP_MJ_DEVICE_CONTROL
Записан
Ochkarik
Модератор

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

« Ответ #8 : 08-11-2005 12:57 » 

IoAllocateIrp - используется для размещения любого IRP любому драйверу.. не обязательно тому что в вашем стеке IRP лежит. и позволяет задать размер стека произвольно! на самом деле не произвольно а стока скока указано для адресата... в структуре DeviceObject указано.
IoBuildDeviceIoControlRequest - только в том случае когда отправляешь IRP_MJ_INTERNAL_DEVICE_CONTROL или  IRP_MJ_DEVICE_CONTROL. и ТОЛЬКО для отправки в lower-level drivers!!! (это опять же связано с размером стека)
в DDK же написано! Жаль
если девайс в вашем стеке лежит, тогда зачем его ZWCreateFile было открывать? оно же в стеке уже, и указатель там же...

PS для IRP_MJ_POWER - PoCallDriver вместо IoCallDriver.
 еще рекомендую IoMakeAssociatedIrp посмотреть.
« Последнее редактирование: 08-11-2005 13:01 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #9 : 09-11-2005 02:44 » 

А как определить в каком стеке лежит этот девайс? В нашем или нет?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #10 : 09-11-2005 10:06 » 

И вообще что значит lower-level driver? Чем он отличается от остальных?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 09-11-2005 10:36 » 

Ochkarik - раскажи подробнее если мой драйвер будет загружаться сразу после загрузки драйвера с которым я работаю - то это будет lower-level driver для моего драйвера? И как это сделать? DependOnService?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Ochkarik
Модератор

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

« Ответ #12 : 09-11-2005 11:11 » 

что за драйвер, к чему пристыковывается? поподробнее, плс)

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

подробнее читай DDK
Kernel-Mode Driver Architecture ->Design Guide->Windows Driver Model->Types of WDM Drivers.

там же написано как IRP проходят по стеку)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #13 : 09-11-2005 14:54 » 

Ну ладно выяснили значит что это не low-level driver так как мне все таки передать запрос?

Если не прокатит вариант с IoBuildDeviceIoControlRequest то тогда делать так:

1 pIrp=IOAllocateIRP(...)
2 pSp=IoGetCurrentIrpStackLocation(pIrp)
3 pSp->MajorFunction =IRP_MJ_DEVICE_CONTROL
  pSp->Parameters.DeviceIoControl.IoControlCode=ControlCode

4 IOCallDriver?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Ochkarik
Модератор

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

« Ответ #14 : 09-11-2005 15:36 » 

да нет, это как раз твой случай Ага насколько я понял...и тот драйвер которому ты хочешь слать контролы указан в DeviceObject->LowerDevice
 в этом слуае ты можешь:
1. если тебе надо на IRP пришедший к тебе, вызвать один раз драйвер lower-device - ты делаешь SkipCurrentIrpStackLocation или CopyCurr****. устанавливаешь те параметры которых хочешь и отправляешь ниже CallDriver. потом ждешь когда тебе вернут управление (выставляешь комплит процедуру и ждешь если вернули статус PENDING когда вызовут твою комплит) - помоему так тоже можно, но с Контролами я так ни разу не делал... только с ПНП.
пример возьми из рыб нумеги...
2 или IoBuildDeviceIoControlRequest.
3. или IoAllocateIRP/

Запусти DeviceTree из DDK и посмотри сам.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #15 : 10-11-2005 11:12 » 

А можешь дать пример с ПНП?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Ochkarik
Модератор

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

« Ответ #16 : 10-11-2005 12:42 » 

DDK2000\src\general\portio\sys\

  Жаль
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines