ReactOS 0.4.15-dev-8219-ge8b88cf
clocks.c
Go to the documentation of this file.
1/*
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
7 */
8
9#include "precomp.h"
10
11#define NDEBUG
12#include <debug.h>
13
14typedef struct
15{
21
23 PFNKSSETTIMER SetTimer;
24 PFNKSCANCELTIMER CancelTimer;
25 PFNKSCORRELATEDTIME CorrelatedTime;
29
31
32typedef struct
33{
39
47
49
50KSPROPERTY_SET ClockPropertySet[] =
51{
52 {
54 sizeof(ClockPropertyTable) / sizeof(KSPROPERTY_ITEM),
55 (const KSPROPERTY_ITEM*)&ClockPropertyTable,
56 0,
57 NULL
58 }
59};
60
65{
67 return 0;
68}
69
74 OUT PLONGLONG SystemTime)
75{
77 return 0;
78}
79
84{
86 return 0;
87}
88
93 OUT PLONGLONG SystemTime)
94{
96 return 0;
97}
98
100NTAPI
102 IN PIRP Irp,
105{
108
109 DPRINT("ClockPropertyTime\n");
110
111 *Time = ClockGetTime(IoStack->FileObject);
112
113 Irp->IoStatus.Information = sizeof(LONGLONG);
114 return STATUS_SUCCESS;
115}
116
118NTAPI
120 IN PIRP Irp,
123{
126
127 DPRINT("ClockPropertyPhysicalTime\n");
128
130
131 Irp->IoStatus.Information = sizeof(LONGLONG);
132 return STATUS_SUCCESS;
133}
134
136NTAPI
138 IN PIRP Irp,
141{
144
145 DPRINT("ClockPropertyCorrelatedTime\n");
146
147 Time->Time = ClockGetCorrelatedTime(IoStack->FileObject, &Time->SystemTime);
148
149 Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME);
150 return STATUS_SUCCESS;
151}
152
154NTAPI
156 IN PIRP Irp,
159{
162
163 DPRINT("ClockPropertyCorrelatedPhysicalTime\n");
164
165 Time->Time = ClockGetCorrelatedPhysicalTime(IoStack->FileObject, &Time->SystemTime);
166
167 Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME);
168 return STATUS_SUCCESS;
169}
170
172NTAPI
174 IN PIRP Irp,
177{
179 PKSIOBJECT_HEADER ObjectHeader;
180 PIO_STACK_LOCATION IoStack;
182
183 DPRINT("ClockPropertyResolution\n");
184
185 /* get stack location */
187
188 /* get the object header */
189 ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
190
191 /* sanity check */
192 ASSERT(ObjectHeader);
193
194 /* locate ks pin implementation from KSPIN offset */
195 Clock = (PKSICLOCK)ObjectHeader->ObjectType;
196
197 Resolution->Error = Clock->DefaultClock->Error;
198 Resolution->Granularity = Clock->DefaultClock->Granularity;
199
200 Irp->IoStatus.Information = sizeof(KSRESOLUTION);
201 return STATUS_SUCCESS;
202}
203
205NTAPI
207 IN PIRP Irp,
210{
212 PKSIOBJECT_HEADER ObjectHeader;
214 PIO_STACK_LOCATION IoStack;
215
216 DPRINT("ClockPropertyState\n");
217
218 /* get stack location */
220
221 /* get the object header */
222 ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
223
224 /* sanity check */
225 ASSERT(ObjectHeader);
226
227 /* locate ks pin implementation from KSPIN offset */
228 Clock = (PKSICLOCK)ObjectHeader->ObjectType;
229
230 *State = Clock->DefaultClock->State;
231 Irp->IoStatus.Information = sizeof(KSSTATE);
232
233 return STATUS_SUCCESS;
234}
235
237NTAPI
239 IN PIRP Irp,
242{
243 PKSCLOCK_FUNCTIONTABLE Table = (PKSCLOCK_FUNCTIONTABLE)Data;
244
245 DPRINT("ClockPropertyFunctionTable\n");
246
247 Table->GetCorrelatedPhysicalTime = ClockGetCorrelatedPhysicalTime;
248 Table->GetCorrelatedTime = ClockGetCorrelatedTime;
249 Table->GetPhysicalTime = ClockGetPhysicalTime;
250 Table->GetTime = ClockGetTime;
251
252 return STATUS_SUCCESS;
253}
254
255
256/*
257 @implemented
258*/
264{
268 sizeof(KSCLOCK_CREATE),
271}
272
273/*
274 @implemented
275*/
278NTAPI
280 IN PIRP Irp,
281 OUT PKSCLOCK_CREATE* OutClockCreate)
282{
285 ULONG Size;
286
287 /* minimum request size */
288 Size = sizeof(KSCLOCK_CREATE);
289
290 /* copy create request */
293 &Size,
294 (PVOID*)&ClockCreate);
295
296 if (!NT_SUCCESS(Status))
297 return Status;
298
299 if (ClockCreate->CreateFlags != 0)
300 {
301 /* flags must be zero */
304 }
305
306 *OutClockCreate = ClockCreate;
307 return STATUS_SUCCESS;
308}
309
311NTAPI
314 IN PIRP Irp)
315{
316 PIO_STACK_LOCATION IoStack;
320
321 DPRINT("IKsClock_DispatchDeviceIoControl\n");
322
323 /* get current io stack */
325
326 /* FIXME support events */
327 ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY);
328
329 /* sanity check */
330 ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSPROPERTY));
331
332 /* call property handler */
334
335 /* get property from input buffer */
336 Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
337
339 DPRINT("IKsClock_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information);
341
342
343 Irp->IoStatus.Status = STATUS_SUCCESS;
345
346 return STATUS_SUCCESS;
347}
348
350NTAPI
353 IN PIRP Irp)
354{
356
357 Irp->IoStatus.Status = STATUS_SUCCESS;
359
360 return STATUS_SUCCESS;
361}
362
363static KSDISPATCH_TABLE DispatchTable =
364{
375};
376
377/*
378 @implemented
379*/
382NTAPI
384 IN PIRP Irp,
385 IN PKSDEFAULTCLOCK DefaultClock)
386{
390
392 if (!NT_SUCCESS(Status))
393 return Status;
394
395 /* let's allocate the clock struct */
397 if (!Clock)
398 {
401 }
402
403 /* now allocate the object header */
404 Status = KsAllocateObjectHeader((PVOID*)&Clock->ObjectHeader, 0, NULL, Irp, &DispatchTable);
405
406 /* did it work */
407 if (!NT_SUCCESS(Status))
408 {
409 /* failed */
412 return Status;
413 }
414
415 /* initialize clock */
416 /* FIXME IKsClock */
417 Clock->ObjectHeader->ObjectType = (PVOID)Clock;
418 Clock->ref = 1;
419 Clock->ClockCreate = ClockCreate;
420 Clock->DefaultClock = (PKSIDEFAULTCLOCK)DefaultClock;
421
422 /* increment reference count */
423 InterlockedIncrement(&Clock->DefaultClock->ReferenceCount);
424
425 return Status;
426}
427
428/*
429 @implemented
430*/
433NTAPI
435 OUT PKSDEFAULTCLOCK* DefaultClock)
436{
437 return KsAllocateDefaultClockEx(DefaultClock, NULL, NULL, NULL, NULL, NULL, 0);
438}
439
440/*
441 @unimplemented
442*/
445NTAPI
447 OUT PKSDEFAULTCLOCK* DefaultClock,
449 IN PFNKSSETTIMER SetTimer OPTIONAL,
450 IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
451 IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
453 IN ULONG Flags)
454{
456
457 if (!DefaultClock)
459
460 /* allocate default clock */
462 if (!Clock)
464
465 /* initialize default clock */
466 KeInitializeSpinLock(&Clock->TimeLock);
467 KeInitializeTimer(&Clock->Timer);
468 Clock->ReferenceCount = 1;
469 Clock->Context = Context;
470 Clock->SetTimer = SetTimer;
471 Clock->CancelTimer = CancelTimer;
472 Clock->CorrelatedTime = CorrelatedTime;
473 Clock->Flags = Flags;
474
475 if (Resolution)
476 {
477 if (SetTimer)
478 {
479 Clock->Error = Resolution->Error;
480 }
481
482 if (CorrelatedTime)
483 {
484 Clock->Granularity = Resolution->Granularity;
485 }
486 }
487
488 *DefaultClock = (PKSDEFAULTCLOCK)Clock;
489 return STATUS_SUCCESS;
490}
491
492/*
493 @implemented
494*/
496VOID
497NTAPI
499 IN PKSDEFAULTCLOCK DefaultClock)
500{
502
503 InterlockedDecrement(&Clock->ReferenceCount);
504
505 if (Clock->ReferenceCount == 0)
506 {
507 /* free default clock */
509 }
510}
511
512/*
513 @implemented
514*/
517NTAPI
519 IN PKSDEFAULTCLOCK DefaultClock)
520{
522 return Clock->State;
523}
524
525/*
526 @unimplemented
527*/
529VOID
530NTAPI
532 IN PKSDEFAULTCLOCK DefaultClock,
534{
536
537 if (State != Clock->State)
538 {
539 /* FIXME set time etc */
540 Clock->State = State;
541 }
542
543}
544
545/*
546 @implemented
547*/
550NTAPI
552 IN PKSDEFAULTCLOCK DefaultClock)
553{
554 LONGLONG Time = 0LL;
556
557 Time = ExInterlockedCompareExchange64(&Clock->Time, &Time, &Time, &Clock->TimeLock);
558
559 return Time;
560}
561
562/*
563 @implemented
564*/
566VOID
567NTAPI
569 IN PKSDEFAULTCLOCK DefaultClock,
571{
573
574 /* set the time safely */
575 ExInterlockedCompareExchange64(&Clock->Time, &Time, &Clock->Time, &Clock->TimeLock);
576}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
#define UNIMPLEMENTED
Definition: debug.h:118
NTSTATUS NTAPI ClockPropertyFunctionTable(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:238
KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest(IN PIRP Irp, OUT PKSCLOCK_CREATE *OutClockCreate)
Definition: clocks.c:279
struct KSIDEFAULTCLOCK * PKSIDEFAULTCLOCK
NTSTATUS NTAPI IKsClock_DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: clocks.c:351
NTSTATUS NTAPI ClockPropertyState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:206
DEFINE_KSPROPERTY_CLOCKSET(ClockPropertyTable, ClockPropertyTime, ClockPropertyPhysicalTime, ClockPropertyCorrelatedTime, ClockPropertyCorrelatedPhysicalTime, ClockPropertyResolution, ClockPropertyState, ClockPropertyFunctionTable)
KSPROPERTY_SET ClockPropertySet[]
Definition: clocks.c:50
KSDDKAPI NTSTATUS NTAPI KsCreateClock(IN HANDLE ConnectionHandle, IN PKSCLOCK_CREATE ClockCreate, OUT PHANDLE ClockHandle)
Definition: clocks.c:260
KSDDKAPI VOID NTAPI KsFreeDefaultClock(IN PKSDEFAULTCLOCK DefaultClock)
Definition: clocks.c:498
LONGLONG FASTCALL ClockGetCorrelatedTime(IN PFILE_OBJECT FileObject, OUT PLONGLONG SystemTime)
Definition: clocks.c:72
KSDDKAPI NTSTATUS NTAPI KsCreateDefaultClock(IN PIRP Irp, IN PKSDEFAULTCLOCK DefaultClock)
Definition: clocks.c:383
KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClock(OUT PKSDEFAULTCLOCK *DefaultClock)
Definition: clocks.c:434
LONGLONG FASTCALL ClockGetTime(IN PFILE_OBJECT FileObject)
Definition: clocks.c:82
LONGLONG FASTCALL ClockGetCorrelatedPhysicalTime(IN PFILE_OBJECT FileObject, OUT PLONGLONG SystemTime)
Definition: clocks.c:91
NTSTATUS NTAPI ClockPropertyPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:119
NTSTATUS NTAPI ClockPropertyCorrelatedPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:155
NTSTATUS NTAPI ClockPropertyTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:101
KSDDKAPI KSSTATE NTAPI KsGetDefaultClockState(IN PKSDEFAULTCLOCK DefaultClock)
Definition: clocks.c:518
NTSTATUS NTAPI IKsClock_DispatchDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: clocks.c:312
KSDDKAPI VOID NTAPI KsSetDefaultClockTime(IN PKSDEFAULTCLOCK DefaultClock, IN LONGLONG Time)
Definition: clocks.c:568
struct KSICLOCK * PKSICLOCK
KSDDKAPI VOID NTAPI KsSetDefaultClockState(IN PKSDEFAULTCLOCK DefaultClock, IN KSSTATE State)
Definition: clocks.c:531
KSDDKAPI LONGLONG NTAPI KsGetDefaultClockTime(IN PKSDEFAULTCLOCK DefaultClock)
Definition: clocks.c:551
KSDDKAPI NTSTATUS NTAPI KsAllocateDefaultClockEx(OUT PKSDEFAULTCLOCK *DefaultClock, IN PVOID Context OPTIONAL, IN PFNKSSETTIMER SetTimer OPTIONAL, IN PFNKSCANCELTIMER CancelTimer OPTIONAL, IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL, IN const KSRESOLUTION *Resolution OPTIONAL, IN ULONG Flags)
Definition: clocks.c:446
NTSTATUS NTAPI ClockPropertyResolution(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:173
LONGLONG FASTCALL ClockGetPhysicalTime(IN PFILE_OBJECT FileObject)
Definition: clocks.c:63
NTSTATUS NTAPI ClockPropertyCorrelatedTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
Definition: clocks.c:137
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define GENERIC_READ
Definition: compat.h:135
NTSTATUS NTAPI CompleteRequest(IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information)
Definition: dispatch.c:19
KSDDKAPI NTSTATUS NTAPI KsAllocateObjectHeader(OUT KSOBJECT_HEADER *Header, IN ULONG ItemsCount, IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL, IN PIRP Irp, IN KSDISPATCH_TABLE *Table)
Definition: api.c:610
KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1189
KSDDKAPI BOOLEAN NTAPI KsDispatchFastReadFailure(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject)
Definition: irp.c:1271
KSDDKAPI NTSTATUS NTAPI KsDispatchSetSecurity(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:67
KSDDKAPI NTSTATUS NTAPI KsDispatchQuerySecurity(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:22
KSDDKAPI BOOLEAN NTAPI KsDispatchFastIoDeviceControlFailure(IN PFILE_OBJECT FileObject, IN BOOLEAN Wait, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject)
Definition: irp.c:1251
KSDDKAPI NTSTATUS NTAPI KsPropertyHandler(IN PIRP Irp, IN ULONG PropertySetsCount, IN const KSPROPERTY_SET *PropertySet)
Definition: property.c:358
struct KSIDENTIFIER * PKSPROPERTY
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define NonPagedPool
Definition: env_spec_w32.h:307
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
Status
Definition: gdiplustypes.h:25
ASMGENDATA Table[]
Definition: genincdata.c:61
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
_In_ PKSCLOCK_CREATE ClockCreate
Definition: ks.h:4527
#define IOCTL_KS_PROPERTY
Definition: ks.h:127
enum KSSTATE * PKSSTATE
KSSTATE
Definition: ks.h:1214
PVOID PKSDEFAULTCLOCK
Definition: ks.h:1854
struct KSCORRELATED_TIME * PKSCORRELATED_TIME
_In_ PKSCLOCK_CREATE _Out_ PHANDLE ClockHandle
Definition: ks.h:4528
struct KSRESOLUTION * PKSRESOLUTION
#define KSSTRING_Clock
Definition: ks.h:49
#define KSDDKAPI
Definition: ks.h:40
_In_ PKSPIN_CONNECT _In_ ACCESS_MASK _Out_ PHANDLE ConnectionHandle
Definition: ks.h:4538
#define KSPROPSETID_Clock
Definition: ks.h:315
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
Definition: misc.c:29
NTSTATUS NTAPI KspCreateObjectType(IN HANDLE ParentHandle, IN LPWSTR ObjectType, PVOID CreateParameters, UINT CreateParametersSize, IN ACCESS_MASK DesiredAccess, OUT PHANDLE NodeHandle)
Definition: topology.c:16
NTSTATUS KspCopyCreateRequest(IN PIRP Irp, IN LPWSTR ObjectClass, IN OUT PULONG Size, OUT PVOID *Result)
Definition: misc.c:44
VOID FreeItem(IN PVOID Item)
Definition: misc.c:37
struct KSIOBJECT_HEADER * PKSIOBJECT_HEADER
#define ASSERT(a)
Definition: mode.c:44
static PWSTR GuidString
Definition: apphelp.c:93
static PLARGE_INTEGER Time
Definition: time.c:105
#define FASTCALL
Definition: nt_native.h:50
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
__GNU_EXTENSION typedef __int64 * PLONGLONG
Definition: ntbasedef.h:382
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:475
time_t Clock
Definition: output.c:18
long LONG
Definition: pedump.c:60
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
ULONG CreateFlags
Definition: ks.h:1857
PKSIOBJECT_HEADER ObjectHeader
Definition: clocks.c:37
PKSIDEFAULTCLOCK DefaultClock
Definition: clocks.c:36
LONG ref
Definition: clocks.c:34
PKSCLOCK_CREATE ClockCreate
Definition: clocks.c:35
KSSTATE State
Definition: clocks.c:18
PFNKSCORRELATEDTIME CorrelatedTime
Definition: clocks.c:25
KSPIN_LOCK TimeLock
Definition: clocks.c:17
PFNKSCANCELTIMER CancelTimer
Definition: clocks.c:24
ULONG Flags
Definition: clocks.c:28
LONG ReferenceCount
Definition: clocks.c:20
KTIMER Timer
Definition: clocks.c:19
PFNKSSETTIMER SetTimer
Definition: clocks.c:23
LONGLONG Time
Definition: clocks.c:16
LONGLONG Granularity
Definition: clocks.c:26
LONGLONG Error
Definition: clocks.c:27
PVOID Context
Definition: clocks.c:22
PVOID ObjectType
Definition: kstypes.h:30
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
union _IO_STACK_LOCATION::@1573 Parameters
struct _IO_STACK_LOCATION::@1573::@1574 DeviceIoControl
static BYTE Resolution
Definition: mouse.c:35
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define LL
Definition: tui.h:167
int64_t LONGLONG
Definition: typedefs.h:68
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_In_ PWDFDEVICE_INIT _In_ PWDF_PDO_EVENT_CALLBACKS DispatchTable
Definition: wdfpdo.h:248
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock)
Definition: exfuncs.h:880
#define IO_NO_INCREMENT
Definition: iotypes.h:598
* PFILE_OBJECT
Definition: iotypes.h:1998