Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendriver.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/ksfilter/ks/driver.c 00005 * PURPOSE: KS Driver functions 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 #include "priv.h" 00010 00011 /* 00012 @implemented 00013 */ 00014 KSDDKAPI 00015 PKSDEVICE 00016 NTAPI 00017 KsGetDeviceForDeviceObject( 00018 IN PDEVICE_OBJECT FunctionalDeviceObject) 00019 { 00020 PDEVICE_EXTENSION DeviceExtension; 00021 00022 /* get device extension */ 00023 DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension; 00024 00025 return &DeviceExtension->DeviceHeader->KsDevice; 00026 } 00027 00028 /* 00029 @implemented 00030 */ 00031 KSDDKAPI 00032 PKSDEVICE 00033 NTAPI 00034 KsGetDevice( 00035 IN PVOID Object) 00036 { 00037 PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); 00038 00039 DPRINT("KsGetDevice Type %lu KsDevice %p\n", BasicHeader->Type, BasicHeader->KsDevice); 00040 00041 ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); 00042 ASSERT(BasicHeader->KsDevice); 00043 ASSERT(BasicHeader->KsDevice->Descriptor); 00044 ASSERT(BasicHeader->KsDevice->Bag); 00045 ASSERT(BasicHeader->KsDevice->Context); 00046 ASSERT(BasicHeader->KsDevice->FunctionalDeviceObject); 00047 ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject); 00048 ASSERT(BasicHeader->KsDevice->NextDeviceObject); 00049 ASSERT(BasicHeader->KsDevice->Started); 00050 ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking); 00051 ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0); 00052 00053 return BasicHeader->KsDevice; 00054 } 00055 00056 /* 00057 @implemented 00058 */ 00059 KSDDKAPI 00060 NTSTATUS 00061 NTAPI 00062 KsCreateDevice( 00063 IN PDRIVER_OBJECT DriverObject, 00064 IN PDEVICE_OBJECT PhysicalDeviceObject, 00065 IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL, 00066 IN ULONG ExtensionSize OPTIONAL, 00067 OUT PKSDEVICE* Device OPTIONAL) 00068 { 00069 NTSTATUS Status = STATUS_DEVICE_REMOVED; 00070 PDEVICE_OBJECT FunctionalDeviceObject= NULL; 00071 PDEVICE_OBJECT OldHighestDeviceObject; 00072 if (!ExtensionSize) 00073 ExtensionSize = sizeof(KSDEVICE_HEADER); 00074 00075 DPRINT("KsCreateDevice Descriptor %p ExtensionSize %lu\n", Descriptor, ExtensionSize); 00076 00077 Status = IoCreateDevice(DriverObject, ExtensionSize, NULL, FILE_DEVICE_KS, FILE_DEVICE_SECURE_OPEN, FALSE, &FunctionalDeviceObject); 00078 if (!NT_SUCCESS(Status)) 00079 return Status; 00080 00081 OldHighestDeviceObject = IoAttachDeviceToDeviceStack(FunctionalDeviceObject, PhysicalDeviceObject); 00082 if (OldHighestDeviceObject) 00083 { 00084 Status = KsInitializeDevice(FunctionalDeviceObject, PhysicalDeviceObject, OldHighestDeviceObject, Descriptor); 00085 } 00086 else 00087 { 00088 Status = STATUS_DEVICE_REMOVED; 00089 } 00090 00091 /* check if all succeeded */ 00092 if (!NT_SUCCESS(Status)) 00093 { 00094 if (OldHighestDeviceObject) 00095 IoDetachDevice(OldHighestDeviceObject); 00096 00097 IoDeleteDevice(FunctionalDeviceObject); 00098 return Status; 00099 } 00100 00101 /* set device flags */ 00102 FunctionalDeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; 00103 FunctionalDeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING; 00104 00105 if (Device) 00106 { 00107 /* get PKSDEVICE struct */ 00108 *Device = KsGetDeviceForDeviceObject(FunctionalDeviceObject); 00109 00110 if (ExtensionSize > sizeof(KSDEVICE_HEADER)) 00111 { 00112 /* caller needs a device extension */ 00113 (*Device)->Context = (PVOID)((ULONG_PTR)FunctionalDeviceObject->DeviceExtension + sizeof(KSDEVICE_HEADER)); 00114 } 00115 } 00116 00117 return Status; 00118 } 00119 00120 /* 00121 @implemented 00122 */ 00123 KSDDKAPI 00124 NTSTATUS 00125 NTAPI 00126 KsAddDevice( 00127 IN PDRIVER_OBJECT DriverObject, 00128 IN PDEVICE_OBJECT PhysicalDeviceObject) 00129 { 00130 PKS_DRIVER_EXTENSION DriverObjectExtension; 00131 const KSDEVICE_DESCRIPTOR *Descriptor = NULL; 00132 00133 /* get stored driver object extension */ 00134 00135 DriverObjectExtension = IoGetDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver); 00136 00137 if (DriverObjectExtension) 00138 { 00139 /* get the stored descriptor see KsInitializeDriver */ 00140 Descriptor = DriverObjectExtension->Descriptor; 00141 } 00142 00143 return KsCreateDevice(DriverObject, PhysicalDeviceObject, Descriptor, 0, NULL); 00144 } 00145 00146 /* 00147 @implemented 00148 */ 00149 KSDDKAPI 00150 NTSTATUS 00151 NTAPI 00152 KsInitializeDriver( 00153 IN PDRIVER_OBJECT DriverObject, 00154 IN PUNICODE_STRING RegistryPath, 00155 IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL 00156 ) 00157 { 00158 PKS_DRIVER_EXTENSION DriverObjectExtension; 00159 NTSTATUS Status = STATUS_SUCCESS; 00160 00161 DPRINT("KsInitializeDriver\n"); 00162 00163 if (Descriptor) 00164 { 00165 Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver, sizeof(KS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension); 00166 if (NT_SUCCESS(Status)) 00167 { 00168 DriverObjectExtension->Descriptor = Descriptor; 00169 } 00170 } 00171 00172 /* sanity check */ 00173 ASSERT(Status == STATUS_SUCCESS); 00174 00175 if (!NT_SUCCESS(Status)) 00176 return Status; 00177 00178 /* Setting our IRP handlers */ 00179 DriverObject->MajorFunction[IRP_MJ_CREATE] = IKsDevice_Create; 00180 DriverObject->MajorFunction[IRP_MJ_PNP] = IKsDevice_Pnp; 00181 DriverObject->MajorFunction[IRP_MJ_POWER] = IKsDevice_Power; 00182 DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp; 00183 00184 /* The driver unload routine */ 00185 DriverObject->DriverUnload = KsNullDriverUnload; 00186 00187 /* The driver-supplied AddDevice */ 00188 DriverObject->DriverExtension->AddDevice = KsAddDevice; 00189 00190 /* KS handles these */ 00191 DPRINT1("KsInitializeDriver Setting KS function handlers\n"); 00192 KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE); 00193 KsSetMajorFunctionHandler(DriverObject, IRP_MJ_DEVICE_CONTROL); 00194 00195 00196 return STATUS_SUCCESS; 00197 } Generated on Fri May 25 2012 04:17:01 for ReactOS by
1.7.6.1
|