Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenclocks.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
1.7.6.1
|