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 Type %lu KsDevice %p\n", BasicHeader
->Type
, BasicHeader
->KsDevice
);
44 ASSERT(BasicHeader
->Type
== KsObjectTypeFilterFactory
|| BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== KsObjectTypePin
);
45 ASSERT(BasicHeader
->KsDevice
);
46 ASSERT(BasicHeader
->KsDevice
->Descriptor
);
47 ASSERT(BasicHeader
->KsDevice
->Bag
);
48 ASSERT(BasicHeader
->KsDevice
->Context
);
49 ASSERT(BasicHeader
->KsDevice
->FunctionalDeviceObject
);
50 ASSERT(BasicHeader
->KsDevice
->PhysicalDeviceObject
);
51 ASSERT(BasicHeader
->KsDevice
->NextDeviceObject
);
52 ASSERT(BasicHeader
->KsDevice
->Started
);
53 ASSERT(BasicHeader
->KsDevice
->SystemPowerState
== PowerSystemWorking
);
54 ASSERT(BasicHeader
->KsDevice
->DevicePowerState
== PowerDeviceD0
);
56 return BasicHeader
->KsDevice
;
66 IN PDRIVER_OBJECT DriverObject
,
67 IN PDEVICE_OBJECT PhysicalDeviceObject
,
68 IN
const KSDEVICE_DESCRIPTOR
* Descriptor OPTIONAL
,
69 IN ULONG ExtensionSize OPTIONAL
,
70 OUT PKSDEVICE
* Device OPTIONAL
)
72 NTSTATUS Status
= STATUS_DEVICE_REMOVED
;
73 PDEVICE_OBJECT FunctionalDeviceObject
= NULL
;
74 PDEVICE_OBJECT OldHighestDeviceObject
;
76 ExtensionSize
= sizeof(KSDEVICE_HEADER
);
78 DPRINT("KsCreateDevice Descriptor %p ExtensionSize %lu\n", Descriptor
, ExtensionSize
);
80 Status
= IoCreateDevice(DriverObject
, ExtensionSize
, NULL
, FILE_DEVICE_KS
, FILE_DEVICE_SECURE_OPEN
, FALSE
, &FunctionalDeviceObject
);
81 if (!NT_SUCCESS(Status
))
84 OldHighestDeviceObject
= IoAttachDeviceToDeviceStack(FunctionalDeviceObject
, PhysicalDeviceObject
);
85 if (OldHighestDeviceObject
)
87 Status
= KsInitializeDevice(FunctionalDeviceObject
, PhysicalDeviceObject
, OldHighestDeviceObject
, Descriptor
);
91 Status
= STATUS_DEVICE_REMOVED
;
94 /* check if all succeeded */
95 if (!NT_SUCCESS(Status
))
97 if (OldHighestDeviceObject
)
98 IoDetachDevice(OldHighestDeviceObject
);
100 IoDeleteDevice(FunctionalDeviceObject
);
104 /* set device flags */
105 FunctionalDeviceObject
->Flags
|= DO_DIRECT_IO
| DO_POWER_PAGABLE
;
106 FunctionalDeviceObject
->Flags
&= ~ DO_DEVICE_INITIALIZING
;
110 /* get PKSDEVICE struct */
111 *Device
= KsGetDeviceForDeviceObject(FunctionalDeviceObject
);
113 if (ExtensionSize
> sizeof(KSDEVICE_HEADER
))
115 /* caller needs a device extension */
116 (*Device
)->Context
= (PVOID
)((ULONG_PTR
)FunctionalDeviceObject
->DeviceExtension
+ sizeof(KSDEVICE_HEADER
));
130 IN PDRIVER_OBJECT DriverObject
,
131 IN PDEVICE_OBJECT PhysicalDeviceObject
)
133 PKS_DRIVER_EXTENSION DriverObjectExtension
;
134 const KSDEVICE_DESCRIPTOR
*Descriptor
= NULL
;
136 /* get stored driver object extension */
138 DriverObjectExtension
= IoGetDriverObjectExtension(DriverObject
, (PVOID
)KsInitializeDriver
);
140 if (DriverObjectExtension
)
142 /* get the stored descriptor see KsInitializeDriver */
143 Descriptor
= DriverObjectExtension
->Descriptor
;
146 return KsCreateDevice(DriverObject
, PhysicalDeviceObject
, Descriptor
, 0, NULL
);
156 IN PDRIVER_OBJECT DriverObject
,
157 IN PUNICODE_STRING RegistryPath
,
158 IN
const KSDEVICE_DESCRIPTOR
*Descriptor OPTIONAL
161 PKS_DRIVER_EXTENSION DriverObjectExtension
;
162 NTSTATUS Status
= STATUS_SUCCESS
;
164 DPRINT("KsInitializeDriver\n");
168 Status
= IoAllocateDriverObjectExtension(DriverObject
, (PVOID
)KsInitializeDriver
, sizeof(KS_DRIVER_EXTENSION
), (PVOID
*)&DriverObjectExtension
);
169 if (NT_SUCCESS(Status
))
171 DriverObjectExtension
->Descriptor
= Descriptor
;
176 ASSERT(Status
== STATUS_SUCCESS
);
178 if (!NT_SUCCESS(Status
))
181 /* Setting our IRP handlers */
182 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = IKsDevice_Create
;
183 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = IKsDevice_Pnp
;
184 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = IKsDevice_Power
;
185 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = KsDefaultForwardIrp
;
187 /* The driver unload routine */
188 DriverObject
->DriverUnload
= KsNullDriverUnload
;
190 /* The driver-supplied AddDevice */
191 DriverObject
->DriverExtension
->AddDevice
= KsAddDevice
;
193 /* KS handles these */
194 DPRINT1("KsInitializeDriver Setting KS function handlers\n");
195 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_CLOSE
);
196 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_DEVICE_CONTROL
);
199 return STATUS_SUCCESS
;