Сейчас на форуме: tyns777 (+5 невидимых) |
eXeL@B —› Программирование —› DeviceIoControl и METHOD_OUT_DIRECT |
Посл.ответ | Сообщение |
|
Создано: 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. |
|
Создано: 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. |
|
Создано: 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. |
|
Создано: 22 апреля 2010 16:09 · Личное сообщение · #4 Да дело в этом тоже, просто ошибок наляпал кучу да и всё. В частности, "одновременная установка флагов DO_BUFFERED_IO и DO_DIRECT_IO запрещена и будет являться ошибкой", хыть бы почитал, что ли. А ссылок... в гугле забанили? Хотя бы цикл этих статей |
|
Создано: 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. |
|
Создано: 22 апреля 2010 17:07 · Личное сообщение · #6 |
|
Создано: 22 апреля 2010 17:20 · Личное сообщение · #7 Ничуть не предвзято. Просто я помню прекрасно, как я сам разбирался в своих проблемах недели по 3, не задавая вопросов. И сложности были явно более замороченные. И не понимаю людей, которые не могут слазить в гугл, почитать мсдн и отладить собственные 20 строчек кода. Надо то по сути сделать правильно вызов DeviceIoControl и хоть откуда-нибудь содрать создание девайса с линком. Ещё и сорцы не соответствуют дрову, кстати. |
|
Создано: 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. |
|
Создано: 22 апреля 2010 19:30 · Личное сообщение · #9 |
|
Создано: 22 апреля 2010 20:42 · Поправил: ARCHANGEL · Личное сообщение · #10 |
|
Создано: 22 апреля 2010 21:16 · Личное сообщение · #11 |
|
Создано: 22 апреля 2010 22:11 · Поправил: ARCHANGEL · Личное сообщение · #12 |
|
Создано: 26 апреля 2010 17:20 · Личное сообщение · #13 Странно - пример из WDK работате прекрасно, а почти такой же код (практически один в один) у меня в вызывающем драйвер приложении нифига не пашет. Вот 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. |
|
Создано: 27 апреля 2010 08:18 · Поправил: obfuskator · Личное сообщение · #14 |
|
Создано: 27 апреля 2010 12:59 · Личное сообщение · #15 |
|
Создано: 27 апреля 2010 13:04 · Личное сообщение · #16 А воспользоваться поиском по файлам DDK слабо? Code:
З.Ы. дофига большие буферы могут не маппиться из-за лимита системных PTE ----- PGP key |
|
Создано: 27 апреля 2010 13:21 · Личное сообщение · #17 |
eXeL@B —› Программирование —› DeviceIoControl и METHOD_OUT_DIRECT |