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

event.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 doxygen 1.7.6.1

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