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

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

by
Offline Offline

« : 05-11-2003 14:47 » 

У меня такой вопрос: (похожее вроде уже обсуждалось )

Пусть есть NDIS Intermediate Driver(1) и просто драйвер kernel-mode(2).
Надо следующее: (1) Собирает IRP и посылает его к (2), причем оба они в стеке не находятся.

на сколько я понимаю тут надо сделать следующее:

а) в начале надо сделять IoAllocateIrp ();
б) потом заполнить его данными, всякие там inBuffer, OutBuffer (или это все делается в IoBuildAsynchronousFsdRequest()? )
в) потом наверное надо вызвать IoBuildAsynchronousFsdRequest() или  IoBuildSynchronousFsdRequest()
(а чем они на практике отличаются ? )

Я все правильно понял? Или что-то забыл?

И еще : драйвер (2) должен обработать данные и вернуть их!!!
Как он это сделает?
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Kife
Помогающий

by
Offline Offline

« Ответ #1 : 05-11-2003 18:16 » 

И еще: какие параметры надо давать в IoAllocateIrp ?
И в IoBuildAsyncronousFsdRequest()? Что там вообще 2 последних параметра значат?
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
maaaaaad
Гость
« Ответ #2 : 05-11-2003 21:12 » 

о=))  я тоже так делал

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

KeInitializeEvent(&SyncEvent,NotificationEvent,FALSE);
pIrp = IoBuildDeviceIoControlRequest(...&SyncEvent...)
stack = IoGetNextIrpStackLocation(pIrp);
настраиваем другие параметры irp (в зависимости от методы буферизации)
code = IoCallDriver(pdx->LowerDeviceObject,pIrp);

можно и AllocateIrp....на старом форуме Slaval говорил, как заполнять поля irp вручную...поищи..

так

а получать PDEVICE_OBJECT нужно с помощью IoGetDeviceObjectPointer, учти что в DDK не все корректно описанно, но я думаю в данном случае это можно и не заметить...

---
млин, у мя руки чешутся написать мини tcp\ip стек, со своим сокет лайером для ядра, а сети нет =))



-------------------------------------------------------
   Как постель худой невесты
   Опостылых улиц плен
   Почему же так тесно
   Что так тесно на Земле?

      Бесконечного спектакля
      Быть свидетелем немым
      И узорами пентакля
      Очарованным

   То тоскует, то смеется
   То резвится на краю
   Если жизнь твоя порвется
   Тебе новую сошьют
   Если жизнь твоя порвется
   Тебе новую сошьют
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #3 : 06-11-2003 11:42 » 

ну да, я так попробовал, через pIrp = IoBuildDeviceIoControlRequest(...&SyncEvent...)
 и
code = IoCallDriver(pdx->LowerDeviceObject,pIrp);


а зачем тогда
stack = IoGetNextIrpStackLocation(pIrp);

Куда эту переменную (stack) потом всунуть?
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
maaaaaad
Гость
« Ответ #4 : 06-11-2003 15:47 » 

никуда не нада. Ее нада настроить. Некоторые параметры (типа размеров входного и выходного буфера, которые, кстати, вроде, должно заполняться  IoBuildDeviceIoControlRequest) хранятся в этой структуре.

И вобще, эта тема тут уже не однократно мусолилась...


   //
   // Buiding and sending DeviceIo req
   //

   KeInitializeEvent(&SyncEvent,NotificationEvent,FALSE);

   // Buid IRP structure
   pIrp = IoBuildDeviceIoControlRequest(
            IOCTL_XUSBF_NEITHER_TEST,pdx->LowerDeviceObject,
            (PVOID) 0x111,0x11, (PVOID) 0x222,0x12,
            FALSE, //TRUE, // Internal DeviceIo Flag
            &SyncEvent,&IoStatus);

   stack = IoGetNextIrpStackLocation(pIrp);

   // Let's set parametrs of the DeviceIo...
   //stack->Parameters.Others.Argument1 = (PVOID) 566;
   pIrp->UserBuffer = (PVOID) 0x900;

   DbgPrint("Sending DeviceIo req\n");
   code = IoCallDriver(pdx->LowerDeviceObject,pIrp);
   if (code == STATUS_PENDING) {
      DbgPrint("STATUS_PENDING returned\n");
      KeWaitForSingleObject(&SyncEvent,Executive,
                     KernelMode, FALSE,NULL);
      code = IoStatus.Status;   
   }

   DbgPrint("IoStatus.Status      = 0x%x\n"
          "IoStatus.Information = 0x%x\n",
          IoStatus.Status, IoStatus.Information);
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #5 : 07-11-2003 09:05 » 

Цитата: CrashMaker
И вобще, эта тема тут уже не однократно мусолилась...


Это до меня было, не помню такого Улыбаюсь

А вообще огр. спасибо, щас попробую!
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 10-11-2003 06:31 » 

Цитата

а) в начале надо сделять IoAllocateIrp ();
б) потом заполнить его данными, всякие там inBuffer, OutBuffer (или это все делается в IoBuildAsynchronousFsdRequest()? )
в) потом наверное надо вызвать IoBuildAsynchronousFsdRequest() или IoBuildSynchronousFsdRequest()
(а чем они на практике отличаются ? )


Только ты выбери что-то одно- или IoAllocateIrp или IoBuildAsynchronousFsdRequest и т.д. Они взаимоисключающие. IoBuildAsynchronousFsdRequest сам вызовет IoAllocateIrp.
И еще все эти ф-ции с именем Fsd в названии уже не имеют никакого отношения к файловым системам- вызывай их смело для своего драйвера. Для примера их использования- запусти поиск по ним в исходниках в DDK.
 Про стеки-это такой массив структур, указатель на который содержится в IRP и через этот массив передаются параметры драйверам. Для каждого драйвера в цепочке свой стек в IRP, то есть свой элемент в этом массиве.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 10-11-2003 06:50 » 

И почитай Walter Oney "Programming WDM" там все это есть. Или вот это

http://support.microsoft.com/default.aspx?scid=kb;EN-US;320275

http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q326315
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #8 : 12-11-2003 13:48 » 

Ну дык... ссылка №2, scenario 7 ... нет там ничего об переменной stack... И вообще без этого у меня все работает...
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 12-11-2003 14:03 » new

Цитата

нет там ничего об переменной stack


Это ты к чему? Типа мы тут сказки рассказываем?
Просто IO_STACK_LOCATION для драйвера на который ты запрос шлешь, заполняет за тебя функция IoBuildDeviceIoControlRequest.

Цитата

И вообще без этого у меня все работает


Без стеков что-ли?
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #10 : 12-11-2003 21:00 » 

Цитата: SlavaI
Цитата


Это ты к чему? Типа мы тут сказки рассказываем?
Просто IO_STACK_LOCATION для драйвера на который ты запрос шлешь, заполняет за тебя функция IoBuildDeviceIoControlRequest.

Без стеков что-ли?


Да нет! Вы мне оч. помогли... просто я к тому, что это не мои строчки кода:

/ Buid IRP structure
pIrp = IoBuildDeviceIoControlRequest(
IOCTL_XUSBF_NEITHER_TEST,pdx->LowerDeviceObject,
(PVOID) 0x111,0x11, (PVOID) 0x222,0x12,
FALSE, //TRUE, // Internal DeviceIo Flag
&SyncEvent,&IoStatus);

stack = IoGetNextIrpStackLocation(pIrp);

// Let's set parametrs of the DeviceIo...
//stack->Parameters.Others.Argument1 = (PVOID) 566;
pIrp->UserBuffer = (PVOID) 0x900;

Тут  типа тоже  IoBuildDeviceIoControlRequest()
... Однако точно также и без него работает... и в примере от Мелкософта нет строки stack = IoGetNextIrpStackLocation(pIrp);
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

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

Цитата

Однако точно также и без него работает... и в примере от Мелкософта нет строки stack = IoGetNextIrpStackLocation(pIrp);


CrashMaker взял указатель на стек для того, чтобы изменить или добавить некоторые параметры. Если устраивают параметры по умолчанию, которые заносит в IrpStack ф-ция IoBuildDeviceIoControlReques, на основе переданных ей аргументров, то можно такого не делать.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #12 : 13-11-2003 10:57 » 

ааа! ясно. понял. спасибо!
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines