Даже если драйвер стартует по требованию (типа 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();