> На данный момент удаление файлов/ключей реестра. А тут > всякие HKLM\Software появляются непонятно когда..
Их кажись монтирует smss. У него даже вызов специальный есть NtInitializeRegistry(). Кстати, тоже системный сервис, а следовательно легко перехватывается, а значит можно очень точно отловить момент появления реестра.
> [UPD] > Похоже с файлами проблема решена. Удалять их можно и из > boot-time (по кр мере если драйвер в Base группе). Только > делать это надо по путям типа \Device\HarddiskVolume1\....
Вот это странно. Я специально ставил драйвер в boot но после ftdisk-а.
Так вот, при инициализации ftdisk создает всего одно устройство - FtControl, когда вызывался мой DriverEntry ни одного HarddiskVolume еще не было. Появлялись они уже после того как винда проинициализировала все boot-драйвера и начала рассылать IRP_MN_ENUMERATE_DEVICE_RELATIONS. Более того, симлинки в \GLOBAL??\ (эти самые C:, D: и т.д.) создаются одновременно с самими девайсами (в той же самой FtpPartitionArrived).
Ты уверен, что именно boot-драйверу доступны HarddiskVolume?
[Win32] Загрузка системы: переход из boot в system09.01.06 14:25 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 09.01.06 14:26 Количество правок: 1
Есть драйвер, который грузится в BOOT.
Вопрос/утверждение №1: На этом этапе файловые системы смонтированы read-only. И то лишь частично (SystemRoot)...
Вопрос №2: А как получить нотификейшн о том что зыгрузка системы перешла из стадии boot и файловая система стала доступна на запись? Причем без создания треда который будет периодически проверять..
> Есть драйвер, который грузится в BOOT. > Вопрос/утверждение №1: На этом этапе файловые системы > смонтированы read-only. И то лишь частично (SystemRoot)... > Вопрос №2: А как получить нотификейшн о том что зыгрузка > системы перешла из стадии boot и файловая система стала > доступна на запись? Причем без создания треда который будет > периодически проверять..
вопрос2: запускай дополнительный драйвер запускающийся как system и имеющий единственную функцию - сигнализировать первому и выйти.
вариант - делай waitforsingleobject для какого-нибудь объекта ядра, который освобождается при переходе в system.
Пока примерно так и собираюсь делать, но некрасиво это...09.01.06 15:15 Автор: Killer{R} <Dmitry> Статус: Elderman
> вопрос2: запускай дополнительный драйвер запускающийся как > system и имеющий единственную функцию - сигнализировать > первому и выйти. Пока примерно так и собираюсь делать, но некрасиво это как-то..
> вариант - делай waitforsingleobject для какого-нибудь > объекта ядра, который освобождается при переходе в system. А какого например?
Зато что называется "System friendly" :-)09.01.06 17:08 Автор: amirul <Serge> Статус: The Elderman
Предложу пару "неправильных" (но возможно более красивых) вариантов:
1. Стать upper фильтром у класса "Дисковые Устройства". К тому моменту, когда вызовут твой AddDevice, девайс HarddiskVolumeX будет уже создан. Создавать и пихать на стек что-то свое вовсе необязательно
2. Во время инициализации заменить AddDevice какому нибудь фильтру "Дисковых Устройств" (например PartMgr-у). Главное чтоб твой драйвер проинициализировался позже этого самого фильтра (легко настраивается при помощи тегов и зависимостей). При входе в AddDevice нижние устройства (те самые HarddiskVolumeX) уже созданы, а при выходе над ними еще и фильтр торчит.
3. При инициализации перехватить IRP_MJ_PNP у PartMgr-а. После завершения IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS устройства будут созданы.
4. Фильтровать IRP_MJ_INTERNAL_DEVICE_CONTROL на предмет IoControlCode == 0x00760000 (Partition Arrived)
В общем отловить момент создания стека нужного устройства. Создается оно уже с проинициализированным, но не примаунченным VPB и при первой же попытке открыть файл на этом устройстве маунтится в IoCheckVpbMounted (которая вызывается из Parse процедуры - IopParseDevice). Из всех способов рекомендую остановиться на тех, которые позволяют отловить создание ВСЕГО стека, а не только самого HarddiskVolume (как по мне, лучше всего первый вариант)
Еще интересно узнать, что именно ты хочешь получить. Может получится перепоставить задачу, чтоб таких извращений не требовалось?
Получить хочу драйвер для удаления спайваров на макимально...09.01.06 17:21 Автор: Killer{R} <Dmitry> Статус: Elderman
> Еще интересно узнать, что именно ты хочешь получить. Может > получится перепоставить задачу, чтоб таких извращений не > требовалось? Получить хочу драйвер для удаления спайваров на макимально ранний момент. Вернее драйвер уже получил, причем прописывается он три раза - на boot, system и auto. Первый загружается, предосталяет интерфейс и работает. Другие два чисто при загрузке делают что надо и выходят из DriverEntry с STATUS_UNSUCCESSFUL. Особенно некрасиво то что каждому драйверу пришлось делать отдельный файл. Тк один файл на всех винда отказывается грузить, видно видит что такой файл уже промаплен как другой драйвер и ругается. Кстати отдельный вопрос - насколько безопасно удалять/подменять .sys файл драйвера после того как он загрузился?
Вот это "что надо" и интересно.09.01.06 18:08 Автор: amirul <Serge> Статус: The Elderman
> > Еще интересно узнать, что именно ты хочешь получить. > Может > > получится перепоставить задачу, чтоб таких извращений > не > > требовалось? > Получить хочу драйвер для удаления спайваров на макимально > ранний момент. Вернее драйвер уже получил, причем > прописывается он три раза - на boot, system и auto. Первый > загружается, предосталяет интерфейс и работает. Другие два > чисто при загрузке делают что надо и выходят из DriverEntry
Вот это "что надо" и интересно.
> с STATUS_UNSUCCESSFUL. Особенно некрасиво то что каждому > драйверу пришлось делать отдельный файл. Тк один файл на > всех винда отказывается грузить, видно видит что такой файл > уже промаплен как другой драйвер и ругается. Кстати
Так может тебе NtLoadDriver перехватить? Практически уверен, что отлуп ты получаешь уже внутри, но внутрь тебе не особо и надо. На входе ты получишь путь в реестре к ветке с твоим сервисом. Вот и создай MySystemService и MyAutoService, а в захученном NtLoadDriver-е проверяй DriverServiceName и если запускается нужный сервис, делай работу и выходи со своим неудачным статусом.
> отдельный вопрос - насколько безопасно удалять/подменять > .sys файл драйвера после того как он загрузился?
Совершенно безопасно. Переименовать и вместо него писать что угодно. Так можно заменить даже ntoskrnl.exe (только система потом может отказаться грузиться). Да, еще вполне возможно придется побороться с SFC, но это уже второй трудный вопрос :-)
На данный момент удаление файлов/ключей реестра. А тут... [UPD]09.01.06 18:19 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 09.01.06 18:35 Количество правок: 1
> Первый > > загружается, предосталяет интерфейс и работает. Другие > два > > чисто при загрузке делают что надо и выходят из > DriverEntry > > Вот это "что надо" и интересно. На данный момент удаление файлов/ключей реестра. А тут всякие HKLM\Software появляются непонятно когда..
> работу и выходи со своим неудачным статусом. > > > отдельный вопрос - насколько безопасно > удалять/подменять > > .sys файл драйвера после того как он загрузился? > > Совершенно безопасно. Переименовать и вместо него писать > что угодно. Так можно заменить даже ntoskrnl.exe (только > система потом может отказаться грузиться). Да, еще вполне > возможно придется побороться с SFC, но это уже второй > трудный вопрос :-) Ну это я вообще сам себя хочу удалять так. Так что нам не страшен SFC Ж)
[UPD]
Похоже с файлами проблема решена. Удалять их можно и из boot-time (по кр мере если драйвер в Base группе). Только делать это надо по путям типа \Device\HarddiskVolume1\....
Странно09.01.06 18:55 Автор: amirul <Serge> Статус: The Elderman
> На данный момент удаление файлов/ключей реестра. А тут > всякие HKLM\Software появляются непонятно когда..
Их кажись монтирует smss. У него даже вызов специальный есть NtInitializeRegistry(). Кстати, тоже системный сервис, а следовательно легко перехватывается, а значит можно очень точно отловить момент появления реестра.
> [UPD] > Похоже с файлами проблема решена. Удалять их можно и из > boot-time (по кр мере если драйвер в Base группе). Только > делать это надо по путям типа \Device\HarddiskVolume1\....
Вот это странно. Я специально ставил драйвер в boot но после ftdisk-а.
Так вот, при инициализации ftdisk создает всего одно устройство - FtControl, когда вызывался мой DriverEntry ни одного HarddiskVolume еще не было. Появлялись они уже после того как винда проинициализировала все boot-драйвера и начала рассылать IRP_MN_ENUMERATE_DEVICE_RELATIONS. Более того, симлинки в \GLOBAL??\ (эти самые C:, D: и т.д.) создаются одновременно с самими девайсами (в той же самой FtpPartitionArrived).
Ты уверен, что именно boot-драйверу доступны HarddiskVolume?
Я собственнно это не с балды решил так..09.01.06 19:05 Автор: Killer{R} <Dmitry> Статус: Elderman
а посмотрел код IoInitSystem в win2k\private\ntos\io\ioinit.c
Хотя учту. Проверю это дело под разными виндами
> > На данный момент удаление файлов/ключей реестра. А тут > > всякие HKLM\Software появляются непонятно когда.. > > Их кажись монтирует smss. У него даже вызов специальный > есть NtInitializeRegistry(). Кстати, тоже системный сервис, > а следовательно легко перехватывается, а значит можно очень > точно отловить момент появления реестра. Угу. Но я пока возлагаю надежды на ZwNotifyChangeKey.
Нашел самый правильный способ отлавливания момента доступности дисков [upd]10.01.06 13:10 Автор: amirul <Serge> Статус: The Elderman Отредактировано 10.01.06 13:17 Количество правок: 1
> а посмотрел код IoInitSystem в > win2k\private\ntos\io\ioinit.c > Хотя учту. Проверю это дело под разными виндами
Насчет того, что симлинки создаются прямо в ftdisk-е это соврал. Вернее симлинки создаются, но я не посмотрел какие. А создается там симлинк \Device\Harddisk0\Volume1 -> \Device\HarddiskVolume1
Симлинки же в \DosDevices\ создаются в MountMgr.sys
Происходит это сразу после реэнумерации устройств в PartMgr-е (еще до выхода из IopInitializeBootDrivers) и до начала инициализации системных драйверов (IopInitializeSystemDrivers). Короче сам mount manager получает информацию о новых дисках через нотификацию, зарегистрированную в IoRegisterPlugPlayNotification
Если не хватит MSDN-а, можешь глянуть на код \private\ntos\mountmgr\mountmgr.c на предмет использования или поискать в гугльгруппах
-----------------
Кстати, а где это в IoInitSystem видно, что можно использовать диски (правда не по симлинкам, а напрямую через устройства)? Сами девайсы создаются уже после инициализации ВСЕХ boot-драйверов во время энумерации девайсов, а симлинки к ним, как я уже сказал в MountMgr-е во время нотификации об изменениях в классе "Дисковые устройства"
какого - не знаю. почитай руссиновича и ддк. хотя этот...09.01.06 16:36 Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
> > вопрос2: запускай дополнительный драйвер запускающийся > как > > system и имеющий единственную функцию - > сигнализировать > > первому и выйти. > Пока примерно так и собираюсь делать, но некрасиво это > как-то.. > > > вариант - делай waitforsingleobject для какого-нибудь > > объекта ядра, который освобождается при переходе в > system. > А какого например?
какого - не знаю. почитай руссиновича и ддк. хотя этот вариант страдает имхо некроссплатформенностью.