Kife
Помогающий
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
Помогающий
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
Помогающий
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
Помогающий
Offline
|
|
« Ответ #5 : 07-11-2003 09:05 » |
|
И вобще, эта тема тут уже не однократно мусолилась...
Это до меня было, не помню такого А вообще огр. спасибо, щас попробую!
|
|
|
Записан
|
_______ Да поможет нам F1, и да сохранит нас F2 ...
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #6 : 10-11-2003 06:31 » |
|
а) в начале надо сделять IoAllocateIrp (); б) потом заполнить его данными, всякие там inBuffer, OutBuffer (или это все делается в IoBuildAsynchronousFsdRequest()? ) в) потом наверное надо вызвать IoBuildAsynchronousFsdRequest() или IoBuildSynchronousFsdRequest() (а чем они на практике отличаются ? )
Только ты выбери что-то одно- или IoAllocateIrp или IoBuildAsynchronousFsdRequest и т.д. Они взаимоисключающие. IoBuildAsynchronousFsdRequest сам вызовет IoAllocateIrp. И еще все эти ф-ции с именем Fsd в названии уже не имеют никакого отношения к файловым системам- вызывай их смело для своего драйвера. Для примера их использования- запусти поиск по ним в исходниках в DDK. Про стеки-это такой массив структур, указатель на который содержится в IRP и через этот массив передаются параметры драйверам. Для каждого драйвера в цепочке свой стек в IRP, то есть свой элемент в этом массиве.
|
|
|
Записан
|
|
|
|
|
Kife
Помогающий
Offline
|
|
« Ответ #8 : 12-11-2003 13:48 » |
|
Ну дык... ссылка №2, scenario 7 ... нет там ничего об переменной stack... И вообще без этого у меня все работает...
|
|
|
Записан
|
_______ Да поможет нам F1, и да сохранит нас F2 ...
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #9 : 12-11-2003 14:03 » |
|
нет там ничего об переменной stack
Это ты к чему? Типа мы тут сказки рассказываем? Просто IO_STACK_LOCATION для драйвера на который ты запрос шлешь, заполняет за тебя функция IoBuildDeviceIoControlRequest. И вообще без этого у меня все работает
Без стеков что-ли?
|
|
|
Записан
|
|
|
|
Kife
Помогающий
Offline
|
|
« Ответ #10 : 12-11-2003 21:00 » |
|
Это ты к чему? Типа мы тут сказки рассказываем? Просто 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
Главный специалист
Offline
|
|
« Ответ #11 : 13-11-2003 06:11 » |
|
Однако точно также и без него работает... и в примере от Мелкософта нет строки stack = IoGetNextIrpStackLocation(pIrp);
CrashMaker взял указатель на стек для того, чтобы изменить или добавить некоторые параметры. Если устраивают параметры по умолчанию, которые заносит в IrpStack ф-ция IoBuildDeviceIoControlReques, на основе переданных ей аргументров, то можно такого не делать.
|
|
|
Записан
|
|
|
|
Kife
Помогающий
Offline
|
|
« Ответ #12 : 13-11-2003 10:57 » |
|
ааа! ясно. понял. спасибо!
|
|
|
Записан
|
_______ Да поможет нам F1, и да сохранит нас F2 ...
|
|
|
|