привет, прошу помощи у двелов. пишу вдм сторадж драйвер шины, идентификация проходит нормально, нахожу устройство(диск), система подключает его, стек постоило правильный, все операции проходят нормально, кроме тех которые я ставлю в пендинг. т.е. в 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);
Если драйвер возвращает STATUS_PENDING, то он MUST вызвать IoMarkIrpPending: www.osronline.com/DDKx/kmarch/k104_9odu.htm (И наоборот, если вызывает IoMarkIrpPending, то должен вернуть STATUS_PENDING)
Кстати, если IRP передается вниз следующему устройству, и окончание обработки ожидается на событии, то не надо возвращать STATUS_PENDING (см. в той же статье).
IrpStack = IoGetCurrentIrpStackLocation( Irp ); DbgPrint("%S", IrpStack->DeviceObject->DriverObject->DriverName.Buffer); так ? так получается имя текущего драйвера, что я не так делаю?
IrpStack = Irp->Tail.Overlay.CurrentStackLocation + (Irp->StackCount - Irp->CurrentLocation) ЗЫ: Верхний драйвер в стеке и будет источником пакета