2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/ks/driver.c
5 * PURPOSE: KS Driver functions
6 * PROGRAMMER: Johannes Anderwald
20 KsGetDeviceForDeviceObject(
21 IN PDEVICE_OBJECT FunctionalDeviceObject
)
23 PDEVICE_EXTENSION DeviceExtension
;
25 /* get device extension */
26 DeviceExtension
= (PDEVICE_EXTENSION
)FunctionalDeviceObject
->DeviceExtension
;
28 return &DeviceExtension
->DeviceHeader
->KsDevice
;
40 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
42 DPRINT("KsGetDevice %p BasicHeader %p Type %x\n", Object
, BasicHeader
, BasicHeader
->Type
);
44 ASSERT(BasicHeader
->Type
== KsObjectTypeFilterFactory
|| BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== BasicHeader
->Type
);
45 ASSERT(BasicHeader
->KsDevice
);
47 return BasicHeader
->KsDevice
;
57 IN PDRIVER_OBJECT DriverObject
,
58 IN PDEVICE_OBJECT PhysicalDeviceObject
,
59 IN
const KSDEVICE_DESCRIPTOR
* Descriptor OPTIONAL
,
60 IN ULONG ExtensionSize OPTIONAL
,
61 OUT PKSDEVICE
* Device OPTIONAL
)
63 NTSTATUS Status
= STATUS_DEVICE_REMOVED
;
64 PDEVICE_OBJECT FunctionalDeviceObject
= NULL
;
65 PDEVICE_OBJECT OldHighestDeviceObject
;
67 ExtensionSize
= sizeof(KSDEVICE_HEADER
);
69 DPRINT("KsCreateDevice Descriptor %p ExtensionSize %lu\n", Descriptor
, ExtensionSize
);
71 Status
= IoCreateDevice(DriverObject
, ExtensionSize
, NULL
, FILE_DEVICE_KS
, FILE_DEVICE_SECURE_OPEN
, FALSE
, &FunctionalDeviceObject
);
72 if (!NT_SUCCESS(Status
))
75 OldHighestDeviceObject
= IoAttachDeviceToDeviceStack(FunctionalDeviceObject
, PhysicalDeviceObject
);
76 if (OldHighestDeviceObject
)
78 Status
= KsInitializeDevice(FunctionalDeviceObject
, PhysicalDeviceObject
, OldHighestDeviceObject
, Descriptor
);
82 Status
= STATUS_DEVICE_REMOVED
;
85 /* check if all succeeded */
86 if (!NT_SUCCESS(Status
))
88 if (OldHighestDeviceObject
)
89 IoDetachDevice(OldHighestDeviceObject
);
91 IoDeleteDevice(FunctionalDeviceObject
);
95 /* set device flags */
96 FunctionalDeviceObject
->Flags
|= DO_DIRECT_IO
| DO_POWER_PAGABLE
;
97 FunctionalDeviceObject
->Flags
&= ~ DO_DEVICE_INITIALIZING
;
101 /* get PKSDEVICE struct */
102 *Device
= KsGetDeviceForDeviceObject(FunctionalDeviceObject
);
104 if (ExtensionSize
> sizeof(KSDEVICE_HEADER
))
106 /* caller needs a device extension */
107 (*Device
)->Context
= (PVOID
)((ULONG_PTR
)FunctionalDeviceObject
->DeviceExtension
+ sizeof(KSDEVICE_HEADER
));
121 IN PDRIVER_OBJECT DriverObject
,
122 IN PDEVICE_OBJECT PhysicalDeviceObject
)
124 PKS_DRIVER_EXTENSION DriverObjectExtension
;
125 const KSDEVICE_DESCRIPTOR
*Descriptor
= NULL
;
127 /* get stored driver object extension */
129 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
, (PVOID
)KsInitializeDriver
);
131 if (DriverObjectExtension
)
133 /* get the stored descriptor see KsInitializeDriver */
134 Descriptor
= DriverObjectExtension
->Descriptor
;
137 return KsCreateDevice(DriverObject
, PhysicalDeviceObject
, Descriptor
, 0, NULL
);
147 IN PDRIVER_OBJECT DriverObject
,
148 IN PUNICODE_STRING RegistryPath
,
149 IN
const KSDEVICE_DESCRIPTOR
*Descriptor OPTIONAL
152 PKS_DRIVER_EXTENSION DriverObjectExtension
;
153 NTSTATUS Status
= STATUS_SUCCESS
;
157 Status
= IoAllocateDriverObjectExtension(DriverObject
, (PVOID
)KsInitializeDriver
, sizeof(KS_DRIVER_EXTENSION
), (PVOID
*)&DriverObjectExtension
);
158 if (NT_SUCCESS(Status
))
160 DriverObjectExtension
->Descriptor
= Descriptor
;
165 ASSERT(Status
== STATUS_SUCCESS
);
167 if (!NT_SUCCESS(Status
))
170 /* Setting our IRP handlers */
171 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = IKsDevice_Create
;
172 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = IKsDevice_Pnp
;
173 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = IKsDevice_Power
;
174 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = KsDefaultForwardIrp
;
176 /* The driver unload routine */
177 DriverObject
->DriverUnload
= KsNullDriverUnload
;
179 /* The driver-supplied AddDevice */
180 DriverObject
->DriverExtension
->AddDevice
= KsAddDevice
;
182 /* KS handles these */
183 DPRINT1("KsInitializeDriver Setting KS function handlers\n");
184 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_CLOSE
);
185 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_DEVICE_CONTROL
);
188 return STATUS_SUCCESS
;