mirror of
https://github.com/reactos/reactos.git
synced 2025-05-01 19:50:36 +00:00
- Add BDA filter context to object bag, so that it gets freed automatically later
svn path=/trunk/; revision=42588
This commit is contained in:
parent
c4ba7bb1d8
commit
22769d6876
1 changed files with 48 additions and 0 deletions
|
@ -106,6 +106,43 @@ BdaCreateFilterFactory(
|
||||||
return BdaCreateFilterFactoryEx(pKSDevice, pFilterDescriptor, pBdaFilterTemplate, NULL);
|
return BdaCreateFilterFactoryEx(pKSDevice, pFilterDescriptor, pBdaFilterTemplate, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
FreeFilterInstance(
|
||||||
|
IN PVOID Context)
|
||||||
|
{
|
||||||
|
PBDA_FILTER_INSTANCE_ENTRY InstanceEntry = NULL;
|
||||||
|
PLIST_ENTRY Entry;
|
||||||
|
KIRQL OldLevel;
|
||||||
|
|
||||||
|
/* acquire list lock */
|
||||||
|
KeAcquireSpinLock(&g_Settings.FilterFactoryInstanceListLock, &OldLevel);
|
||||||
|
|
||||||
|
/* point to first entry */
|
||||||
|
Entry = g_Settings.FilterFactoryInstanceList.Flink;
|
||||||
|
|
||||||
|
while(Entry != &g_Settings.FilterFactoryInstanceList)
|
||||||
|
{
|
||||||
|
/* get instance entry from list entry offset */
|
||||||
|
InstanceEntry = (PBDA_FILTER_INSTANCE_ENTRY)CONTAINING_RECORD(Entry, BDA_FILTER_INSTANCE_ENTRY, Entry);
|
||||||
|
|
||||||
|
/* is the instance entry the requested one */
|
||||||
|
if (InstanceEntry == (PBDA_FILTER_INSTANCE_ENTRY)Context)
|
||||||
|
{
|
||||||
|
RemoveEntryList(&InstanceEntry->Entry);
|
||||||
|
FreeItem(InstanceEntry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* move to next entry */
|
||||||
|
Entry = Entry->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release spin lock */
|
||||||
|
KeReleaseSpinLock(&g_Settings.FilterFactoryInstanceListLock, OldLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@implemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
|
@ -141,6 +178,16 @@ BdaCreateFilterFactoryEx(
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* add the item to filter object bag */
|
||||||
|
Status = KsAddItemToObjectBag(FilterFactory->Bag, FilterInstance, FreeFilterInstance);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* destroy filter instance */
|
||||||
|
FreeItem(FilterInstance);
|
||||||
|
KsDeleteFilterFactory(FilterFactory);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* initialize filter instance entry */
|
/* initialize filter instance entry */
|
||||||
FilterInstance->FilterFactoryInstance = FilterFactory;
|
FilterInstance->FilterFactoryInstance = FilterFactory;
|
||||||
FilterInstance->FilterTemplate = (BDA_FILTER_TEMPLATE *)BdaFilterTemplate;
|
FilterInstance->FilterTemplate = (BDA_FILTER_TEMPLATE *)BdaFilterTemplate;
|
||||||
|
@ -154,6 +201,7 @@ BdaCreateFilterFactoryEx(
|
||||||
/* release spin lock */
|
/* release spin lock */
|
||||||
KeReleaseSpinLock(&g_Settings.FilterFactoryInstanceListLock, OldLevel);
|
KeReleaseSpinLock(&g_Settings.FilterFactoryInstanceListLock, OldLevel);
|
||||||
|
|
||||||
|
|
||||||
if (ppKSFilterFactory)
|
if (ppKSFilterFactory)
|
||||||
{
|
{
|
||||||
/* store result */
|
/* store result */
|
||||||
|
|
Loading…
Reference in a new issue