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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Снова драйвер фильтр и ошибка 0x000000CE.  (Прочитано 19418 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Pe
Гость
« : 28-06-2005 09:20 » 

Есть не PnP драйвер фильтр. В его диспетчерской процедуре всего стоит IoSkipCurrentIrpStackLocation и IoCallDriver.
Есть и процедура выгрузки, в ней IoDetach, ObDereference и IoDeleteDevice.
Запускается драйвер фильтр, потом запускается IRPTrace, в нем указывается устройство фильтруемого драйвера (не фильтра) , запускается программа User режима, которая обращается к устройству фильтруемого драйвера (не фильтра) .
При попытке выгрузить драйвер фильтр, когда идут IRPs к устройству фильтруемого драйвера (IRPTrace показывает, что идет) возникает ошибка 0x000000CE (DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS) и написано, что она в драйвере фильтре.

Как корректно сделать выгрузку и как сделать корректную выгрузку моего фильтра, если над моим драйвером фильтром висит еще какой - то драйвер фильтр ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 28-06-2005 11:52 » 

Корректная выгрузка фильтра-драйвера невозможна, а тем более если над твоим драйвером фильтром висит сидит еще кто-то! У него же указатель на объекты твоего драйвера! Сначала надо отсоединить объект, который над тобой, что может официально сделать только система если PDO решил исчезнуть, то есть о нем не сообщила при запросе BusRelation.
Записан
Pe
Гость
« Ответ #2 : 28-06-2005 12:47 » 

Во-первых, IRPTracer вроде не присоединяется, он работает вроде как-то по другому. Вроде не меняет адреса обработчиков отслеживаемого драйвера. Как, не знаешь, он работает ?
Во-вторых, такая же ошибка была и когда он не запускался.
В-третьих, как отсоединить объект, который над объектом моего фильтра, при выгрузке моего фильтра или как корректно убрать из stack' a устройство моего фильтра, не нарушив stack ?
Мне нужен способ, работающий на всех NT системах.
« Последнее редактирование: 20-12-2007 19:04 от Алексей1153++ » Записан
Pe
Гость
« Ответ #3 : 28-06-2005 12:48 » 

Может как-то поменять указатель stack' a при выгрузке устройства моего фильтра ?
« Последнее редактирование: 20-12-2007 19:08 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 28-06-2005 12:55 » 

у кого ты его и где менять будешь? Его во внутренних структурах хранят, формат которых тебе неизвестен это раз, второе- уже может быть инициирована посылка IRP на тебя, просто из-за планировщика не успели вызвать твою точку входа, но IoCallDriver уже вызвали, в итоге все упадет с тем же кодом. Нельзя выгружаться и все!
Как работает Irp трасер я естественно знаю, поработай немного с дебагером- и сам поймешь.
!drvobj <имя дравера> 2
« Последнее редактирование: 28-06-2005 12:59 от SlavaI » Записан
Pe
Гость
« Ответ #5 : 29-06-2005 07:55 » 

Смотрел отлвадчиком, эта ошибка на стадии выполнения IoDeleteDevice, там что, с устройством фильтра связан IRP, а в это время происходит удаление устройства ?
SlavaI, как тогда его динамически выгружать ?
Или сделать его таким, как драйвер IRPtrace ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 29-06-2005 08:34 » 

Пока у тебя есть свой объект в стеке, ты удалится не можешь. Можно сделать как IrpTrace но тут тоже проблемы- а если еще кто-то так сделает? А ты выгружаться начнешь, то все упадет- у него адреса твоих точек входа, а у тебя родного драйвера и все упадет.
Записан
Pe
Гость
« Ответ #7 : 29-06-2005 12:19 » 

Если кто-то еще сделает, то можно попробовать поменять точки входа с моего фильтра на точки входа "родного" драйвера.
Можешь рассказать как работает IRPTrace, пока не где поставить SoftIce и нет его.
Он вроде не меняет адреса процедур.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 30-06-2005 10:49 » 

Я не помню как точно работает IRP трасер, там два варианта
1) Он меняет адреса в DRIVER_OBJECT
2) Он использует механизм, который использует DriverVerifier- регистрирует свои ф-ции, которые вызываются вместо стандартных, так как например IoCallDriver работает через вызов ф-ции, адрес которой расположен в таблице ф-ций. Но так можно зарегистрировать только один драйвер.
Записан
Pe
Гость
« Ответ #9 : 30-06-2005 14:43 » 

Вроде 1  и есть 2.
Чем 1 отличается от 2 ?
В 1 случае все понятно, IoGetDeviceObjectPointer и замена адресов, что во 2 ?
Вроде IRPTracer не меняет адреса, смотрел до и после "захвата" им устройства драйвера.
И еще есть один момент, когда IRPTracer "захватил" драйвер, показал все IRPs, которые идут через него, а потом выгрузили и снова загрузили, показывается. Когда у драйвера меняют адреса обработчиков, его выгружают, а потом загружают, адреса уже другие, не те, на которые меняли.
Записан
Pe
Гость
« Ответ #10 : 30-06-2005 14:46 » 

Но IoCallDriver вызывает устройство.
И  если не делать attach, то как на драйвер, который должен перехватывать IRPs, они пойдут ?
Есть примеры 2 ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 30-06-2005 15:13 » 

Ну устройство, а устройством кто управляет? этот IoCallDriver - это будет код твоего драйвера, который сам вызовет родной IoCallDriver если надо будет. Элементарно же.

главный и основной пример пункта 2- driververifier
Записан
Pe
Гость
« Ответ #12 : 30-06-2005 16:50 » 

SlavaI, можешь пример кода привести, если например в диспетчерской процедуре фильтра только IoSkipCurrentIrpStackLocation и IoCallDriver ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 01-07-2005 08:15 » 

берешь DDK и по папке source запускаешь поиск слова IoSkipCurrentIrpStackLocation
Записан
Pe
Гость
« Ответ #14 : 01-07-2005 08:50 » new

SlavaI, ты не понял, пример кода ко 2 пункту, если например в диспетчерской процедуре фильтра только IoSkipCurrentIrpStackLocation и IoCallDriver.
Вообще у меня уже написана диспетчерская процедура с этими функциями.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines