ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

clocks.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS Kernel Streaming
00004  * FILE:            drivers/ksfilter/ks/clocks.c
00005  * PURPOSE:         KS Clocks functions
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 
00010 #include "priv.h"
00011 
00012 typedef struct
00013 {
00014     LONGLONG Time;
00015     KSPIN_LOCK TimeLock;
00016     KSSTATE State;
00017     KTIMER Timer;
00018     LONG ReferenceCount;
00019 
00020     PVOID Context;
00021     PFNKSSETTIMER SetTimer;
00022     PFNKSCANCELTIMER CancelTimer;
00023     PFNKSCORRELATEDTIME CorrelatedTime;
00024     LONGLONG Granularity;
00025     LONGLONG Error;
00026     ULONG Flags;
00027 
00028 }KSIDEFAULTCLOCK, *PKSIDEFAULTCLOCK;
00029 
00030 typedef struct
00031 {
00032     LONG ref;
00033     PKSCLOCK_CREATE ClockCreate;
00034     PKSIDEFAULTCLOCK DefaultClock;
00035     PKSIOBJECT_HEADER ObjectHeader;
00036 }KSICLOCK, *PKSICLOCK;
00037 
00038 NTSTATUS NTAPI ClockPropertyTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00039 NTSTATUS NTAPI ClockPropertyPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00040 NTSTATUS NTAPI ClockPropertyCorrelatedTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00041 NTSTATUS NTAPI ClockPropertyCorrelatedPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00042 NTSTATUS NTAPI ClockPropertyResolution(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00043 NTSTATUS NTAPI ClockPropertyState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00044 NTSTATUS NTAPI ClockPropertyFunctionTable(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
00045 
00046 DEFINE_KSPROPERTY_CLOCKSET(ClockPropertyTable, ClockPropertyTime, ClockPropertyPhysicalTime, ClockPropertyCorrelatedTime, ClockPropertyCorrelatedPhysicalTime, ClockPropertyResolution, ClockPropertyState, ClockPropertyFunctionTable);
00047 
00048 KSPROPERTY_SET ClockPropertySet[] =
00049 {
00050     {
00051         &KSPROPSETID_Clock,
00052         sizeof(ClockPropertyTable) / sizeof(KSPROPERTY_ITEM),
00053         (const KSPROPERTY_ITEM*)&ClockPropertyTable,
00054         0,
00055         NULL
00056     }
00057 };
00058 
00059 LONGLONG
00060 FASTCALL
00061 ClockGetPhysicalTime(
00062     IN PFILE_OBJECT FileObject)
00063 {
00064     UNIMPLEMENTED
00065     return 0;
00066 }
00067 
00068 LONGLONG
00069 FASTCALL
00070 ClockGetCorrelatedTime(
00071     IN PFILE_OBJECT FileObject,
00072     OUT PLONGLONG SystemTime)
00073 {
00074     UNIMPLEMENTED
00075     return 0;
00076 }
00077 
00078 LONGLONG
00079 FASTCALL
00080 ClockGetTime(
00081     IN PFILE_OBJECT FileObject)
00082 {
00083     UNIMPLEMENTED
00084     return 0;
00085 }
00086 
00087 LONGLONG
00088 FASTCALL
00089 ClockGetCorrelatedPhysicalTime(
00090     IN PFILE_OBJECT FileObject,
00091     OUT PLONGLONG SystemTime)
00092 {
00093     UNIMPLEMENTED
00094     return 0;
00095 }
00096 
00097 NTSTATUS
00098 NTAPI
00099 ClockPropertyTime(
00100     IN PIRP Irp,
00101     IN PKSIDENTIFIER Request,
00102     IN OUT PVOID Data)
00103 {
00104     PLONGLONG Time = (PLONGLONG)Data;
00105     PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
00106 
00107     DPRINT("ClockPropertyTime\n");
00108 
00109     *Time = ClockGetTime(IoStack->FileObject);
00110 
00111     Irp->IoStatus.Information = sizeof(LONGLONG);
00112     return STATUS_SUCCESS;
00113 }
00114 
00115 NTSTATUS
00116 NTAPI
00117 ClockPropertyPhysicalTime(
00118     IN PIRP Irp,
00119     IN PKSIDENTIFIER Request,
00120     IN OUT PVOID Data)
00121 {
00122     PLONGLONG Time = (PLONGLONG)Data;
00123     PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
00124 
00125     DPRINT("ClockPropertyPhysicalTime\n");
00126 
00127     *Time = ClockGetPhysicalTime(IoStack->FileObject);
00128 
00129     Irp->IoStatus.Information = sizeof(LONGLONG);
00130     return STATUS_SUCCESS;
00131 }
00132 
00133 NTSTATUS
00134 NTAPI
00135 ClockPropertyCorrelatedTime(
00136     IN PIRP Irp,
00137     IN PKSIDENTIFIER Request,
00138     IN OUT PVOID Data)
00139 {
00140     PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data;
00141     PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
00142 
00143     DPRINT("ClockPropertyCorrelatedTime\n");
00144 
00145     Time->Time = ClockGetCorrelatedTime(IoStack->FileObject, &Time->SystemTime);
00146 
00147     Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME);
00148     return STATUS_SUCCESS;
00149 }
00150 
00151 NTSTATUS
00152 NTAPI
00153 ClockPropertyCorrelatedPhysicalTime(
00154     IN PIRP Irp,
00155     IN PKSIDENTIFIER Request,
00156     IN OUT PVOID Data)
00157 {
00158     PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data;
00159     PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
00160 
00161     DPRINT("ClockPropertyCorrelatedPhysicalTime\n");
00162 
00163     Time->Time = ClockGetCorrelatedPhysicalTime(IoStack->FileObject, &Time->SystemTime);
00164 
00165     Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME);
00166     return STATUS_SUCCESS;
00167 }
00168 
00169 NTSTATUS
00170 NTAPI
00171 ClockPropertyResolution(
00172     IN PIRP Irp,
00173     IN PKSIDENTIFIER Request,
00174     IN OUT PVOID Data)
00175 {
00176     PKSICLOCK Clock;
00177     PKSIOBJECT_HEADER ObjectHeader;
00178     PIO_STACK_LOCATION IoStack;
00179     PKSRESOLUTION Resolution = (PKSRESOLUTION)Data;
00180 
00181     DPRINT("ClockPropertyResolution\n");
00182 
00183     /* get stack location */
00184     IoStack = IoGetCurrentIrpStackLocation(Irp);
00185 
00186     /* get the object header */
00187     ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
00188 
00189     /* sanity check */
00190     ASSERT(ObjectHeader);
00191 
00192     /* locate ks pin implemention from KSPIN offset */
00193     Clock = (PKSICLOCK)ObjectHeader->ObjectType;
00194 
00195     Resolution->Error = Clock->DefaultClock->Error;
00196     Resolution->Granularity = Clock->DefaultClock->Granularity;
00197 
00198     Irp->IoStatus.Information = sizeof(KSRESOLUTION);
00199     return STATUS_SUCCESS;
00200 }
00201 
00202 NTSTATUS
00203 NTAPI
00204 ClockPropertyState(
00205     IN PIRP Irp,
00206     IN PKSIDENTIFIER Request,
00207     IN OUT PVOID Data)
00208 {
00209     PKSICLOCK Clock;
00210     PKSIOBJECT_HEADER ObjectHeader;
00211     PKSSTATE State = (PKSSTATE)Data;
00212     PIO_STACK_LOCATION IoStack;
00213 
00214     DPRINT("ClockPropertyState\n");
00215 
00216     /* get stack location */
00217     IoStack = IoGetCurrentIrpStackLocation(Irp);
00218 
00219     /* get the object header */
00220     ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
00221 
00222     /* sanity check */
00223     ASSERT(ObjectHeader);
00224 
00225     /* locate ks pin implemention from KSPIN offset */
00226     Clock = (PKSICLOCK)ObjectHeader->ObjectType;
00227 
00228     *State = Clock->DefaultClock->State;
00229     Irp->IoStatus.Information = sizeof(KSSTATE);
00230 
00231     return STATUS_SUCCESS;
00232 }
00233 
00234 NTSTATUS
00235 NTAPI
00236 ClockPropertyFunctionTable(
00237     IN PIRP Irp,
00238     IN PKSIDENTIFIER Request,
00239     IN OUT PVOID Data)
00240 {
00241     PKSCLOCK_FUNCTIONTABLE Table = (PKSCLOCK_FUNCTIONTABLE)Data;
00242 
00243     DPRINT("ClockPropertyFunctionTable\n");
00244 
00245     Table->GetCorrelatedPhysicalTime = ClockGetCorrelatedPhysicalTime;
00246     Table->GetCorrelatedTime = ClockGetCorrelatedTime;
00247     Table->GetPhysicalTime = ClockGetPhysicalTime;
00248     Table->GetTime = ClockGetTime;
00249 
00250     return STATUS_SUCCESS;
00251 }
00252 
00253 
00254 /*
00255     @implemented
00256 */
00257 KSDDKAPI NTSTATUS NTAPI
00258 KsCreateClock(
00259     IN  HANDLE ConnectionHandle,
00260     IN  PKSCLOCK_CREATE ClockCreate,
00261     OUT PHANDLE ClockHandle)
00262 {
00263     return KspCreateObjectType(ConnectionHandle,
00264                                KSSTRING_Clock,
00265                                ClockCreate,
00266                                sizeof(KSCLOCK_CREATE),
00267                                GENERIC_READ,
00268                                ClockHandle);
00269 }
00270 
00271 /*
00272     @implemented
00273 */
00274 KSDDKAPI
00275 NTSTATUS
00276 NTAPI
00277 KsValidateClockCreateRequest(
00278     IN  PIRP Irp,
00279     OUT PKSCLOCK_CREATE* OutClockCreate)
00280 {
00281     PKSCLOCK_CREATE ClockCreate;
00282     NTSTATUS Status;
00283     ULONG Size;
00284 
00285     /* minimum request size */
00286     Size = sizeof(KSCLOCK_CREATE);
00287 
00288     /* copy create request */
00289     Status = KspCopyCreateRequest(Irp, 
00290                                   KSSTRING_Clock,
00291                                   &Size,
00292                                   (PVOID*)&ClockCreate);
00293 
00294     if (!NT_SUCCESS(Status))
00295         return Status;
00296 
00297     if (ClockCreate->CreateFlags != 0)
00298     {
00299         /* flags must be zero */
00300         FreeItem(ClockCreate);
00301         return STATUS_INVALID_PARAMETER;
00302     }
00303 
00304     *OutClockCreate = ClockCreate;
00305     return STATUS_SUCCESS;
00306 }
00307 
00308 NTSTATUS
00309 NTAPI
00310 IKsClock_DispatchDeviceIoControl(
00311     IN PDEVICE_OBJECT DeviceObject,
00312     IN  PIRP Irp)
00313 {
00314     PIO_STACK_LOCATION IoStack;
00315     UNICODE_STRING GuidString;
00316     PKSPROPERTY Property;
00317     NTSTATUS Status;
00318 
00319     DPRINT("IKsClock_DispatchDeviceIoControl\n");
00320 
00321     /* get current io stack */
00322     IoStack = IoGetCurrentIrpStackLocation(Irp);
00323 
00324     /* FIXME support events */
00325     ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY);
00326 
00327     /* sanity check */
00328     ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSPROPERTY));
00329 
00330     /* call property handler */
00331     Status = KsPropertyHandler(Irp, 1, ClockPropertySet);
00332 
00333     /* get property from input buffer */
00334     Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
00335 
00336     RtlStringFromGUID(&Property->Set, &GuidString);
00337     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);
00338     RtlFreeUnicodeString(&GuidString);
00339 
00340 
00341     Irp->IoStatus.Status = STATUS_SUCCESS;
00342     CompleteRequest(Irp, IO_NO_INCREMENT);
00343 
00344     return STATUS_SUCCESS;
00345 }
00346 
00347 NTSTATUS
00348 NTAPI
00349 IKsClock_DispatchClose(
00350     IN PDEVICE_OBJECT DeviceObject,
00351     IN  PIRP Irp)
00352 {
00353     UNIMPLEMENTED
00354 
00355     Irp->IoStatus.Status = STATUS_SUCCESS;
00356     CompleteRequest(Irp, IO_NO_INCREMENT);
00357 
00358     return STATUS_SUCCESS;
00359 }
00360 
00361 static KSDISPATCH_TABLE DispatchTable =
00362 {
00363     IKsClock_DispatchDeviceIoControl,
00364     KsDispatchInvalidDeviceRequest,
00365     KsDispatchInvalidDeviceRequest,
00366     KsDispatchInvalidDeviceRequest,
00367     IKsClock_DispatchClose,
00368     KsDispatchQuerySecurity,
00369     KsDispatchSetSecurity,
00370     KsDispatchFastIoDeviceControlFailure,
00371     KsDispatchFastReadFailure,
00372     KsDispatchFastReadFailure,
00373 };
00374 
00375 /*
00376     @implemented
00377 */
00378 KSDDKAPI
00379 NTSTATUS
00380 NTAPI
00381 KsCreateDefaultClock(
00382     IN  PIRP Irp,
00383     IN  PKSDEFAULTCLOCK DefaultClock)
00384 {
00385     NTSTATUS Status;
00386     PKSCLOCK_CREATE ClockCreate;
00387     PKSICLOCK Clock;
00388 
00389     Status = KsValidateClockCreateRequest(Irp, &ClockCreate);
00390     if (!NT_SUCCESS(Status))
00391         return Status;
00392 
00393     /* let's allocate the clock struct */
00394     Clock = AllocateItem(NonPagedPool, sizeof(KSICLOCK));
00395     if (!Clock)
00396         return STATUS_INSUFFICIENT_RESOURCES;
00397 
00398     /* now allocate the object header */
00399     Status = KsAllocateObjectHeader((PVOID*)&Clock->ObjectHeader, 0, NULL, Irp, &DispatchTable);
00400 
00401     /* did it work */
00402     if (!NT_SUCCESS(Status))
00403     {
00404         /* failed */
00405         FreeItem(Clock);
00406         return Status;
00407     }
00408 
00409     /* initialize clock */
00410     /* FIXME IKsClock */
00411     Clock->ObjectHeader->ObjectType = (PVOID)Clock;
00412     Clock->ref = 1;
00413     Clock->ClockCreate = ClockCreate;
00414     Clock->DefaultClock = (PKSIDEFAULTCLOCK)DefaultClock;
00415 
00416     /* increment reference count */
00417     InterlockedIncrement(&Clock->DefaultClock->ReferenceCount);
00418 
00419     return Status;
00420 }
00421 
00422 /*
00423     @implemented
00424 */
00425 KSDDKAPI
00426 NTSTATUS
00427 NTAPI
00428 KsAllocateDefaultClock(
00429     OUT PKSDEFAULTCLOCK* DefaultClock)
00430 {
00431     return KsAllocateDefaultClockEx(DefaultClock, NULL, NULL, NULL, NULL, NULL, 0);
00432 }
00433 
00434 /*
00435     @unimplemented
00436 */
00437 KSDDKAPI
00438 NTSTATUS
00439 NTAPI
00440 KsAllocateDefaultClockEx(
00441     OUT PKSDEFAULTCLOCK* DefaultClock,
00442     IN  PVOID Context OPTIONAL,
00443     IN  PFNKSSETTIMER SetTimer OPTIONAL,
00444     IN  PFNKSCANCELTIMER CancelTimer OPTIONAL,
00445     IN  PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
00446     IN  const KSRESOLUTION* Resolution OPTIONAL,
00447     IN  ULONG Flags)
00448 {
00449     PKSIDEFAULTCLOCK Clock;
00450 
00451     if (!DefaultClock)
00452        return STATUS_INVALID_PARAMETER_1;
00453 
00454     /* allocate default clock */
00455     Clock = AllocateItem(NonPagedPool, sizeof(KSIDEFAULTCLOCK));
00456     if (!Clock)
00457         return STATUS_INSUFFICIENT_RESOURCES;
00458 
00459     /* initialize default clock */
00460     KeInitializeSpinLock(&Clock->TimeLock);
00461     KeInitializeTimer(&Clock->Timer);
00462     Clock->ReferenceCount = 1;
00463     Clock->Context = Context;
00464     Clock->SetTimer = SetTimer;
00465     Clock->CancelTimer = CancelTimer;
00466     Clock->CorrelatedTime = CorrelatedTime;
00467     Clock->Flags = Flags;
00468 
00469     if (Resolution)
00470     {
00471         if (SetTimer)
00472         {
00473             Clock->Error = Resolution->Error;
00474         }
00475 
00476         if (CorrelatedTime)
00477         {
00478             Clock->Granularity = Resolution->Granularity;
00479         }
00480     }
00481 
00482     *DefaultClock = (PKSDEFAULTCLOCK)Clock;
00483     return STATUS_SUCCESS;
00484 }
00485 
00486 /*
00487     @implemented
00488 */
00489 KSDDKAPI
00490 VOID
00491 NTAPI
00492 KsFreeDefaultClock(
00493     IN  PKSDEFAULTCLOCK DefaultClock)
00494 {
00495     PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
00496 
00497     InterlockedDecrement(&Clock->ReferenceCount);
00498 
00499     if (Clock->ReferenceCount == 0)
00500     {
00501         /* free default clock */
00502         FreeItem(Clock);
00503     }
00504 }
00505 
00506 /*
00507     @implemented
00508 */
00509 KSDDKAPI
00510 KSSTATE
00511 NTAPI
00512 KsGetDefaultClockState(
00513     IN  PKSDEFAULTCLOCK DefaultClock)
00514 {
00515     PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
00516     return Clock->State;
00517 }
00518 
00519 /*
00520     @unimplemented
00521 */
00522 KSDDKAPI
00523 VOID
00524 NTAPI
00525 KsSetDefaultClockState(
00526     IN  PKSDEFAULTCLOCK DefaultClock,
00527     IN  KSSTATE State)
00528 {
00529     PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
00530 
00531     if (State != Clock->State)
00532     {
00533          /* FIXME set time etc */
00534          Clock->State = State;
00535     }
00536 
00537 }
00538 
00539 /*
00540     @implemented
00541 */
00542 KSDDKAPI
00543 LONGLONG
00544 NTAPI
00545 KsGetDefaultClockTime(
00546     IN  PKSDEFAULTCLOCK DefaultClock)
00547 {
00548     LONGLONG Time = 0LL;
00549     PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
00550 
00551     Time = ExInterlockedCompareExchange64(&Clock->Time, &Time, &Time, &Clock->TimeLock);
00552 
00553     return Time;
00554 }
00555 
00556 /*
00557     @implemented
00558 */
00559 KSDDKAPI
00560 VOID
00561 NTAPI
00562 KsSetDefaultClockTime(
00563     IN  PKSDEFAULTCLOCK DefaultClock,
00564     IN  LONGLONG Time)
00565 {
00566     PKSIDEFAULTCLOCK Clock = (PKSIDEFAULTCLOCK)DefaultClock;
00567 
00568     /* set the time safely */
00569     ExInterlockedCompareExchange64(&Clock->Time, &Time, &Clock->Time, &Clock->TimeLock);
00570 }

Generated on Sun May 27 2012 04:27:51 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.