Mount Volume crash

Тема в разделе "WASM.NT.KERNEL", создана пользователем fedotov, 22 июл 2008.

  1. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    я использую для обработки IRP_MN_MOUNT_VOLUME код примерно такой же как и SFilter, который крешит так же как SFilter, при подключении Usb device.
    Я делаю примерно так (код сокращен для понимания):
    FsControlMountVolume(DeviceObject,Irp) вызывается когда
    (irpStack->MajorFunction == IRP_MJ_FILE_SYSTEM_CONTROL)&&(irpStack->MinorFunction == IRP_MN_MOUNT_VOLUEM)

    Код (Text):
    1.  
    2. NTSTATUS FsControlMountVolume (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
    3. {
    4.     PSD_DEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
    5.     PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );
    6.     PDEVICE_OBJECT newDeviceObject;
    7.     PDEVICE_OBJECT storageStackDeviceObject;
    8.     PSD_DEVICE_EXTENSION newDevExt;
    9.     PFSCTRL_COMPLETION_CONTEXT completionContext;
    10.     KEVENT waitEvent;
    11.    
    12.     storageStackDeviceObject = irpSp->Parameters.MountVolume.Vpb->RealDevice;
    13.  
    14.    // code   don't attach to shadow volums skipped
    15.  
    16.     status = IoCreateDevice( gDriverObject,sizeof( SD_DEVICE_EXTENSION ),NULL,DeviceObject->DeviceType,0,FALSE,
    17.                                                                                                            &newDeviceObject );
    18.    //error handling skipped
    19.  
    20.     newDevExt = newDeviceObject->DeviceExtension;
    21.     newDevExt->StorageStackDeviceObject = storageStackDeviceObject;
    22.  
    23.    KeInitializeEvent( &waitEvent, NotificationEvent, FALSE );
    24.  
    25.    IoCopyCurrentIrpStackLocationToNext ( Irp );
    26.  
    27.    IoSetCompletionRoutine( Irp, FsControlCompletion, &waitEvent,TRUE, TRUE, TRUE );//called by lower driver on completition
    28.  
    29.     status = IoCallDriver( devExt->AttachedToDeviceObject, Irp );
    30.  
    31.    if (STATUS_PENDING == status)
    32.    {
    33.        status = KeWaitForSingleObject( &waitEvent,Executive,KernelMode,FALSE, NULL );
    34.    }
    35.    //we here mounted
    36.    status = FsControlMountVolumeComplete( DeviceObject,Irp,newDeviceObject, &Name );//attach here
    37.     return status;
    38. }
    39. //callback
    40. NTSTATUS FsControlCompletion (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
    41. {
    42.     KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
    43.     return STATUS_MORE_PROCESSING_REQUIRED;
    44. }
    45. //called after volume mounted
    46. NTSTATUS FsControlMountVolumeComplete (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PDEVICE_OBJECT NewDeviceObject,IN PUNICODE_STRING Name)
    47. {
    48.     PVPB vpb;
    49.     PSD_DEVICE_EXTENSION newDevExt;
    50.     PIO_STACK_LOCATION irpSp;
    51.     PDEVICE_OBJECT attachedDeviceObject;
    52.     NTSTATUS status;
    53.  
    54.     newDevExt = NewDeviceObject->DeviceExtension;
    55.     irpSp = IoGetCurrentIrpStackLocation( Irp );
    56.    
    57.     vpb = newDevExt->StorageStackDeviceObject->Vpb;
    58.  
    59.     if (NT_SUCCESS( Irp->IoStatus.Status ))
    60.     {
    61.         ExAcquireFastMutex( &gExtensionListLock );
    62.        
    63.         //check not to attached to volume so far ,skipped
    64.         status = FsAttachToMountedDevice( newDevExt->StorageStackDeviceObject, NewDeviceObject );
    65.         //error handling skipped
    66.  
    67.         //  Release the lock
    68.         ExReleaseFastMutex( &gExtensionListLock );
    69.  
    70.         status = Irp->IoStatus.Status;
    71.  
    72.         IoCompleteRequest( Irp, IO_NO_INCREMENT );
    73.  
    74.         return status;
    75. }
    76. NTSTATUS FsAttachToMountedDevice (IN PDEVICE_OBJECT volumeDeviceObject,IN PDEVICE_OBJECT ourDeviceObject)
    77. {        
    78.     PSD_DEVICE_EXTENSION newDevExt = ourDeviceObject->DeviceExtension;
    79.  
    80.    if(volumeDeviceObject->Flags & DO_BUFFERED_IO)  ourDeviceObject->Flags |= DO_BUFFERED_IO;
    81.    if(volumeDeviceObject->Flags & DO_DIRECT_IO)    ourDeviceObject->Flags |= DO_DIRECT_IO;
    82.  
    83.     //i do 8-attempts, error handling skipped      
    84.     status = (gFuncTbl.AttachDeviceToDeviceStackSafe)( ourDeviceObject,volumeDeviceObject,&(newDevExt->AttachedToDeviceObject));
    85.     ourDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
    86.     return STATUS_SUCCESS;
    87. }
    Креш происходит после вызова AttachDeviceToDeviceStackSafe
    Кто может подсказать в чем тут дело, и если можно расскажите о VPB
     
  2. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    вместо линии
    status = FsAttachToMountedDevice( newDevExt->StorageStackDeviceObject, NewDeviceObject );
    следует читать
    status = FsAttachToMountedDevice( vpb->DeviceObject, NewDeviceObject );


    но это моего вопроса не меняет (результат, что в первом случае, что во втором один и тот же, синий экран)
     
  3. er1ss

    er1ss New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    8
    а какой крэш код у тебя??
     
  4. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    причина то кажется ясна, а уже вошел в сомплетишн рутин, а vpb->Flags бит VPB_MOUNTED ноль, то есть нет Logical Volume для физикл девайса.

    Но почему так и как с этим бороться.
     
  5. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    после того как я выхожу из обработчика, наверное IO manager ставит VPB_MOUNTED бит (я делал pVpb глобальной и смотрел при следующем вызове какого либо объекта)
    Помогите как послать запрос этому же device объекту, но чтобы текущая обработка закончилась, а тот запрос был следующий
     
  6. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    вопрос решен,
    проблема у меня была совсем в другом месте. Код тот что я приводил правильный и бит VPB_MOUNTED так и должен взводиться IO Manager только после возврата из обработчика IRP_MN_MOUNT_VOLUME.