Pe
Гость
|
|
« : 28-06-2005 09:20 » |
|
Есть не PnP драйвер фильтр. В его диспетчерской процедуре всего стоит IoSkipCurrentIrpStackLocation и IoCallDriver. Есть и процедура выгрузки, в ней IoDetach, ObDereference и IoDeleteDevice. Запускается драйвер фильтр, потом запускается IRPTrace, в нем указывается устройство фильтруемого драйвера (не фильтра) , запускается программа User режима, которая обращается к устройству фильтруемого драйвера (не фильтра) . При попытке выгрузить драйвер фильтр, когда идут IRPs к устройству фильтруемого драйвера (IRPTrace показывает, что идет) возникает ошибка 0x000000CE (DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS) и написано, что она в драйвере фильтре.
Как корректно сделать выгрузку и как сделать корректную выгрузку моего фильтра, если над моим драйвером фильтром висит еще какой - то драйвер фильтр ?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
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
Главный специалист
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
Главный специалист
Offline
|
|
« Ответ #6 : 29-06-2005 08:34 » |
|
Пока у тебя есть свой объект в стеке, ты удалится не можешь. Можно сделать как IrpTrace но тут тоже проблемы- а если еще кто-то так сделает? А ты выгружаться начнешь, то все упадет- у него адреса твоих точек входа, а у тебя родного драйвера и все упадет.
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #7 : 29-06-2005 12:19 » |
|
Если кто-то еще сделает, то можно попробовать поменять точки входа с моего фильтра на точки входа "родного" драйвера. Можешь рассказать как работает IRPTrace, пока не где поставить SoftIce и нет его. Он вроде не меняет адреса процедур.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
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
Главный специалист
Offline
|
|
« Ответ #11 : 30-06-2005 15:13 » |
|
Ну устройство, а устройством кто управляет? этот IoCallDriver - это будет код твоего драйвера, который сам вызовет родной IoCallDriver если надо будет. Элементарно же.
главный и основной пример пункта 2- driververifier
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #12 : 30-06-2005 16:50 » |
|
SlavaI, можешь пример кода привести, если например в диспетчерской процедуре фильтра только IoSkipCurrentIrpStackLocation и IoCallDriver ?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #13 : 01-07-2005 08:15 » |
|
берешь DDK и по папке source запускаешь поиск слова IoSkipCurrentIrpStackLocation
|
|
|
Записан
|
|
|
|
Pe
Гость
|
|
« Ответ #14 : 01-07-2005 08:50 » |
|
SlavaI, ты не понял, пример кода ко 2 пункту, если например в диспетчерской процедуре фильтра только IoSkipCurrentIrpStackLocation и IoCallDriver. Вообще у меня уже написана диспетчерская процедура с этими функциями.
|
|
|
Записан
|
|
|
|
|