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_NOT_IMPLEMENTED
;
116 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
118 return STATUS_NOT_IMPLEMENTED
;
123 static KSDISPATCH_TABLE DispatchTable
=
125 IKsClock_DispatchDeviceIoControl
,
126 KsDispatchInvalidDeviceRequest
,
127 KsDispatchInvalidDeviceRequest
,
128 KsDispatchInvalidDeviceRequest
,
129 IKsClock_DispatchClose
,
130 KsDispatchQuerySecurity
,
131 KsDispatchSetSecurity
,
132 KsDispatchFastIoDeviceControlFailure
,
133 KsDispatchFastReadFailure
,
134 KsDispatchFastReadFailure
,
143 KsCreateDefaultClock(
145 IN PKSDEFAULTCLOCK DefaultClock
)
148 PKSCLOCK_CREATE ClockCreate
;
150 PKSOBJECT_CREATE_ITEM CreateItem
;
152 Status
= KsValidateClockCreateRequest(Irp
, &ClockCreate
);
153 if (!NT_SUCCESS(Status
))
156 /* let's allocate the clock struct */
157 Clock
= AllocateItem(NonPagedPool
, sizeof(KSICLOCK
));
159 return STATUS_INSUFFICIENT_RESOURCES
;
161 /* now allocate the object header */
162 Status
= KsAllocateObjectHeader((PVOID
*)&Clock
->ObjectHeader
, 0, NULL
, Irp
, &DispatchTable
);
165 if (!NT_SUCCESS(Status
))
172 /* initialize clock */
174 Clock
->ObjectHeader
->Unknown
= (PUNKNOWN
)&Clock
->lpVtbl
;
176 Clock
->ClockCreate
= ClockCreate
;
177 Clock
->DefaultClock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
179 /* increment reference count */
180 InterlockedIncrement(&Clock
->DefaultClock
->ReferenceCount
);
182 /* get create item */
183 CreateItem
= KSCREATE_ITEM_IRP_STORAGE(Irp
);
194 KsAllocateDefaultClock(
195 OUT PKSDEFAULTCLOCK
* DefaultClock
)
197 return KsAllocateDefaultClockEx(DefaultClock
, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
206 KsAllocateDefaultClockEx(
207 OUT PKSDEFAULTCLOCK
* DefaultClock
,
208 IN PVOID Context OPTIONAL
,
209 IN PFNKSSETTIMER SetTimer OPTIONAL
,
210 IN PFNKSCANCELTIMER CancelTimer OPTIONAL
,
211 IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL
,
212 IN
const KSRESOLUTION
* Resolution OPTIONAL
,
215 PKSIDEFAULTCLOCK Clock
;
218 return STATUS_INVALID_PARAMETER_1
;
220 /* allocate default clock */
221 Clock
= AllocateItem(NonPagedPool
, sizeof(KSIDEFAULTCLOCK
));
223 return STATUS_INSUFFICIENT_RESOURCES
;
225 /* initialize default clock */
226 KeInitializeSpinLock(&Clock
->TimeLock
);
227 KeInitializeTimer(&Clock
->Timer
);
228 Clock
->ReferenceCount
= 1;
229 Clock
->Context
= Context
;
230 Clock
->SetTimer
= SetTimer
;
231 Clock
->CancelTimer
= CancelTimer
;
232 Clock
->CorrelatedTime
= CorrelatedTime
;
233 Clock
->Resolution
= (PKSRESOLUTION
)Resolution
;
234 Clock
->Flags
= Flags
;
236 *DefaultClock
= (PKSDEFAULTCLOCK
)Clock
;
237 return STATUS_SUCCESS
;
247 IN PKSDEFAULTCLOCK DefaultClock
)
249 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
251 InterlockedDecrement(&Clock
->ReferenceCount
);
253 if (Clock
->ReferenceCount
== 0)
255 /* free default clock */
266 KsGetDefaultClockState(
267 IN PKSDEFAULTCLOCK DefaultClock
)
269 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
279 KsSetDefaultClockState(
280 IN PKSDEFAULTCLOCK DefaultClock
,
283 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
285 if (State
!= Clock
->State
)
287 /* FIXME set time etc */
288 Clock
->State
= State
;
299 KsGetDefaultClockTime(
300 IN PKSDEFAULTCLOCK DefaultClock
)
303 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
305 Time
= ExInterlockedCompareExchange64(&Clock
->Time
, &Time
, &Time
, &Clock
->TimeLock
);
316 KsSetDefaultClockTime(
317 IN PKSDEFAULTCLOCK DefaultClock
,
320 PKSIDEFAULTCLOCK Clock
= (PKSIDEFAULTCLOCK
)DefaultClock
;
322 /* set the time safely */
323 ExInterlockedCompareExchange64(&Clock
->Time
, &Time
, &Clock
->Time
, &Clock
->TimeLock
);