Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139#include "precomp.h"
#define NDEBUG#include <debug.h>
NTSTATUSKspSetDeviceInterfacesState( IN PLIST_ENTRY ListHead, IN BOOL Enable){ NTSTATUS Status = STATUS_SUCCESS; PLIST_ENTRY Entry; PSYMBOLIC_LINK_ENTRY SymEntry;
Entry = ListHead->Flink; while(Entry != ListHead) { /* fetch symbolic link entry */ SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry); /* set device interface state */ Status = IoSetDeviceInterfaceState(&SymEntry->SymbolicLink, Enable);
DPRINT("KspSetDeviceInterfacesState SymbolicLink '%S' Status %lx\n", SymEntry->SymbolicLink.Buffer, Status, Enable);
/* check for success */ if (!NT_SUCCESS(Status)) return Status; /* get next entry */ Entry = Entry->Flink; } /* return result */ return Status;}
NTSTATUSKspFreeDeviceInterfaces( IN PLIST_ENTRY ListHead){ PLIST_ENTRY Entry; PSYMBOLIC_LINK_ENTRY SymEntry;
while(!IsListEmpty(ListHead)) { /* remove first entry */ Entry = RemoveHeadList(ListHead);
/* fetch symbolic link entry */ SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry);
/* free device interface string */ RtlFreeUnicodeString(&SymEntry->SymbolicLink); /* free entry item */ FreeItem(Entry); }
return STATUS_SUCCESS;}
NTSTATUSKspRegisterDeviceInterfaces( IN PDEVICE_OBJECT PhysicalDeviceObject, IN ULONG CategoriesCount, IN GUID const*Categories, IN PUNICODE_STRING ReferenceString, OUT PLIST_ENTRY SymbolicLinkList){ ULONG Index; NTSTATUS Status = STATUS_SUCCESS; PSYMBOLIC_LINK_ENTRY SymEntry;
for(Index = 0; Index < CategoriesCount; Index++) { /* allocate a symbolic link entry */ SymEntry = AllocateItem(NonPagedPool, sizeof(SYMBOLIC_LINK_ENTRY)); /* check for success */ if (!SymEntry) return STATUS_INSUFFICIENT_RESOURCES;
/* now register device interface */ Status = IoRegisterDeviceInterface(PhysicalDeviceObject, &Categories[Index], ReferenceString, &SymEntry->SymbolicLink);
if (!NT_SUCCESS(Status)) { DPRINT1("Failed to register device interface %x\n", Status);
/* free entry */ FreeItem(SymEntry);
/* return result */ return Status; }
/* copy device class */ RtlMoveMemory(&SymEntry->DeviceInterfaceClass, &Categories[Index], sizeof(CLSID));
/* insert symbolic link entry */ InsertTailList(SymbolicLinkList, &SymEntry->Entry); }
/* return result */ return Status;}
NTSTATUSKspSetFilterFactoriesState( IN PKSIDEVICE_HEADER DeviceHeader, IN BOOLEAN NewState){ PCREATE_ITEM_ENTRY CreateEntry; PLIST_ENTRY Entry; NTSTATUS Status = STATUS_SUCCESS;
/* grab first device interface */ Entry = DeviceHeader->ItemList.Flink; while(Entry != &DeviceHeader->ItemList && Status == STATUS_SUCCESS) { /* grab create entry */ CreateEntry = CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
/* sanity check */ ASSERT(CreateEntry->CreateItem);
if (CreateEntry->CreateItem->Create == IKsFilterFactory_Create) { /* found our own filterfactory */ Status = KsFilterFactorySetDeviceClassesState((PKSFILTERFACTORY)CreateEntry->CreateItem->Context, NewState); }
Entry = Entry->Flink; }
/* store result */ return Status;}