2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/ks/clocks.c
5 * PURPOSE: KS Clocks functions
6 * PROGRAMMER: Johannes Anderwald
21 PFNKSSETTIMER SetTimer
;
22 PFNKSCANCELTIMER CancelTimer
;
23 PFNKSCORRELATEDTIME CorrelatedTime
;
24 KSRESOLUTION
* Resolution
;
27 }KSIDEFAULTCLOCK
, *PKSIDEFAULTCLOCK
;
33 PKSCLOCK_CREATE ClockCreate
;
34 PKSIDEFAULTCLOCK DefaultClock
;
35 PKSIOBJECT_HEADER ObjectHeader
;
36 }KSICLOCK
, *PKSICLOCK
;
42 KSDDKAPI NTSTATUS NTAPI
44 IN HANDLE ConnectionHandle
,
45 IN PKSCLOCK_CREATE ClockCreate
,
46 OUT PHANDLE ClockHandle
)
48 return KspCreateObjectType(ConnectionHandle
,
51 sizeof(KSCLOCK_CREATE
),
62 KsValidateClockCreateRequest(
64 OUT PKSCLOCK_CREATE
* OutClockCreate
)
66 PKSCLOCK_CREATE ClockCreate
;
70 /* minimum request size */
71 Size
= sizeof(KSCLOCK_CREATE
);
73 /* copy create request */
74 Status
= KspCopyCreateRequest(Irp
,
77 (PVOID
*)&ClockCreate
);
79 if (!NT_SUCCESS(Status
))
82 if (ClockCreate
->CreateFlags
!= 0)
84 /* flags must be zero */
85 FreeItem(ClockCreate
);
86 return STATUS_INVALID_PARAMETER
;
89 *OutClockCreate
= ClockCreate
;
90 return STATUS_SUCCESS
;
95 IKsClock_DispatchDeviceIoControl(
96 IN PDEVICE_OBJECT DeviceObject
,
101 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
102 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
104 return STATUS_SUCCESS
;
109 IKsClock_DispatchClose(
110 IN PDEVICE_OBJECT DeviceObject
,
115 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
116 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
118 return STATUS_SUCCESS
;
121 static KSDISPATCH_TABLE DispatchTable
=
123 IKsClock_DispatchDeviceIoControl
,
124 KsDispatchInvalidDeviceRequest
,
125 KsDispatchInvalidDeviceRequest
,
126 KsDispatchInvalidDeviceRequest
,
127 IKsClock_DispatchClose
,
128 KsDispatchQuerySecurity
,
129 KsDispatchSetSecurity
,
130 KsDispatchFastIoDeviceControlFailure
,
131 KsDispatchFastReadFailure
,
132 KsDispatchFastReadFailure
,
141 KsCreateDefaultClock(
143 IN PKSDEFAULTCLOCK DefaultClock
)
146 PKSCLOCK_CREATE ClockCreate
;
148 PKSOBJECT_CREATE_ITEM CreateItem
;
150 Status
= KsValidateClockCreateRequest(Irp
, &ClockCreate
);
151 if (!NT_SUCCESS(Status
))
154 /* let's allocate the clock struct */
155 Clock
= AllocateItem(NonPagedPool
, sizeof(KSICLOCK
));
157 return STATUS_INSUFFICIENT_RESOURCES
;
159 /* now allocate the object header */
160 Status
= KsAllocateObjectHeader((PVOID
*)&Clock
->ObjectHeader
, 0, NULL
, Irp
, &DispatchTable
);
163 if (!NT_SUCCESS(Status
))
170 /* initialize clock */
172 Clock
->ObjectHeader
->Unknown
= (PUNKNOWN
)&Clock
->lpVtbl
;
174 Clock
->ClockCreate
= ClockCreate
;
175 Clock
->DefaultClock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
177 /* increment reference count */
178 InterlockedIncrement(&Clock
->DefaultClock
->ReferenceCount
);
180 /* get create item */
181 CreateItem
= KSCREATE_ITEM_IRP_STORAGE(Irp
);
192 KsAllocateDefaultClock(
193 OUT PKSDEFAULTCLOCK
* DefaultClock
)
195 return KsAllocateDefaultClockEx(DefaultClock
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
204 KsAllocateDefaultClockEx(
205 OUT PKSDEFAULTCLOCK
* DefaultClock
,
206 IN PVOID Context OPTIONAL
,
207 IN PFNKSSETTIMER SetTimer OPTIONAL
,
208 IN PFNKSCANCELTIMER CancelTimer OPTIONAL
,
209 IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL
,
210 IN
const KSRESOLUTION
* Resolution OPTIONAL
,
213 PKSIDEFAULTCLOCK Clock
;
216 return STATUS_INVALID_PARAMETER_1
;
218 /* allocate default clock */
219 Clock
= AllocateItem(NonPagedPool
, sizeof(KSIDEFAULTCLOCK
));
221 return STATUS_INSUFFICIENT_RESOURCES
;
223 /* initialize default clock */
224 KeInitializeSpinLock(&Clock
->TimeLock
);
225 KeInitializeTimer(&Clock
->Timer
);
226 Clock
->ReferenceCount
= 1;
227 Clock
->Context
= Context
;
228 Clock
->SetTimer
= SetTimer
;
229 Clock
->CancelTimer
= CancelTimer
;
230 Clock
->CorrelatedTime
= CorrelatedTime
;
231 Clock
->Resolution
= (PKSRESOLUTION
)Resolution
;
232 Clock
->Flags
= Flags
;
234 *DefaultClock
= (PKSDEFAULTCLOCK
)Clock
;
235 return STATUS_SUCCESS
;
245 IN PKSDEFAULTCLOCK DefaultClock
)
247 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
249 InterlockedDecrement(&Clock
->ReferenceCount
);
251 if (Clock
->ReferenceCount
== 0)
253 /* free default clock */
264 KsGetDefaultClockState(
265 IN PKSDEFAULTCLOCK DefaultClock
)
267 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
277 KsSetDefaultClockState(
278 IN PKSDEFAULTCLOCK DefaultClock
,
281 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
283 if (State
!= Clock
->State
)
285 /* FIXME set time etc */
286 Clock
->State
= State
;
297 KsGetDefaultClockTime(
298 IN PKSDEFAULTCLOCK DefaultClock
)
301 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
303 Time
= ExInterlockedCompareExchange64(&Clock
->Time
, &Time
, &Time
, &Clock
->TimeLock
);
314 KsSetDefaultClockTime(
315 IN PKSDEFAULTCLOCK DefaultClock
,
318 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
320 /* set the time safely */
321 ExInterlockedCompareExchange64(&Clock
->Time
, &Time
, &Clock
->Time
, &Clock
->TimeLock
);