DDK\Filespy продолжение темы

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 5 авг 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Опять я и все по тойже теме, с того момента как было начато обсуждение этой темы, я нашел много ошибок в своем коде и вот очередная.

    Хотелось бы услышать ваши советы, что не так происходит и как понимать данное сообщение:
    Код (Text):
    1.  
    2. NTFS_FILE_SYSTEM (24)
    3.     If you see NtfsExceptionFilter on the stack then the 2nd and 3rd
    4.     parameters are the exception record and context record. Do a .cxr
    5.     on the 3rd parameter and then kb to obtain a more informative stack
    6.     trace.
    7. Arguments:
    8. Arg1: 0019025e
    9. Arg2: f903f604
    10. Arg3: f903f25c
    11. Arg4: 8041fb87
    12.  
    13. Debugging Details:
    14. ------------------
    15.  
    16.  
    17. EXCEPTION_RECORD:  f903f604 -- (.exr fffffffff903f604)
    18. ExceptionAddress: 8041fb87 (nt!IopfCallDriver+0x00000031)
    19.    ExceptionCode: c0000005 (Access violation)
    20.   ExceptionFlags: 00000000
    21. NumberParameters: 2
    22. [b]   Parameter[0]: 00000000
    23.    Parameter[1]: 756f72b0[/b]
    24. <font color="red]о чем идет речь?</font><!--color-->Attempt to read from address 756f72b0




    Происходит это при вызове функции SpyPassThrough:


    Код (Text):
    1.  
    2. ...
    3. status = IoCallDriver(
    4.           ((PFILESPY_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedTo  DeviceObject,
    5.                  Irp );
    6. ...
    7.  




    [​IMG] _60559463__message.txt
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    "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" у меня было один раз из-за путаницы этих ф-ций :)))
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Не буду утверждать, но на сколько мне известно
    Код (Text):
    1.  
    2. IoCallDriver STDCALL
    3. IofCallDriver SYSCALL
    4.  


    это одно и тоже, просто IoCallDriver это макрос вызвающий IofCallDriver fastcall

    Быть может все как раз в IRP пакете
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Я был не прав, беру свои слова обратоно, щас попробую.

    И все же мне кажется, в чем-то другом есть проична этого.
     
  5. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Я глянул в оригинальный Filespy.sys и там как раз таки вызывается IofCallDriver. :dntknw:

    Ничего не понимаю.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Точно у тебя НЕТ такого
    Код (Text):
    1.   push Irp
    2.   push DeviceExtension
    3.   call IofCallDriver


    В IofCallDriver должно быть
    Код (Text):
    1.   mov ecx, DeviceExtension
    2.   mov edx, Irp
    3.   call IofCallDriver


    Там параметры передаются через ecx и edx. Хотя C должен скомпоновать правильно...
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    IoCallDriver оболчка над IofCallDriver, а IofCallDriver заглушка (thunk) для Driver Verifier. Истинная функция IopfCallDriver.


    Код (Text):
    1. @IopfCallDriver
    2.     . . .
    3.     call      [eax*4+ecx+38]     <- тут
    4.     . . .
    5.     ret




    На с вот так:


    Код (Text):
    1. 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 - мусор.
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    SteelRat, не DeviceExtension, а DeviceObject!
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Забыл сказать. Возможно, SteelRat и прав насчет "Access violation" и "IRQL not equal or less" вообще, но в твоём случае - это обыкновенная ошибка доступа к отсутствующей памяти, причем в юзер-мод адресах.
     
  10. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F,

    SteelRat, thx.

    щас проверю.