Bus Driver & IRP_MJ_INTERNAL_CONTROL

Тема в разделе "WASM.NT.KERNEL", создана пользователем verybig, 6 ноя 2006.

  1. verybig

    verybig New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    4
    привет,

    прошу помощи у двелов.

    пишу вдм сторадж драйвер шины, идентификация проходит нормально, нахожу устройство(диск), система подключает его, стек постоило правильный, все операции проходят нормально, кроме тех которые я ставлю в пендинг. т.е. в IRP_MJ_INTERNAL_CONTROL получаю scsi запрос, для read/write операции возвращаю pending, делаю отложенный вызов, когда операция для этого Irp с read/write в моём драйвере заканчивается, то завершаю запрос (IoCompleteRequest), но при этом класс драйвер пытается либо повторить этот запрос либо зависает(ощущение того что его CompleteRoutine класс драйвера не вызвалась). если завершать запрос не откладывая, то завершается нормально.

    драйвер полностью кастомный, т.е. scsi port не пользую.

    IRP_MJ_INTERNAL_DEVICE_CONTROL(IN PIRP Irp):
    if(IsScsiIrp(Irp))
    {
    if(IsIOSrb(Irp))
    {
    InsertPending(Irp);
    return STATUS_PENDING;
    }
    }


    PENDING_IO_COMPLETE(IN PIRP Irp):
    Srb->SrbStatus = SRB_STATUS_SUCCESS;
    Srb->ScsiStatus = SCSISTAT_GOOD;
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = Srb->DataTransferLength;

    IoCompleteRequest(Irp,IO_DISK_INCREMENT);
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    А что такое InsertPending? В ней вызываешь IoMarkIrpPending?
     
  3. verybig

    verybig New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    4
    нет, в ней не вызывается IoMarkIrpPending.
    в ней ничего особого нету, просто ставит в очередь
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Если драйвер возвращает STATUS_PENDING, то он MUST вызвать IoMarkIrpPending:
    www.osronline.com/DDKx/kmarch/k104_9odu.htm

    (И наоборот, если вызывает IoMarkIrpPending, то должен вернуть STATUS_PENDING)
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Кстати, если IRP передается вниз следующему устройству, и окончание обработки ожидается на событии, то не надо возвращать STATUS_PENDING (см. в той же статье).
     
  6. verybig

    verybig New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    4
    Спасибо дружище, мне помогло.

    Респект тебе gilg
     
  7. visualr

    visualr New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    33
    как узнать кто послал (какой драйвер) IRP_MJ_INTERNAL_CONTROL
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    EvilTwin
    stack location`ы можно посмотреть
     
  9. visualr

    visualr New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    33
    IrpStack = IoGetCurrentIrpStackLocation( Irp );
    DbgPrint("%S", IrpStack->DeviceObject->DriverObject->DriverName.Buffer);

    так ?
    так получается имя текущего драйвера, что я не так делаю?
     
  10. visualr

    visualr New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2005
    Сообщения:
    33
    хоть идею подскажите об определении источника irp пакета
     
  11. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    IrpStack = Irp->Tail.Overlay.CurrentStackLocation + (Irp->StackCount - Irp->CurrentLocation)

    ЗЫ: Верхний драйвер в стеке и будет источником пакета