diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index dd0f3033112..05c1093c08e 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -18,9 +18,11 @@ KsAcquireResetValue( } /* - @unimplemented + @implemented */ -KSDDKAPI VOID NTAPI +KSDDKAPI +VOID +NTAPI KsAddIrpToCancelableQueue( IN OUT PLIST_ENTRY QueueHead, IN PKSPIN_LOCK SpinLock, @@ -28,7 +30,26 @@ KsAddIrpToCancelableQueue( IN KSLIST_ENTRY_LOCATION ListLocation, IN PDRIVER_CANCEL DriverCancel OPTIONAL) { - UNIMPLEMENTED; + PQUEUE_ENTRY Entry; + + if (!QueueHead || !SpinLock || !Irp) + return; + + Entry = ExAllocatePool(NonPagedPool, sizeof(QUEUE_ENTRY)); + if (!Entry) + return; + + ///FIXME + // setup cancel routine + // + + Entry->Irp = Irp; + + if (ListLocation == KsListEntryTail) + ExInterlockedInsertTailList(QueueHead, &Entry->Entry, SpinLock); + else + ExInterlockedInsertHeadList(QueueHead, &Entry->Entry, SpinLock); + } /* @@ -607,18 +628,60 @@ KsReleaseIrpOnCancelableQueue( } /* - @unimplemented + @implemented */ -KSDDKAPI PIRP NTAPI +KSDDKAPI +PIRP +NTAPI KsRemoveIrpFromCancelableQueue( IN OUT PLIST_ENTRY QueueHead, IN PKSPIN_LOCK SpinLock, IN KSLIST_ENTRY_LOCATION ListLocation, IN KSIRP_REMOVAL_OPERATION RemovalOperation) { - UNIMPLEMENTED; - return NULL; - /*return STATUS_UNSUCCESSFUL; */ + PQUEUE_ENTRY Entry = NULL; + PIRP Irp; + KIRQL OldIrql; + + if (!QueueHead || !SpinLock) + return NULL; + + if (ListLocation != KsListEntryTail && ListLocation != KsListEntryHead) + return NULL; + + if (RemovalOperation != KsAcquireOnly && RemovalOperation != KsAcquireAndRemove) + return NULL; + + KeAcquireSpinLock(SpinLock, &OldIrql); + + if (!IsListEmpty(QueueHead)) + { + if (RemovalOperation == KsAcquireOnly) + { + if (ListLocation == KsListEntryHead) + Entry = (PQUEUE_ENTRY)QueueHead->Flink; + else + Entry = (PQUEUE_ENTRY)QueueHead->Blink; + } + else if (RemovalOperation == KsAcquireAndRemove) + { + if (ListLocation == KsListEntryTail) + Entry = (PQUEUE_ENTRY)RemoveTailList(QueueHead); + else + Entry = (PQUEUE_ENTRY)RemoveHeadList(QueueHead); + } + } + KeReleaseSpinLock(SpinLock, OldIrql); + + if (!Entry) + return NULL; + + Irp = Entry->Irp; + + if (RemovalOperation == KsAcquireAndRemove) + ExFreePool(Entry); + + return Irp; } /* diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 625b7d05b5b..68a563c7747 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -39,6 +39,11 @@ typedef struct }DEVICE_EXTENSION, *PDEVICE_EXTENSION; +typedef struct +{ + LIST_ENTRY Entry; + PIRP Irp; +}QUEUE_ENTRY, *PQUEUE_ENTRY; #endif diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index 335f9334a21..9ab60801728 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -40,7 +40,7 @@ KspCreateObjectType( Status = IoCreateFile(NodeHandle, DesiredAccess, &ObjectAttributes, - &IoStatusBlock, + &IoStatusBlock, NULL, 0, 0,