CompletionRoutine

Тема в разделе "WASM.NT.KERNEL", создана пользователем DeeoniS, 30 янв 2007.

  1. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    Имеется драйвер который становится в стек устройств и перехватывает IRP пакеты. Некоторые пакеты нужно перехватить на обратном пути и посмотреть что там внутри них. Делаю так:
    Код (Text):
    1. NTSTATUS
    2. DispatchRoutine(
    3.     PDEVICE_OBJECT HookDevice,
    4.     IN PIRP Irp
    5.     )
    6. {
    7.     BOOLEAN             hookCompletion;
    8.  
    9.     //...
    10.  
    11.     switch (currentIrpStack->MajorFunction)
    12.     {
    13.     case IRP_MJ_CREATE:
    14.         hookCompletion = TRUE;
    15.     break;
    16.  
    17.     default:
    18.         hookCompletion = FALSE;
    19.     break;
    20.     }
    21.     if (hookCompletion)
    22.     {
    23.         IoCopyCurrentIrpStackLocationToNext(Irp);
    24.         IoSetCompletionRoutine( Irp, CompletionRoutine, NULL, TRUE, TRUE, TRUE );
    25.     }
    26.     else
    27.         IoSkipCurrentIrpStackLocation(Irp);
    28.  
    29.     //
    30.     // Return the results of the call to the caller
    31.     //
    32.     return IoCallDriver( hookExt->FileSystem, Irp );
    33. }
    Так вот при вызове IoCallDriver падает, в отладчике пишет следующее:
    Код (Text):
    1. Access violation - code c0000005 (!!! second chance !!!)
    2. sr!SrCreate+0x70:
    3. f994a796 f6422d01         test    byte ptr [edx+0x2d],0x1
    В CompletionRoutine не попадает. Код ее примерно такой:
    Код (Text):
    1. NTSTATUS
    2. CompletionRoutine(
    3.     IN PDEVICE_OBJECT DeviceObject,
    4.     IN PIRP Irp,
    5.     IN PVOID Context
    6.     )
    7. {
    8.     KIRQL                oldirql;
    9.  
    10.     KeAcquireSpinLock(&FStoreMutex, &oldirql);
    11.     if (Irp->IoStatus.Information == FILE_CREATED ||
    12.         Irp->IoStatus.Information == FILE_OVERWRITTEN)
    13.     {
    14.         //....
    15.     }
    16.     else
    17.     {
    18.         //....
    19.     }
    20.     KeReleaseSpinLock(&FStoreMutex, oldirql);
    21.  
    22.     //
    23.     // Now we have to mark Irp as pending if necessary
    24.     //
    25.     if( Irp->PendingReturned )
    26.     {
    27.         IoMarkIrpPending( Irp );
    28.     }
    29.     return Irp->IoStatus.Status;
    30. }
    Если в WinDbg при падении выполнить !analyze -v, то получаю следующее:
    Код (Text):
    1. Unknown bugcheck code (0)
    2. Unknown bugcheck description
    3. Arguments:
    4. Arg1: 00000000
    5. Arg2: 00000000
    6. Arg3: 00000000
    7. Arg4: 00000000
    8.  
    9. Debugging Details:
    10. ------------------
    11.  
    12.  
    13. PROCESS_NAME:  svchost.exe
    14.  
    15. FAULTING_IP:
    16. sr!SrCreate+70
    17. f994a796 f6422d01         test    byte ptr [edx+0x2d],0x1
    18.  
    19. EXCEPTION_RECORD:  ffffffff -- (.exr ffffffffffffffff)
    20. ExceptionAddress: f994a796 (sr!SrCreate+0x00000070)
    21.    ExceptionCode: c0000005 (Access violation)
    22.   ExceptionFlags: 00000000
    23. NumberParameters: 2
    24.    Parameter[0]: 00000000
    25.    Parameter[1]: 0000002e
    26. Attempt to read from address 0000002e
    27.  
    28. ERROR_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>
    29.  
    30. READ_ADDRESS:  0000002e
    31.  
    32. BUGCHECK_STR:  ACCESS_VIOLATION
    33.  
    34. DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE
    35.  
    36. LAST_CONTROL_TRANSFER:  from 804e3d77 to f994a796
    37.  
    38. STACK_TEXT:  
    39. f8000998 804e3d77 81bd7d40 819d5630 819d57dc sr!SrCreate+0x70
    40. f80009a8 f9c5f1ad 819d5640 819442c0 00000000 nt!IopfCallDriver+0x31
    41. f8000a38 f9c61cfb 8189f340 819d5630 8189f340 dtd!DispatchRoutine+0x37d [g:\src\dtd\filemon.c @ 3077]
    42. //.....
    43.  
    44.  
    45. STACK_COMMAND:  kb
    46.  
    47. FOLLOWUP_IP:
    48. dtd!DispatchRoutine+37d [g:\src\dtd\filemon.c @ 3077]
    49. f9c5f1ad 8b4ddc           mov     ecx,[ebp-0x24]
    50.  
    51. FAULTING_SOURCE_CODE:  
    52.   3073:     //
    53.   3074:     // Return the results of the call to the caller
    54.   3075:     //
    55.   3076:     return IoCallDriver( hookExt->FileSystem, Irp );
    56. > 3077: }
    57.  
    58.  
    59. SYMBOL_STACK_INDEX:  2
    60.  
    61. FOLLOWUP_NAME:  MachineOwner
    62.  
    63. SYMBOL_NAME:  dtd!DispatchRoutine+37d
    64.  
    65. MODULE_NAME:  dtd
    66.  
    67. IMAGE_NAME:  dtd.sys
    68.  
    69. DEBUG_FLR_IMAGE_TIMESTAMP:  45bf41cb
    70.  
    71. FAILURE_BUCKET_ID:  ACCESS_VIOLATION_dtd!DispatchRoutine+37d
    72.  
    73. BUCKET_ID:  ACCESS_VIOLATION_dtd!DispatchRoutine+37d
    74.  
    75. Followup: MachineOwner
    76. ---------
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Как видишь,
    падает IoCallDriver.

    Кстати, покажи определение hookExt