Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› DeviceIoControl и METHOD_OUT_DIRECT
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 13:47
· Личное сообщение · #1

Здравия желаю, пишу драйвер, который обменивается данными с приложением посредством IRP_MJ_DEVICE_CONTROL. Для обмена инфой выбран метод METHOD_DIRECT, поскольку буферизированный в данном случае - не достаточно быстр. Более конкретно - METHOD_OUT_DIRECT. Я, честно говоря, раньше его никогда не использовал, но подчитал литературу и решил применить на практике. Тем не менее, имею весьма странную ошибку ERROR_NOACCESS при вызове DeviceIoControl. Остальные IRP обрабатываются заглушкой, и притом успешно, т.е. CreateFile возвращает дескриптор. Более того, я ставил бряки на обработчике IRP_MJ_DEVICE_CONTROL, и тут выяснилось, что этот обработчик в драйвере даже не вызывается! Он вызывался лишь в том случае, если InputBuffer и OutputBuffer были равны NULL. В случае же, если выходной буфер имел осмысленное значение - то нет. Перелистал всю доступную мне литературу и ничего по этому поводу не нашёл. Может, кто что знает - помогите советом. Приложение и драйвер - в аттаче.

a098_22.04.2010_CRACKLAB.rU.tgz - Release_Driver.rar

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 апреля 2010 15:03
· Личное сообщение · #2

lpBytesReturned
Pointer to a variable that receives the size, in bytes, of the data stored into the buffer pointed to by lpOutBuffer.
If lpOverlapped is NULL, lpBytesReturned cannot be NULL.

Лень мсдн почитать? Уже который драйвер пишешь, при этом всю отладку сваливаешь сюда, уже несколько активных топиков. Чукча не любитель отлаживать, чукча писатель? А отлаживать нам за тебя? То же самое и прошлого топика касается, кстати. Сорцов всё равно не выложил. Бери да отлаживай, принципиальных проблем не вижу. Кстати, это не единственный косяк, походу. Да и сорцов на это в инете полно.
З.Ы. Если хочешь быстро-не гоняй IRP.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 15:36
· Личное сообщение · #3

Archer пишет:
If lpOverlapped is NULL, lpBytesReturned cannot be NULL

Дело не в этом - и так тоже пробовал, но всё равно ERROR_NOACCESS. А исходники? Так щас выложу, если только это поможет решению проблемы.

Кстати, это не единственный косяк, походу
Походу. Да только где ещё косяки?

Да и сорцов на это в инете полно
Ну хоть бы ссылку дал, что ли, а то только чукчей обзываться...


0a45_22.04.2010_CRACKLAB.rU.tgz - code.c

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 апреля 2010 16:09
· Личное сообщение · #4

Да дело в этом тоже, просто ошибок наляпал кучу да и всё.
В частности, "одновременная установка флагов DO_BUFFERED_IO и DO_DIRECT_IO запрещена и будет являться ошибкой", хыть бы почитал, что ли.
А ссылок... в гугле забанили? Хотя бы цикл этих статей http://www.wasm.ru/article.php?article=drvw2k05 или вообще, что гуглится http://www.blagin.ru/articles/driver4.html




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 16:49
· Личное сообщение · #5

Archer пишет:
одновременная установка флагов DO_BUFFERED_IO и DO_DIRECT_IO запрещена и будет являться ошибкой

Дык я и почитал мсдн:
ULONG Flags
Device drivers OR this field in their newly created device objects with one or more of the following system-defined values:
DO_BUFFERED_IO or DO_DIRECT_IO
Higher-level drivers OR the field with the same value as the next-lower driver, except possibly for highest-level drivers.


Правда, потом прочёл, что это поле нужно лишь для запросов посредством ReadFile/WriteFile и в DeviceIoControl не используется. Тем не менее, даже без этой строчки не работает! Я её вообще в конце самом добавил, когда уже ничего не помогало.

А ссылок... в гугле забанили?

Блин, а чё там писать? Посмотри, куда ведут ссыли по запросу METHOD_OUT_DIRECT!!!

Хотя бы цикл этих статей www.wasm.ru/article.php?article=drvw2k05

Там вот такое написано про прямой метод передачи данных:
Я не буду подробно рассматривать этот вид управления, т.к. в контексте данных статей ему нет применения

Во второй ссылке вообще METHOD_NEITHER рассматривается!

Archer
При всём почтении, вы почему-то предвзято относитесь к моим постам.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 61.4 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 22 апреля 2010 17:07
· Личное сообщение · #6

www.codeproject.com/KB/system/driverdev2.aspx




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 апреля 2010 17:20
· Личное сообщение · #7

Ничуть не предвзято. Просто я помню прекрасно, как я сам разбирался в своих проблемах недели по 3, не задавая вопросов. И сложности были явно более замороченные. И не понимаю людей, которые не могут слазить в гугл, почитать мсдн и отладить собственные 20 строчек кода. Надо то по сути сделать правильно вызов DeviceIoControl и хоть откуда-нибудь содрать создание девайса с линком. Ещё и сорцы не соответствуют дрову, кстати.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 18:53 · Поправил: ARCHANGEL
· Личное сообщение · #8

Полез отладчиком в недра NtDeviceIoControlFile и выяснил, что после успешного создания MDL через IoAllocateMdl происходит сбой при выполнении MmProbeAndLockPages, т.е. получается, что страницы, которые я передаю в качестве выходного буфера, попросту do not support the specified operation. Странно, почему такое может происходить? Ведь страницы имеют атрибут доступа PAGE_READWRITE?

Добавлено:
Изменил атрибуты выходного буфера на PAGE_EXECUTE_READWRITE - та же фигня - ничего не пашет и тот же сбой. Ничего не пойму

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 22 апреля 2010 19:30
· Личное сообщение · #9

ARCHANGEL В DDK я находил очень хороший пример работы с METHOD_OUT_DIRECT

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 20:42 · Поправил: ARCHANGEL
· Личное сообщение · #10

Coderess
Нашёл этот пример. Но там буфер, который передаётся в драйвер в качестве выходного, не выделяется вызовом VirtualAlloc, а объявляется внутри программы. А как быть именно с VirtualAlloc?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 22 апреля 2010 21:16
· Личное сообщение · #11

VirtualLock пробовал?

-----
старый пень





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 22 апреля 2010 22:11 · Поправил: ARCHANGEL
· Личное сообщение · #12

r_e
Пробовал, результат тот же.

Может это специально так сделано, чтоб в виртуальной памяти нельзя было делать прямой вывод, и нужно, чтоб атрибут IMAGE стоял на странице, которая описывается MDL?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 апреля 2010 17:20
· Личное сообщение · #13

Странно - пример из WDK работате прекрасно, а почти такой же код (практически один в один) у меня в вызывающем драйвер приложении нифига не пашет. Вот --> Здесь <-- описан псевдокод функции MmProbeAndLockPages, но как написано в MSDN:

An MDL structure is a partially-opaque structure that represents a memory descriptor list (MDL).

А в псевдокоде подразумевается, что MDL не такая уж и закрытая структура. Но вод где взять её описание?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 30.5 (посетитель), 5thx
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2010 08:18 · Поправил: obfuskator
· Личное сообщение · #14

ARCHANGEL пишет:
MDL не такая уж и закрытая структура. Но вод где взять её описание?

в ntddk.h смотрел?

Add. ARCHANGEL У меня в ntddk.h описана




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 апреля 2010 12:59
· Личное сообщение · #15

obfuskator

Послушался совета и посмотрел - нету Блин, что за незадача? Драйвер-то весьма простой, по сути.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 27 апреля 2010 13:04
· Личное сообщение · #16

А воспользоваться поиском по файлам DDK слабо?

Code:
  1. typedef __struct_bcount(Size) struct _MDL {
  2.     struct _MDL *Next;
  3.     CSHORT Size;
  4.     CSHORT MdlFlags;
  5.     struct _EPROCESS *Process;
  6.     PVOID MappedSystemVa;
  7.     PVOID StartVa;
  8.     ULONG ByteCount;
  9.     ULONG ByteOffset;
  10. } MDL, *PMDL;


З.Ы. дофига большие буферы могут не маппиться из-за лимита системных PTE

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 апреля 2010 13:21
· Личное сообщение · #17

ntldr

У меня-то всего 0х100 байт первый вызов пытается замаппить, так что должно бы работать. А по поводу поиска по файлам DDK - честно, не надеялся там что-то найти, спасибо.

-----
Stuck to the plan, always think that we would stand up, never ran.



 eXeL@B —› Программирование —› DeviceIoControl и METHOD_OUT_DIRECT
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати