Buffer = Irp->UserBuffer;
+ KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
if (Fcb->MessageCount > 0)
{
- KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
Entry = RemoveHeadList(&Fcb->MessageListHead);
+ Fcb->MessageCount--;
KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
/* copy current message into buffer */
LengthRead = Message->Size;
ExFreePoolWithTag(Message, 'rFsM');
- Fcb->MessageCount--;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = LengthRead;
return STATUS_SUCCESS;
}
+ else
+ {
+ KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
+ }
Timeout = Fcb->TimeOut;
if (Timeout.HighPart == 0 && Timeout.LowPart == 0)
KeSetTimer(Timer, Timeout, Dpc);
}
- Fcb->WaitCount++;
IoMarkIrpPending(Irp);
return STATUS_PENDING;
KeAcquireSpinLock(&Fcb->MessageListLock, &oldIrql);
InsertTailList(&Fcb->MessageListHead, &Message->MessageListEntry);
- KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
-
Fcb->MessageCount++;
+ KeReleaseSpinLock(&Fcb->MessageListLock, oldIrql);
- if (Fcb->WaitCount > 0)
+ CsqIrp = IoCsqRemoveNextIrp(&Fcb->CancelSafeQueue, NULL);
+ if (CsqIrp != NULL)
{
- CsqIrp = IoCsqRemoveNextIrp(&Fcb->CancelSafeQueue, NULL);
/* FIXME: It is necessary to reset the timers. */
MsfsRead(DeviceObject, CsqIrp);
- Fcb->WaitCount--;
}
Irp->IoStatus.Status = STATUS_SUCCESS;