Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenevent.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/event.c 00005 * PURPOSE: KS Event functions 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 #include "priv.h" 00010 00011 BOOLEAN 00012 KspSynchronizedEventRoutine( 00013 IN KSEVENTS_LOCKTYPE EventsFlags, 00014 IN PVOID EventsLock, 00015 IN PKSEVENT_SYNCHRONIZED_ROUTINE SynchronizedRoutine, 00016 IN PKSEVENT_CTX Ctx) 00017 { 00018 BOOLEAN Result = FALSE; 00019 KIRQL OldLevel; 00020 00021 if (EventsFlags == KSEVENTS_NONE) 00022 { 00023 /* no synchronization required */ 00024 Result = SynchronizedRoutine(Ctx); 00025 } 00026 else if (EventsFlags == KSEVENTS_SPINLOCK) 00027 { 00028 /* use spin lock */ 00029 KeAcquireSpinLock((PKSPIN_LOCK)EventsLock, &OldLevel); 00030 Result = SynchronizedRoutine(Ctx); 00031 KeReleaseSpinLock((PKSPIN_LOCK)EventsLock, OldLevel); 00032 } 00033 else if (EventsFlags == KSEVENTS_MUTEX) 00034 { 00035 /* use a mutex */ 00036 KeWaitForSingleObject(EventsLock, Executive, KernelMode, FALSE, NULL); 00037 Result = SynchronizedRoutine(Ctx); 00038 KeReleaseMutex((PRKMUTEX)EventsLock, FALSE); 00039 } 00040 else if (EventsFlags == KSEVENTS_FMUTEX) 00041 { 00042 /* use a fast mutex */ 00043 ExAcquireFastMutex((PFAST_MUTEX)EventsLock); 00044 Result = SynchronizedRoutine(Ctx); 00045 ExReleaseFastMutex((PFAST_MUTEX)EventsLock); 00046 } 00047 else if (EventsFlags == KSEVENTS_FMUTEXUNSAFE) 00048 { 00049 /* acquire fast mutex unsafe */ 00050 KeEnterCriticalRegion(); 00051 ExAcquireFastMutexUnsafe((PFAST_MUTEX)EventsLock); 00052 Result = SynchronizedRoutine(Ctx); 00053 ExReleaseFastMutexUnsafe((PFAST_MUTEX)EventsLock); 00054 KeLeaveCriticalRegion(); 00055 } 00056 else if (EventsFlags == KSEVENTS_INTERRUPT) 00057 { 00058 /* use interrupt for locking */ 00059 Result = KeSynchronizeExecution((PKINTERRUPT)EventsLock, (PKSYNCHRONIZE_ROUTINE)SynchronizedRoutine, (PVOID)Ctx); 00060 } 00061 else if (EventsFlags == KSEVENTS_ERESOURCE) 00062 { 00063 /* use an eresource */ 00064 KeEnterCriticalRegion(); 00065 ExAcquireResourceExclusiveLite((PERESOURCE)EventsLock, TRUE); 00066 Result = SynchronizedRoutine(Ctx); 00067 ExReleaseResourceLite((PERESOURCE)EventsLock); 00068 KeLeaveCriticalRegion(); 00069 } 00070 00071 return Result; 00072 } 00073 00074 BOOLEAN 00075 NTAPI 00076 SyncAddEvent( 00077 PKSEVENT_CTX Context) 00078 { 00079 InsertTailList(Context->List, &Context->EventEntry->ListEntry); 00080 return TRUE; 00081 } 00082 00083 NTSTATUS 00084 KspEnableEvent( 00085 IN PIRP Irp, 00086 IN ULONG EventSetsCount, 00087 IN PKSEVENT_SET EventSet, 00088 IN OUT PLIST_ENTRY EventsList OPTIONAL, 00089 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, 00090 IN PVOID EventsLock OPTIONAL, 00091 IN PFNKSALLOCATOR Allocator OPTIONAL, 00092 IN ULONG EventItemSize OPTIONAL) 00093 { 00094 PIO_STACK_LOCATION IoStack; 00095 NTSTATUS Status; 00096 KSEVENT Event; 00097 PKSEVENT_ITEM EventItem, FoundEventItem; 00098 PKSEVENTDATA EventData; 00099 PKSEVENT_SET FoundEventSet; 00100 PKSEVENT_ENTRY EventEntry; 00101 ULONG Index, SubIndex, Size; 00102 PVOID Object; 00103 KSEVENT_CTX Ctx; 00104 LPGUID Guid; 00105 00106 /* get current stack location */ 00107 IoStack = IoGetCurrentIrpStackLocation(Irp); 00108 00109 if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSEVENT)) 00110 { 00111 /* invalid parameter */ 00112 return STATUS_NOT_SUPPORTED; 00113 } 00114 00115 if (Irp->RequestorMode == UserMode) 00116 { 00117 _SEH2_TRY 00118 { 00119 ProbeForRead(IoStack->Parameters.DeviceIoControl.Type3InputBuffer, sizeof(KSEVENT), sizeof(UCHAR)); 00120 ProbeForRead(Irp->UserBuffer, IoStack->Parameters.DeviceIoControl.OutputBufferLength, sizeof(UCHAR)); 00121 RtlMoveMemory(&Event, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, sizeof(KSEVENT)); 00122 Status = STATUS_SUCCESS; 00123 } 00124 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00125 { 00126 /* Exception, get the error code */ 00127 Status = _SEH2_GetExceptionCode(); 00128 } 00129 _SEH2_END; 00130 00131 /* check for success */ 00132 if (!NT_SUCCESS(Status)) 00133 { 00134 /* failed to probe parameters */ 00135 return Status; 00136 } 00137 } 00138 else 00139 { 00140 /* copy event struct */ 00141 RtlMoveMemory(&Event, IoStack->Parameters.DeviceIoControl.Type3InputBuffer, sizeof(KSEVENT)); 00142 } 00143 00144 FoundEventItem = NULL; 00145 FoundEventSet = NULL; 00146 00147 00148 if (IsEqualGUIDAligned(&Event.Set, &GUID_NULL) && Event.Id == 0 && Event.Flags == KSEVENT_TYPE_SETSUPPORT) 00149 { 00150 // store output size 00151 Irp->IoStatus.Information = sizeof(GUID) * EventSetsCount; 00152 if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * EventSetsCount) 00153 { 00154 // buffer too small 00155 return STATUS_MORE_ENTRIES; 00156 } 00157 00158 // get output buffer 00159 Guid = (LPGUID)Irp->UserBuffer; 00160 00161 // copy property guids from property sets 00162 for(Index = 0; Index < EventSetsCount; Index++) 00163 { 00164 RtlMoveMemory(&Guid[Index], EventSet[Index].Set, sizeof(GUID)); 00165 } 00166 return STATUS_SUCCESS; 00167 } 00168 00169 /* now try to find event set */ 00170 for(Index = 0; Index < EventSetsCount; Index++) 00171 { 00172 if (IsEqualGUIDAligned(&Event.Set, EventSet[Index].Set)) 00173 { 00174 EventItem = (PKSEVENT_ITEM)EventSet[Index].EventItem; 00175 00176 /* sanity check */ 00177 ASSERT(EventSet[Index].EventsCount); 00178 ASSERT(EventItem); 00179 00180 /* now find matching event id */ 00181 for(SubIndex = 0; SubIndex < EventSet[Index].EventsCount; SubIndex++) 00182 { 00183 if (EventItem[SubIndex].EventId == Event.Id) 00184 { 00185 /* found event item */ 00186 FoundEventItem = &EventItem[SubIndex]; 00187 FoundEventSet = &EventSet[Index]; 00188 break; 00189 } 00190 } 00191 00192 if (FoundEventSet) 00193 break; 00194 } 00195 } 00196 00197 if (!FoundEventSet) 00198 { 00199 UNICODE_STRING GuidString; 00200 00201 RtlStringFromGUID(&Event.Set, &GuidString); 00202 00203 DPRINT("Guid %S Id %u Flags %x not found\n", GuidString.Buffer, Event.Id, Event.Flags); 00204 RtlFreeUnicodeString(&GuidString); 00205 return STATUS_PROPSET_NOT_FOUND; 00206 00207 00208 } 00209 00210 if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < FoundEventItem->DataInput) 00211 { 00212 /* buffer too small */ 00213 DPRINT1("Got %u expected %u\n", IoStack->Parameters.DeviceIoControl.OutputBufferLength, FoundEventItem->DataInput); 00214 return STATUS_SUCCESS; 00215 } 00216 00217 if (!FoundEventItem->AddHandler && !EventsList) 00218 { 00219 /* no add handler and no list to add the new entry to */ 00220 return STATUS_INVALID_PARAMETER; 00221 } 00222 00223 /* get event data */ 00224 EventData = Irp->UserBuffer; 00225 00226 /* sanity check */ 00227 ASSERT(EventData); 00228 00229 if (Irp->RequestorMode == UserMode) 00230 { 00231 if (EventData->NotificationType == KSEVENTF_SEMAPHORE_HANDLE) 00232 { 00233 /* get semaphore object handle */ 00234 Status = ObReferenceObjectByHandle(EventData->SemaphoreHandle.Semaphore, SEMAPHORE_MODIFY_STATE, ExSemaphoreObjectType, Irp->RequestorMode, &Object, NULL); 00235 00236 if (!NT_SUCCESS(Status)) 00237 { 00238 /* invalid semaphore handle */ 00239 return STATUS_INVALID_PARAMETER; 00240 } 00241 } 00242 else if (EventData->NotificationType == KSEVENTF_EVENT_HANDLE) 00243 { 00244 /* get event object handle */ 00245 Status = ObReferenceObjectByHandle(EventData->EventHandle.Event, EVENT_MODIFY_STATE, ExEventObjectType, Irp->RequestorMode, &Object, NULL); 00246 00247 if (!NT_SUCCESS(Status)) 00248 { 00249 /* invalid event handle */ 00250 return STATUS_INVALID_PARAMETER; 00251 } 00252 } 00253 else 00254 { 00255 /* user mode client can only pass an event or semaphore handle */ 00256 return STATUS_INVALID_PARAMETER; 00257 } 00258 } 00259 else 00260 { 00261 if (EventData->NotificationType != KSEVENTF_EVENT_OBJECT && 00262 EventData->NotificationType != KSEVENTF_SEMAPHORE_OBJECT && 00263 EventData->NotificationType != KSEVENTF_DPC && 00264 EventData->NotificationType != KSEVENTF_WORKITEM && 00265 EventData->NotificationType != KSEVENTF_KSWORKITEM) 00266 { 00267 /* invalid type requested */ 00268 return STATUS_INVALID_PARAMETER; 00269 } 00270 } 00271 00272 00273 /* calculate request size */ 00274 Size = sizeof(KSEVENT_ENTRY) + FoundEventItem->ExtraEntryData; 00275 00276 /* do we have an allocator */ 00277 if (Allocator) 00278 { 00279 /* allocate event entry */ 00280 Status = Allocator(Irp, Size, FALSE); 00281 00282 if (!NT_SUCCESS(Status)) 00283 { 00284 /* failed */ 00285 return Status; 00286 } 00287 00288 /* assume the caller put it there */ 00289 EventEntry = KSEVENT_ENTRY_IRP_STORAGE(Irp); 00290 00291 } 00292 else 00293 { 00294 /* allocate it from nonpaged pool */ 00295 EventEntry = AllocateItem(NonPagedPool, Size); 00296 } 00297 00298 if (!EventEntry) 00299 { 00300 /* not enough memory */ 00301 return STATUS_INSUFFICIENT_RESOURCES; 00302 } 00303 00304 /* zero event entry */ 00305 RtlZeroMemory(EventEntry, Size); 00306 00307 /* initialize event entry */ 00308 EventEntry->EventData = EventData; 00309 EventEntry->NotificationType = EventData->NotificationType; 00310 EventEntry->EventItem = FoundEventItem; 00311 EventEntry->EventSet = FoundEventSet; 00312 EventEntry->FileObject = IoStack->FileObject; 00313 00314 switch(EventEntry->NotificationType) 00315 { 00316 case KSEVENTF_EVENT_HANDLE: 00317 EventEntry->Object = Object; 00318 EventEntry->Reserved = 0; 00319 break; 00320 case KSEVENTF_SEMAPHORE_HANDLE: 00321 EventEntry->Object = Object; 00322 EventEntry->SemaphoreAdjustment = EventData->SemaphoreHandle.Adjustment; 00323 EventEntry->Reserved = 0; 00324 break; 00325 case KSEVENTF_EVENT_OBJECT: 00326 EventEntry->Object = EventData->EventObject.Event; 00327 EventEntry->Reserved = EventData->EventObject.Increment; 00328 break; 00329 case KSEVENTF_SEMAPHORE_OBJECT: 00330 EventEntry->Object = EventData->SemaphoreObject.Semaphore; 00331 EventEntry->SemaphoreAdjustment = EventData->SemaphoreObject.Adjustment; 00332 EventEntry->Reserved = EventData->SemaphoreObject.Increment; 00333 break; 00334 case KSEVENTF_DPC: 00335 EventEntry->Object = EventData->Dpc.Dpc; 00336 EventData->Dpc.ReferenceCount = 0; 00337 break; 00338 case KSEVENTF_WORKITEM: 00339 EventEntry->Object = EventData->WorkItem.WorkQueueItem; 00340 EventEntry->BufferItem = (PKSBUFFER_ITEM)UlongToPtr(EventData->WorkItem.WorkQueueType); 00341 break; 00342 case KSEVENTF_KSWORKITEM: 00343 EventEntry->Object = EventData->KsWorkItem.KsWorkerObject; 00344 EventEntry->DpcItem = (PKSDPC_ITEM)EventData->KsWorkItem.WorkQueueItem; 00345 break; 00346 default: 00347 /* should not happen */ 00348 ASSERT(0); 00349 } 00350 00351 if (FoundEventItem->AddHandler) 00352 { 00353 /* now add the event */ 00354 Status = FoundEventItem->AddHandler(Irp, EventData, EventEntry); 00355 00356 if (!NT_SUCCESS(Status)) 00357 { 00358 /* discard event entry */ 00359 KsDiscardEvent(EventEntry); 00360 } 00361 } 00362 else 00363 { 00364 /* setup context */ 00365 Ctx.List = EventsList; 00366 Ctx.EventEntry = EventEntry; 00367 00368 /* add the event */ 00369 (void)KspSynchronizedEventRoutine(EventsFlags, EventsLock, SyncAddEvent, &Ctx); 00370 00371 Status = STATUS_SUCCESS; 00372 } 00373 00374 /* done */ 00375 return Status; 00376 } 00377 00378 /* 00379 @implemented 00380 */ 00381 KSDDKAPI 00382 NTSTATUS 00383 NTAPI 00384 KsEnableEvent( 00385 IN PIRP Irp, 00386 IN ULONG EventSetsCount, 00387 IN KSEVENT_SET* EventSet, 00388 IN OUT PLIST_ENTRY EventsList OPTIONAL, 00389 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, 00390 IN PVOID EventsLock OPTIONAL) 00391 { 00392 return KspEnableEvent(Irp, EventSetsCount, EventSet, EventsList, EventsFlags, EventsLock, NULL, 0); 00393 } 00394 00395 /* 00396 @implemented 00397 */ 00398 KSDDKAPI 00399 NTSTATUS 00400 NTAPI 00401 KsEnableEventWithAllocator( 00402 IN PIRP Irp, 00403 IN ULONG EventSetsCount, 00404 IN PKSEVENT_SET EventSet, 00405 IN OUT PLIST_ENTRY EventsList OPTIONAL, 00406 IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, 00407 IN PVOID EventsLock OPTIONAL, 00408 IN PFNKSALLOCATOR Allocator OPTIONAL, 00409 IN ULONG EventItemSize OPTIONAL) 00410 { 00411 return KspEnableEvent(Irp, EventSetsCount, EventSet, EventsList, EventsFlags, EventsLock, Allocator, EventItemSize); 00412 } 00413 00414 BOOLEAN 00415 NTAPI 00416 KspDisableEvent( 00417 IN PKSEVENT_CTX Ctx) 00418 { 00419 PIO_STACK_LOCATION IoStack; 00420 PKSEVENTDATA EventData; 00421 PKSEVENT_ENTRY EventEntry; 00422 PLIST_ENTRY Entry; 00423 00424 /* get current irp stack location */ 00425 IoStack = IoGetCurrentIrpStackLocation(Ctx->Irp); 00426 00427 /* get event data */ 00428 EventData = (PKSEVENTDATA)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; 00429 00430 if (!Ctx || !Ctx->List || !Ctx->FileObject || !Ctx->Irp) 00431 { 00432 /* invalid parameter */ 00433 return FALSE; 00434 } 00435 00436 /* point to first entry */ 00437 Entry = Ctx->List->Flink; 00438 00439 while(Entry != Ctx->List) 00440 { 00441 /* get event entry */ 00442 EventEntry = (PKSEVENT_ENTRY)CONTAINING_RECORD(Entry, KSEVENT_ENTRY, ListEntry); 00443 00444 if (EventEntry->EventData == EventData && EventEntry->FileObject == Ctx->FileObject) 00445 { 00446 /* found the entry */ 00447 RemoveEntryList(&EventEntry->ListEntry); 00448 Ctx->EventEntry = EventEntry; 00449 return TRUE; 00450 } 00451 00452 /* move to next item */ 00453 Entry = Entry->Flink; 00454 } 00455 /* entry not found */ 00456 return TRUE; 00457 } 00458 00459 /* 00460 @implemented 00461 */ 00462 KSDDKAPI 00463 NTSTATUS 00464 NTAPI 00465 KsDisableEvent( 00466 IN PIRP Irp, 00467 IN OUT PLIST_ENTRY EventsList, 00468 IN KSEVENTS_LOCKTYPE EventsFlags, 00469 IN PVOID EventsLock) 00470 { 00471 PIO_STACK_LOCATION IoStack; 00472 KSEVENT_CTX Ctx; 00473 00474 /* get current irp stack location */ 00475 IoStack = IoGetCurrentIrpStackLocation(Irp); 00476 00477 /* is there a event entry */ 00478 if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSEVENTDATA)) 00479 { 00480 if (IoStack->Parameters.DeviceIoControl.InputBufferLength == 0) 00481 { 00482 /* caller wants to free event items */ 00483 KsFreeEventList(IoStack->FileObject, EventsList, EventsFlags, EventsLock); 00484 return STATUS_SUCCESS; 00485 } 00486 /* invalid parameter */ 00487 return STATUS_INVALID_BUFFER_SIZE; 00488 } 00489 00490 /* setup event ctx */ 00491 Ctx.List = EventsList; 00492 Ctx.FileObject = IoStack->FileObject; 00493 Ctx.Irp = Irp; 00494 Ctx.EventEntry = NULL; 00495 00496 if (KspSynchronizedEventRoutine(EventsFlags, EventsLock, KspDisableEvent, &Ctx)) 00497 { 00498 /* was the event entry found */ 00499 if (Ctx.EventEntry) 00500 { 00501 /* discard event */ 00502 KsDiscardEvent(Ctx.EventEntry); 00503 return STATUS_SUCCESS; 00504 } 00505 /* event was not found */ 00506 return STATUS_UNSUCCESSFUL; 00507 } 00508 00509 /* invalid parameters */ 00510 return STATUS_INVALID_PARAMETER; 00511 } 00512 00513 /* 00514 @implemented 00515 */ 00516 KSDDKAPI 00517 VOID 00518 NTAPI 00519 KsDiscardEvent( 00520 IN PKSEVENT_ENTRY EventEntry) 00521 { 00522 /* sanity check */ 00523 ASSERT(EventEntry->Object); 00524 00525 if (EventEntry->NotificationType == KSEVENTF_SEMAPHORE_HANDLE || EventEntry->NotificationType == KSEVENTF_EVENT_HANDLE) 00526 { 00527 /* release object */ 00528 ObDereferenceObject(EventEntry->Object); 00529 } 00530 00531 /* free event entry */ 00532 FreeItem(EventEntry); 00533 } 00534 00535 00536 BOOLEAN 00537 NTAPI 00538 KspFreeEventList( 00539 IN PKSEVENT_CTX Ctx) 00540 { 00541 PLIST_ENTRY Entry; 00542 PKSEVENT_ENTRY EventEntry; 00543 00544 /* check valid input */ 00545 if (!Ctx || !Ctx->List) 00546 return FALSE; 00547 00548 if (IsListEmpty(Ctx->List)) 00549 return FALSE; 00550 00551 /* remove first entry */ 00552 Entry = RemoveHeadList(Ctx->List); 00553 if (!Entry) 00554 { 00555 /* list is empty, bye-bye */ 00556 return FALSE; 00557 } 00558 00559 /* get event entry */ 00560 EventEntry = (PKSEVENT_ENTRY)CONTAINING_RECORD(Entry, KSEVENT_ENTRY, ListEntry); 00561 00562 /* store event entry */ 00563 Ctx->EventEntry = EventEntry; 00564 /* return success */ 00565 return TRUE; 00566 } 00567 00568 00569 /* 00570 @implemented 00571 */ 00572 KSDDKAPI 00573 VOID 00574 NTAPI 00575 KsFreeEventList( 00576 IN PFILE_OBJECT FileObject, 00577 IN OUT PLIST_ENTRY EventsList, 00578 IN KSEVENTS_LOCKTYPE EventsFlags, 00579 IN PVOID EventsLock) 00580 { 00581 KSEVENT_CTX Ctx; 00582 00583 /* setup event ctx */ 00584 Ctx.List = EventsList; 00585 Ctx.FileObject = FileObject; 00586 Ctx.EventEntry = NULL; 00587 00588 while(KspSynchronizedEventRoutine(EventsFlags, EventsLock, KspFreeEventList, &Ctx)) 00589 { 00590 if (Ctx.EventEntry) 00591 { 00592 KsDiscardEvent(Ctx.EventEntry); 00593 } 00594 } 00595 } 00596 00597 00598 /* 00599 @implemented 00600 */ 00601 KSDDKAPI 00602 NTSTATUS 00603 NTAPI 00604 KsGenerateEvent( 00605 IN PKSEVENT_ENTRY EntryEvent) 00606 { 00607 if (EntryEvent->NotificationType == KSEVENTF_EVENT_HANDLE || EntryEvent->NotificationType == KSEVENTF_EVENT_OBJECT) 00608 { 00609 /* signal event */ 00610 KeSetEvent(EntryEvent->Object, EntryEvent->Reserved, FALSE); 00611 } 00612 else if (EntryEvent->NotificationType == KSEVENTF_SEMAPHORE_HANDLE || EntryEvent->NotificationType == KSEVENTF_SEMAPHORE_OBJECT) 00613 { 00614 /* release semaphore */ 00615 KeReleaseSemaphore(EntryEvent->Object, EntryEvent->Reserved, EntryEvent->SemaphoreAdjustment, FALSE); 00616 } 00617 else if (EntryEvent->NotificationType == KSEVENTF_DPC) 00618 { 00619 /* increment reference count to indicate dpc is pending */ 00620 InterlockedIncrement((PLONG)&EntryEvent->EventData->Dpc.ReferenceCount); 00621 /* queue dpc */ 00622 KeInsertQueueDpc((PRKDPC)EntryEvent->Object, NULL, NULL); 00623 } 00624 else if (EntryEvent->NotificationType == KSEVENTF_WORKITEM) 00625 { 00626 /* queue work item */ 00627 ExQueueWorkItem((PWORK_QUEUE_ITEM)EntryEvent->Object, PtrToUlong(EntryEvent->BufferItem)); 00628 } 00629 else if (EntryEvent->NotificationType == KSEVENTF_KSWORKITEM) 00630 { 00631 /* queue work item of ks worker */ 00632 return KsQueueWorkItem((PKSWORKER)EntryEvent->Object, (PWORK_QUEUE_ITEM)EntryEvent->DpcItem); 00633 } 00634 else 00635 { 00636 /* unsupported type requested */ 00637 return STATUS_INVALID_PARAMETER; 00638 } 00639 00640 return STATUS_SUCCESS; 00641 } 00642 00643 /* 00644 @unimplemented 00645 */ 00646 KSDDKAPI 00647 NTSTATUS 00648 NTAPI 00649 KsGenerateDataEvent( 00650 IN PKSEVENT_ENTRY EventEntry, 00651 IN ULONG DataSize, 00652 IN PVOID Data) 00653 { 00654 UNIMPLEMENTED; 00655 return STATUS_UNSUCCESSFUL; 00656 } 00657 00658 /* 00659 @unimplemented 00660 */ 00661 KSDDKAPI 00662 VOID 00663 NTAPI 00664 KsGenerateEventList( 00665 IN GUID* Set OPTIONAL, 00666 IN ULONG EventId, 00667 IN PLIST_ENTRY EventsList, 00668 IN KSEVENTS_LOCKTYPE EventsFlags, 00669 IN PVOID EventsLock) 00670 { 00671 UNIMPLEMENTED 00672 } 00673 00674 /* 00675 @implemented 00676 */ 00677 KSDDKAPI 00678 VOID 00679 NTAPI 00680 KsAddEvent( 00681 IN PVOID Object, 00682 IN PKSEVENT_ENTRY EventEntry) 00683 { 00684 PKSBASIC_HEADER Header = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); 00685 00686 ExInterlockedInsertTailList(&Header->EventList, &EventEntry->ListEntry, &Header->EventListLock); 00687 } 00688 00689 /* 00690 @implemented 00691 */ 00692 NTSTATUS 00693 NTAPI 00694 KsDefaultAddEventHandler( 00695 IN PIRP Irp, 00696 IN PKSEVENTDATA EventData, 00697 IN OUT PKSEVENT_ENTRY EventEntry) 00698 { 00699 PIO_STACK_LOCATION IoStack; 00700 PKSIOBJECT_HEADER ObjectHeader; 00701 PKSBASIC_HEADER Header; 00702 00703 /* first get the io stack location */ 00704 IoStack = IoGetCurrentIrpStackLocation(Irp); 00705 00706 /* now get the object header */ 00707 ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; 00708 00709 /* sanity check */ 00710 ASSERT(ObjectHeader->ObjectType); 00711 00712 /* obtain basic header */ 00713 Header = (PKSBASIC_HEADER)((ULONG_PTR)ObjectHeader->ObjectType - sizeof(KSBASIC_HEADER)); 00714 00715 /* now insert the event entry */ 00716 ExInterlockedInsertTailList(&Header->EventList, &EventEntry->ListEntry, &Header->EventListLock); 00717 00718 /* done */ 00719 return STATUS_SUCCESS; 00720 } 00721 00722 00723 00724 /* 00725 @unimplemented 00726 */ 00727 KSDDKAPI 00728 void 00729 NTAPI 00730 KsGenerateEvents( 00731 IN PVOID Object, 00732 IN const GUID* EventSet OPTIONAL, 00733 IN ULONG EventId, 00734 IN ULONG DataSize, 00735 IN PVOID Data OPTIONAL, 00736 IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL, 00737 IN PVOID CallBackContext OPTIONAL) 00738 { 00739 UNIMPLEMENTED 00740 } Generated on Sun May 27 2012 04:24:46 for ReactOS by
1.7.6.1
|