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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отлаживать DriverEntry  (Прочитано 14038 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Treww
Гость
« : 18-04-2005 00:47 » 

Доброго утра всем.

Откомпилил драйвер и запускаю его по требованию, ставлю точку прерывания на DriverEntry, однако отладчик не вываливается на ней.
Народ, подскажите как можно отладить DriverEntry в SoftIce?
Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #1 : 18-04-2005 13:30 » 

Цитата
Откомпилил драйвер и запускаю его по требованию, ставлю точку прерывания на DriverEntry, однако отладчик не вываливается на ней.
А что ты хотел, ведь система при загрузке драйвера немедленно исполняет DriverEntry и все.. больше туда не возвращается, те загрузка неотделима от исполнения Driver Entry! Можно былоб поставить
Hardware breakpoint, но угадать куда система погрузит твой драйвер не лучший вариант.
Если хочешь отладить, пропиши в исходном коде самого дравера _asm int 3; и перед его загрузкой скажи айсу i3here on.
ЗЫ
Так что отладка IOCTLов это совсем другое дело...
« Последнее редактирование: 18-04-2005 13:32 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
dimedrol
Помогающий

ru
Offline Offline

« Ответ #2 : 18-04-2005 14:26 » 

PPS
 драйвер с _asm int 3; надо запускать только при уже запущенном айсе или засунуть бряк внутрь SEH, иначе ничего хорошего не жди..
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Treww
Гость
« Ответ #3 : 18-04-2005 16:10 » 

А что ты хотел, ведь система при загрузке драйвера немедленно исполняет DriverEntry и все.. больше туда не возвращается, те загрузка неотделима от исполнения Driver Entry! Можно былоб поставить
Hardware breakpoint, но угадать куда система погрузит твой драйвер не лучший вариант.
Если хочешь отладить, пропиши в исходном коде самого дравера _asm int 3; и перед его загрузкой скажи айсу i3here on.

Даже если драйвер стартует по требованию (типа Manual), то система все равно выполняет его инициализацию и вызывает DriverEntry?
Вообще ничего не понимаю, а почему его тогда можно удалить потом? Винда загружает драйвер и забывает про файл?! Круто.  :?
Вроде драйвер должен подгрузиться только, когда он будет нужен.

ЗЫ.
Я в шоке...
Это наверно глупо, но скажи чего не правильно написал?

NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObj, PUNICODE_STRING RegistryPath)
{
   
    _asm int 3;       // ругается: syntax error : missing ';' before type

    NTSTATUS code;
    PNOTHING_DEVICE_EXT devExt;
    PDEVICE_OBJECT devObj;

............
« Последнее редактирование: 20-12-2007 21:10 от Алексей1153++ » Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #4 : 18-04-2005 18:29 » new

Цитата
Даже если драйвер стартует по требованию (типа Manual), то система все равно выполняет его инициализацию и вызывает DriverEntry?
Ага.
Цитата
Вообще ничего не понимаю, а почему его тогда можно удалить потом?
А почему нельзя? Система знает достаточно о драйвере чтоб его потом выгрузить. Она не сможет этого сделать лишь в том случае, если DriverObject->DriverUnload не присваивалось указателся
на обработчик выгрузки драйвера,тк предполагается, что в таком случае выгрузка не поддерживается, как например с ntice.sys.
Цитата
Винда загружает драйвер и забывает про файл?! Круто. 
Ну да.. Дефицитная nonpaged системная память занимается а он ничего не делает. Поэтому драйвер при ввыходе из IOCLTHandler часто вызывает MmPageEntireDriver,что переводит его в пейджабельный режим
и система может скинуть его в своп. А при входе - MmResetDriverPaging что опять возвращает его в системную память. Правда этот подход не приемлим например если есть обработчики прерываний итд, но в
этих случаях можно сделать некоторые секции драйвера пейджабельными и лочить/анлочить их по необходимости MmLockpageableCodeSection/MmLockPageableDataSection/MmUnlockPageableImageSection. Весь сыр бор тут из-за того, что некоторые участки кода драйвера могут работать при IRQL >= DISPATCH_LEVEL, и не могут прерываться на подкачку неприсутствующих страниц, если такое случиться то BSOD: вроде PAGE_FAULT_IN_NONPAGED_AREA.

Впрочем, что в системной памяти, что в свопе место он занимает.
Цитата
Вроде драйвер должен подгрузиться только, когда он будет нужен.
ИМХО ты путаешь условные события ON_LOAD и ON_CREATE. ON_LOAD - ето по "net start xxxx" при етом драйвер грузится в память до конца сессии или до "net stop xxxx".
ON_CREATE (IRP_MJ_CREATE) - это например когда юзер делает CreateFile("\\\\.\\xxxx"...), по CloseHandle драйвер всего-лишь обрабатывает(если хочет) IRP_MJ_CLOSE и все.. ничего не выгружается.
Цитата
Я в шоке...
Это наверно глупо, но скажи чего не правильно написал?
Все верно.. Тут компилером явно путается машинная инструкция int c типом int. Уменя на VC++6.0 все рулит.
Попробуй еще _asm{int 3}; или _asm{Int 3}; или DbgBreakPoint();
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Treww
Гость
« Ответ #5 : 19-04-2005 02:25 » 

Все получилось, спасибо.
Первый эксепшн, первый синий экранчик, которого я не испугался стал необработанное исключение.
Аис забыл запустить. Улыбаюсь

Все хорошо, но онимаю что за фигная такая, с си вроде знаком. Жаль

ни _asm int 3;
ни _asm{InT 3};

не работает. Пишет косяк и все. Ни разу такого не видел.
Причем ругается именно на _asm
Сработала только DbgBreakPoint();

Как тогда куски на асме вставлять? Попа. Жаль
« Последнее редактирование: 19-04-2005 02:28 от Treww » Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #6 : 19-04-2005 05:43 » 

Блин, даже не знаю чего сказать.
На память приходит только один случай похожих убийственных глюков, когда траблы с объявлением простого инициализированног массива рещались заменой
расширения с *.c на *.cpp. Я вроде пробовал - у меня и в *.c катит..
Цитата
Причем ругается именно на _asm
Это точно? А то может какой _asm nop; все-таки проходит.. Если пройдет то можно _asm int 3; как-то так написать _asm _emit 0xCC;

Попробуй еще вместо _asm __asm поставить, хотя в чем разница между ними не знаю.
Почитай хелп на компилятор, а то вот я работал в Borland С++ 5.02 - там асмвставки только для 16бит программ.
Самый крайний случай : Можно скомпилить нужные функции на асме и добавить *.obj к проекту.
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
Treww
Гость
« Ответ #7 : 19-04-2005 05:58 » 

Все получилось. Надо было два подчеркивания.

NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObj, PUNICODE_STRING RegistryPath)
{
..................

    __asm
    {
     int 3
     nop
    };
......................


Спасибо за помощь!
Будем дальше копать. Улыбаюсь

ЗЫ
Эксперисент провел.

В билдере от нуля до двух подчеркиваний
В вижуале надо одно или два подчеркивания.
В DDK надо два подчеркивания.

Извращенцы, блин.
Отлично

Записан
dachny
Гость
« Ответ #8 : 19-04-2005 06:44 » 

А че DbgBreakPoint не помогает
Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #9 : 19-04-2005 09:55 » 

dachny, все работает, но
Цитата
Как тогда куски на асме вставлять? Попа.

Цитата
Извращенцы, блин.
Улыбаюсь Теперь всегда буду __asm ставить!
Записан

Как говориться, cемь бед - один Reset Улыбаюсь
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #10 : 22-04-2005 10:30 » 

to dimedrol 

DbgBreakPoint нельзя ловить SEH обработчиками, так как там прерывания буду запрещены при входе в SEH фильтры и обработчик, может упасть, а может повезти и прерывания опять разрешаться.
 
 
Записан
dimedrol
Помогающий

ru
Offline Offline

« Ответ #11 : 22-04-2005 13:22 » 

to SlavaI
Не хочу создавать оффтоп, но нельзя ли чуть подробнее почему.. Просто своими глазами видел такую-вот антиотладочную защиту:
Код:
try
    asm
     int 3
    end;
    //debugger present
    ...
except
    //no debugger
end;
Вроде работает... И в WalterOney Debug and Breakpoint Exception входит в список отлавливаемых... Не понял
PS
Разве любое исключение внутри SEH это не есть прерывание (pagefault,gpf,into..)?
« Последнее редактирование: 22-04-2005 13:36 от dimedrol » Записан

Как говориться, cемь бед - один Reset Улыбаюсь
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 22-04-2005 13:43 » 

to dimedrol

Подробности тут  http://www.osronline.com/article.cfm?article=374
Это баг.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines