Опять я и все по тойже теме, с того момента как было начато обсуждение этой темы, я нашел много ошибок в своем коде и вот очередная. Хотелось бы услышать ваши советы, что не так происходит и как понимать данное сообщение: Код (Text): NTFS_FILE_SYSTEM (24) If you see NtfsExceptionFilter on the stack then the 2nd and 3rd parameters are the exception record and context record. Do a .cxr on the 3rd parameter and then kb to obtain a more informative stack trace. Arguments: Arg1: 0019025e Arg2: f903f604 Arg3: f903f25c Arg4: 8041fb87 Debugging Details: ------------------ EXCEPTION_RECORD: f903f604 -- (.exr fffffffff903f604) ExceptionAddress: 8041fb87 (nt!IopfCallDriver+0x00000031) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 [b] Parameter[0]: 00000000 Parameter[1]: 756f72b0[/b] <font color="red]о чем идет речь?</font><!--color-->Attempt to read from address 756f72b0 Происходит это при вызове функции SpyPassThrough: Код (Text): ... status = IoCallDriver( ((PFILESPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedTo DeviceObject, Irp ); ... _60559463__message.txt
"Access violation" у меня выскакивало иногда если я нахожусь на высоком уровне IRQL>=DISPATH_LEVEL Как это не странно, вместо ошибки типа "IRQL not equal or less" выдается "Access violation" (w2k, в других ОС не знаю) Есть тонкость в работе диспетчера памяти... Как раз связано с этим. Если его поток захватил процессор, до входа в диспетчер драйвера, то выходит "IRQL not equal or less", если не успел, то драйвер может обратиться к странице памяти, выгруженой на диск (не существующей) и тогда "Access violation" Перед IoCallDriver проверь IRQL. Больше ничего в голову не приходит. К стати есть две ф-ции IoCallDriver STDCALL IofCallDriver SYSCALL Проверь какая из них вызывается. Отличаются они только способом передачи параметров. "Access violation" у меня было один раз из-за путаницы этих ф-ций ))
Не буду утверждать, но на сколько мне известно Код (Text): IoCallDriver STDCALL IofCallDriver SYSCALL это одно и тоже, просто IoCallDriver это макрос вызвающий IofCallDriver fastcall Быть может все как раз в IRP пакете
Я был не прав, беру свои слова обратоно, щас попробую. И все же мне кажется, в чем-то другом есть проична этого.
Точно у тебя НЕТ такого Код (Text): push Irp push DeviceExtension call IofCallDriver В IofCallDriver должно быть Код (Text): mov ecx, DeviceExtension mov edx, Irp call IofCallDriver Там параметры передаются через ecx и edx. Хотя C должен скомпоновать правильно...
IoCallDriver оболчка над IofCallDriver, а IofCallDriver заглушка (thunk) для Driver Verifier. Истинная функция IopfCallDriver. Код (Text): @IopfCallDriver . . . call [eax*4+ecx+38] <- тут . . . ret На с вот так: Код (Text): status = pDriverObject->MajorFunction[pStack->MajorFunction]( pDeviceObject, pIrp ) eax = 4 - это IRP_MJ_WRITE ecx = 756f7268 0x756f7268 + 0x38 + 4 * 4 = 0x756F72B0 а на самом деле это должен быть адрес элемента макссива MajorFunction для IRP_MJ_WRITE. Т.е. баг в том, что указатель на DRIVER_OBJECT равен 756f7268. Скорее всего и указатель на девайс, передаваемый в IoCallDriver - мусор.
Забыл сказать. Возможно, SteelRat и прав насчет "Access violation" и "IRQL not equal or less" вообще, но в твоём случае - это обыкновенная ошибка доступа к отсутствующей памяти, причем в юзер-мод адресах.