Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Kernel Streaming * FILE: drivers/ksfilter/ks/driver.c * PURPOSE: KS Driver functions * PROGRAMMER: Johannes Anderwald */
#include "precomp.h"
#define NDEBUG#include <debug.h>
/* @implemented*/KSDDKAPIPKSDEVICENTAPIKsGetDeviceForDeviceObject( IN PDEVICE_OBJECT FunctionalDeviceObject){ PDEVICE_EXTENSION DeviceExtension;
/* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension;
return &DeviceExtension->DeviceHeader->KsDevice;}
/* @implemented*/KSDDKAPIPKSDEVICENTAPIKsGetDevice( IN PVOID Object){ PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER));
DPRINT("KsGetDevice Type %lu KsDevice %p\n", BasicHeader->Type, BasicHeader->KsDevice);
ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); ASSERT(BasicHeader->KsDevice); ASSERT(BasicHeader->KsDevice->Descriptor); ASSERT(BasicHeader->KsDevice->Bag); ASSERT(BasicHeader->KsDevice->Context); ASSERT(BasicHeader->KsDevice->FunctionalDeviceObject); ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject); ASSERT(BasicHeader->KsDevice->NextDeviceObject); ASSERT(BasicHeader->KsDevice->Started); ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking); ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0);
return BasicHeader->KsDevice;}
/* @implemented*/KSDDKAPINTSTATUSNTAPIKsCreateDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL, IN ULONG ExtensionSize OPTIONAL, OUT PKSDEVICE* Device OPTIONAL){ NTSTATUS Status = STATUS_DEVICE_REMOVED; PDEVICE_OBJECT FunctionalDeviceObject= NULL; PDEVICE_OBJECT OldHighestDeviceObject; if (!ExtensionSize) ExtensionSize = sizeof(KSDEVICE_HEADER);
DPRINT("KsCreateDevice Descriptor %p ExtensionSize %lu\n", Descriptor, ExtensionSize);
Status = IoCreateDevice(DriverObject, ExtensionSize, NULL, FILE_DEVICE_KS, FILE_DEVICE_SECURE_OPEN, FALSE, &FunctionalDeviceObject); if (!NT_SUCCESS(Status)) return Status;
OldHighestDeviceObject = IoAttachDeviceToDeviceStack(FunctionalDeviceObject, PhysicalDeviceObject); if (OldHighestDeviceObject) { Status = KsInitializeDevice(FunctionalDeviceObject, PhysicalDeviceObject, OldHighestDeviceObject, Descriptor); } else { Status = STATUS_DEVICE_REMOVED; }
/* check if all succeeded */ if (!NT_SUCCESS(Status)) { if (OldHighestDeviceObject) IoDetachDevice(OldHighestDeviceObject);
IoDeleteDevice(FunctionalDeviceObject); return Status; }
/* set device flags */ FunctionalDeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; FunctionalDeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
if (Device) { /* get PKSDEVICE struct */ *Device = KsGetDeviceForDeviceObject(FunctionalDeviceObject);
if (ExtensionSize > sizeof(KSDEVICE_HEADER)) { /* caller needs a device extension */ (*Device)->Context = (PVOID)((ULONG_PTR)FunctionalDeviceObject->DeviceExtension + sizeof(KSDEVICE_HEADER)); } }
return Status;}
/* @implemented*/KSDDKAPINTSTATUSNTAPIKsAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject){ PKS_DRIVER_EXTENSION DriverObjectExtension; const KSDEVICE_DESCRIPTOR *Descriptor = NULL;
/* get stored driver object extension */
DriverObjectExtension = IoGetDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver);
if (DriverObjectExtension) { /* get the stored descriptor see KsInitializeDriver */ Descriptor = DriverObjectExtension->Descriptor; }
return KsCreateDevice(DriverObject, PhysicalDeviceObject, Descriptor, 0, NULL);}
/* @implemented*/KSDDKAPINTSTATUSNTAPIKsInitializeDriver( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath, IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL){ PKS_DRIVER_EXTENSION DriverObjectExtension; NTSTATUS Status = STATUS_SUCCESS;
DPRINT("KsInitializeDriver\n");
if (Descriptor) { Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver, sizeof(KS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension); if (NT_SUCCESS(Status)) { DriverObjectExtension->Descriptor = Descriptor; } }
/* sanity check */ ASSERT(Status == STATUS_SUCCESS);
if (!NT_SUCCESS(Status)) return Status;
/* Setting our IRP handlers */ DriverObject->MajorFunction[IRP_MJ_CREATE] = IKsDevice_Create; DriverObject->MajorFunction[IRP_MJ_PNP] = IKsDevice_Pnp; DriverObject->MajorFunction[IRP_MJ_POWER] = IKsDevice_Power; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp;
/* The driver unload routine */ DriverObject->DriverUnload = KsNullDriverUnload;
/* The driver-supplied AddDevice */ DriverObject->DriverExtension->AddDevice = KsAddDevice;
/* KS handles these */ DPRINT1("KsInitializeDriver Setting KS function handlers\n"); KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE); KsSetMajorFunctionHandler(DriverObject, IRP_MJ_DEVICE_CONTROL);
return STATUS_SUCCESS;}