Author: janderwald
Date: Thu Apr 23 23:06:36 2009
New Revision: 40672

URL: http://svn.reactos.org/svn/reactos?rev=40672&view=rev
Log:
- Add tons of ASSERT_IRQL / ASSERT_IRQL_EQUAL
- Queue a dpc when IServiceGroup::RequestService is called above dispatch level
- As a result writing to common buffer and completing irps can be done at the 
same time
- Start the stream at PASSIVE_LEVEL
- Check if key has been deleted in IRegistryKey object function
- Implement IRegistryKey::QueryRegistryValues

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/drm.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
    trunk/reactos/drivers/wdm/audio/backpln/portcls/registry.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -46,6 +46,7 @@
     //ULONG i;
 
     DPRINT1("PcInitializeAdapterDriver\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     /* Our IRP handlers */
     DPRINT1("Setting IRP handlers\n");
@@ -94,6 +95,7 @@
     PPCLASS_DEVICE_EXTENSION portcls_ext = NULL;
 
     DPRINT1("PcAddAdapterDevice called\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!DriverObject || !PhysicalDeviceObject || !StartDevice)
     {
@@ -223,6 +225,7 @@
     ULONG Index;
 
     DPRINT1("PcRegisterSubdevice DeviceObject %p Name %S Unknown %p\n", 
DeviceObject, Name, Unknown);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     /* check if all parameters are valid */
     if (!DeviceObject || !Name || !Unknown)

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/api.c [iso-8859-1] Thu Apr 
23 23:06:36 2009
@@ -20,6 +20,7 @@
     OUT PVOID PropertyBuffer,
     OUT PULONG ResultLength)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return IoGetDeviceProperty(DeviceObject, DeviceProperty, BufferLength, 
PropertyBuffer, ResultLength);
 }
 
@@ -49,6 +50,7 @@
 {
     NTSTATUS Status;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     /* FIXME 
      * check if timer is already used 
@@ -74,6 +76,8 @@
     IN  PIO_TIMER_ROUTINE pTimerRoutine,
     IN  PVOID pContext)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     /* FIXME 
      * check if timer is already used 
      */
@@ -93,6 +97,7 @@
     IN  NTSTATUS NtStatus)
 {
     /* sanity checks */
+    ASSERT_IRQL(DISPATCH_LEVEL);
 
     if (!PropertyRequest)
         return STATUS_INVALID_PARAMETER;

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -114,8 +114,8 @@
     IN  PUNKNOWN ToUnknown,
     IN  ULONG ToPin)
 {
-
     DPRINT("PcRegisterPhysicalConnection\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!DeviceObject || !FromUnknown || !ToUnknown)
         return STATUS_INVALID_PARAMETER;
@@ -134,6 +134,8 @@
     IN  PUNKNOWN ToUnknown,
     IN  ULONG ToPin)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!DeviceObject || !FromString || !ToUnknown)
         return STATUS_INVALID_PARAMETER;
 
@@ -151,6 +153,8 @@
     IN  PUNICODE_STRING ToString,
     IN  ULONG ToPin)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!DeviceObject || !FromUnknown || !ToString)
         return STATUS_INVALID_PARAMETER;
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/drm.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/drm.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/drm.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/drm.c [iso-8859-1] Thu Apr 
23 23:06:36 2009
@@ -18,6 +18,7 @@
     IN  PVOID *paHandlers,
     IN  ULONG NumHandlers)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmAddContentHandlers(ContentId, paHandlers, NumHandlers);
 }
 
@@ -31,6 +32,7 @@
     IN  ULONG cContentId,
     OUT PULONG pMixedContentId)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmCreateContentMixed(paContentId, cContentId, pMixedContentId);
 }
 
@@ -42,6 +44,7 @@
 PcDestroyContent(
     IN  ULONG ContentId)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmDestroyContent(ContentId);
 }
 
@@ -55,6 +58,7 @@
     IN  PVOID Reserved,
     IN  PCDRMFORWARD DrmForward)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmForwardContentToDeviceObject(ContentId, Reserved, DrmForward);
 }
 
@@ -67,6 +71,7 @@
     IN  ULONG ContentId,
     IN  PFILE_OBJECT FileObject)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmForwardContentToFileObject(ContentId, FileObject);
 }
 
@@ -92,5 +97,6 @@
     IN  ULONG ContentId,
     OUT PDRMRIGHTS DrmRights)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmGetContentRights(ContentId, DrmRights);
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -79,6 +79,7 @@
     IN  ULONG cContentId,
     OUT PULONG pMixedContentId)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmCreateContentMixed(paContentId, cContentId, pMixedContentId);
 }
 
@@ -88,6 +89,7 @@
     IN IDrmPort2 * iface,
     IN ULONG ContentId)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmDestroyContent(ContentId);
 }
 
@@ -109,6 +111,7 @@
     IN PUNKNOWN pUnknown,
     IN ULONG NumMethods)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmForwardContentToInterface(ContentId, pUnknown, NumMethods);
 }
 
@@ -119,6 +122,7 @@
     IN ULONG ContentId,
     OUT PDRMRIGHTS  DrmRights)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmGetContentRights(ContentId, DrmRights);
 }
 
@@ -130,6 +134,7 @@
     IN PVOID * paHandlers,
     IN ULONG NumHandlers)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmAddContentHandlers(ContentId, paHandlers, NumHandlers);
 }
 
@@ -141,6 +146,7 @@
     IN PVOID Reserved,
     IN PCDRMFORWARD DrmForward)
 {
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return DrmForwardContentToDeviceObject(ContentId, Reserved, DrmForward);
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -242,6 +242,7 @@
     PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
 
     DPRINT("IInterruptSync_fnConnect\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     Descriptor = 
This->ResourceList->lpVtbl->FindTranslatedEntry(This->ResourceList, 
CmResourceTypeInterrupt, This->ResourceIndex);
     if (!Descriptor)
@@ -273,7 +274,9 @@
     IN IInterruptSync * iface)
 {
     IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+
     DPRINT("IInterruptSync_fnDisconnect\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->Interrupt)
     {
@@ -297,6 +300,7 @@
     IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
 
     DPRINT("IInterruptSync_fnRegisterServiceRoutine\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     NewEntry = AllocateItem(NonPagedPool, sizeof(SYNC_ENTRY), TAG_PORTCLASS);
     if (!NewEntry)

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c [iso-8859-1] Thu Apr 
23 23:06:36 2009
@@ -291,6 +291,8 @@
     PPCLASS_DEVICE_EXTENSION DeviceExt;
     NTSTATUS Status;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
     /* initialize the notification event */

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -13,7 +13,6 @@
     LIST_ENTRY Entry;
     KSSTREAM_HEADER *Header;
     PIRP Irp;
-    KDPC Dpc;
 
     ULONG NumTags;
     PVOID * Tag;
@@ -48,15 +47,9 @@
 
 VOID
 NTAPI
-DpcRoutine(
-    IN struct _KDPC  *Dpc,
-    IN PVOID  DeferredContext,
-    IN PVOID  SystemArgument1,
-    IN PVOID  SystemArgument2)
-{
-    PIRP_MAPPING CurMapping;
-
-    CurMapping = (PIRP_MAPPING)SystemArgument1;
+FreeMappingRoutine(
+    PIRP_MAPPING CurMapping)
+{
     ASSERT(CurMapping);
 
     if (CurMapping->Irp)
@@ -159,8 +152,6 @@
 
     Mapping->Header = (KSSTREAM_HEADER*)Buffer;
     Mapping->Irp = Irp;
-    KeInitializeDpc(&Mapping->Dpc, DpcRoutine, (PVOID)Mapping);
-    KeSetImportanceDpc(&Mapping->Dpc, HighImportance);
 
     if (This->MaxFrameSize)
     {
@@ -215,7 +206,7 @@
     IN ULONG BytesWritten)
 {
     IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
-    PIRP_MAPPING Mapping;
+    PIRP_MAPPING Mapping, CurMapping;
 
     This->CurrentOffset += BytesWritten;
     This->NumDataAvailable -= BytesWritten;
@@ -224,11 +215,12 @@
     {
         This->CurrentOffset = 0;
         Mapping = (PIRP_MAPPING)ExInterlockedRemoveHeadList(&This->ListHead, 
&This->Lock);
-
+        CurMapping = This->FirstMap;
+
+        (void)InterlockedExchangePointer((PVOID volatile*)&This->FirstMap, 
(PVOID)Mapping);
         InterlockedDecrement(&This->NumMappings);
 
-        KeInsertQueueDpc(&This->FirstMap->Dpc, (PVOID)This->FirstMap, NULL);
-        (void)InterlockedExchangePointer((PVOID volatile*)&This->FirstMap, 
(PVOID)Mapping);
+        FreeMappingRoutine(CurMapping);
     }
 
 }
@@ -279,6 +271,9 @@
 IIrpQueue_fnCancelBuffers(
     IN IIrpQueue *iface)
 {
+    IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
+
+    This->StartStream = FALSE;
     return TRUE;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -19,6 +19,7 @@
     NTSTATUS Status = STATUS_INVALID_PARAMETER;
 
     DPRINT("PcNewMiniport entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!OutMiniport)
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -21,7 +21,7 @@
 /* IUnknown methods */
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IMiniportDMus_fnQueryInterface(
     IMiniportDMus* iface,
     IN  REFIID refiid,
@@ -39,7 +39,7 @@
 }
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IMiniportDMus_fnAddRef(
     IMiniportDMus* iface)
 {
@@ -49,7 +49,7 @@
 }
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IMiniportDMust_fnRelease(
     IMiniportDMus* iface)
 {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -24,7 +24,6 @@
     KSSTATE State;
     PKSDATAFORMAT Format;
     KSPIN_CONNECT * ConnectDetails;
-    KDPC Dpc;
 
     PVOID CommonBuffer;
     ULONG CommonBufferSize;
@@ -35,11 +34,18 @@
     PUCHAR ActiveIrpBuffer;
     ULONG ActiveIrpBufferSize;
     ULONG ActiveIrpOffset;
-    ULONG DelayedRequestInProgress;
     ULONG FrameSize;
     BOOL Capture;
 
 }IPortPinWaveCyclicImpl;
+
+
+typedef struct
+{
+    IPortPinWaveCyclicImpl *Pin;
+    PIO_WORKITEM WorkItem;
+    KSSTATE State;
+}SETSTREAM_CONTEXT, *PSETSTREAM_CONTEXT;
 
 NTSTATUS
 NTAPI
@@ -194,57 +200,64 @@
 
 VOID
 NTAPI
-StopStreamWorkerRoutine(
+SetStreamWorkerRoutine(
     IN PDEVICE_OBJECT  DeviceObject,
     IN PVOID  Context)
 {
     IPortPinWaveCyclicImpl * This;
-    PSTOPSTREAM_CONTEXT Ctx = (PSTOPSTREAM_CONTEXT)Context;
-
-    This = (IPortPinWaveCyclicImpl*)Ctx->Pin;
+    PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context;
+    KSSTATE State;
+
+    This = Ctx->Pin;
+    State = Ctx->State;
 
     IoFreeWorkItem(Ctx->WorkItem);
     FreeItem(Ctx, TAG_PORTCLASS);
 
-    if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue))
+    /* Has the audio stream resumed? */
+    if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) && State == 
KSSTATE_STOP)
         return;
 
-    /* Set the state to stop */
-    This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_STOP);
-    /* Set internal state to stop */
-    This->State = KSSTATE_STOP;
-
-    DPRINT1("Stopping %p %u Irql %u\n", This, 
This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), KeGetCurrentIrql());
+    /* Set the state */
+    if (NT_SUCCESS(This->Stream->lpVtbl->SetState(This->Stream, State)))
+    {
+        /* Set internal state to stop */
+        This->State = State;
+
+        if (This->State == KSSTATE_STOP)
+        {
+            /* reset start stream */
+            This->IrpQueue->lpVtbl->CancelBuffers(This->IrpQueue); //FIX 
function name
+            DPRINT1("Stopping %u Irql %u\n", This, 
This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), KeGetCurrentIrql());
+        }
+    }
 }
 
 VOID
 NTAPI
-StopStreamRoutine(
-    IN PKDPC  Dpc,
-    IN PVOID  DeferredContext,
-    IN PVOID  SystemArgument1,
-    IN PVOID  SystemArgument2)
-{
-   PDEVICE_OBJECT DeviceObject;
-   IPortPinWaveCyclicImpl * This = (IPortPinWaveCyclicImpl*)DeferredContext;
-   PIO_WORKITEM WorkItem;
-   PSTOPSTREAM_CONTEXT Context;
+SetStreamState(
+   IN IPortPinWaveCyclicImpl * This,
+   IN KSSTATE State)
+{
+    PDEVICE_OBJECT DeviceObject;
+    PIO_WORKITEM WorkItem;
+    PSETSTREAM_CONTEXT Context;
 
     ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
 
     /* Has the audio stream resumed? */
-    if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue))
+    if (This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue) && State == 
KSSTATE_STOP)
         return;
 
-    /* Has the audio stream already stopped */
-    if (This->State == KSSTATE_STOP)
+    /* Has the audio state already been set? */
+    if (This->State == State)
         return;
 
     /* Get device object */
     DeviceObject = GetDeviceObject(This->Port);
 
-    /* allocate stop context */
-    Context = AllocateItem(NonPagedPool, sizeof(STOPSTREAM_CONTEXT), 
TAG_PORTCLASS);
+    /* allocate set state context */
+    Context = AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), 
TAG_PORTCLASS);
 
     if (!Context)
         return;
@@ -260,9 +273,10 @@
 
     Context->Pin = (PVOID)This;
     Context->WorkItem = WorkItem;
+    Context->State = State;
 
     /* queue the work item */
-    IoQueueWorkItem(WorkItem, StopStreamWorkerRoutine, DelayedWorkQueue, 
(PVOID)Context);
+    IoQueueWorkItem(WorkItem, SetStreamWorkerRoutine, DelayedWorkQueue, 
(PVOID)Context);
 }
 
 static
@@ -277,10 +291,12 @@
     ULONG BufferSize;
     IPortPinWaveCyclicImpl * This = 
(IPortPinWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortPinWaveCyclicImpl, 
lpVtblServiceSink);
 
+    ASSERT_IRQL(DISPATCH_LEVEL);
+
     Status = This->IrpQueue->lpVtbl->GetMapping(This->IrpQueue, &Buffer, 
&BufferSize);
     if (!NT_SUCCESS(Status))
     {
-        KeInsertQueueDpc(&This->Dpc, NULL, NULL);
+        SetStreamState(This, KSSTATE_STOP);
         return;
     }
 
@@ -481,9 +497,7 @@
                     
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.SubFormat,
 &KSDATAFORMAT_SUBTYPE_PCM));
                     
ASSERT(IsEqualGUIDAligned(&((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->DataFormat.Specifier,
 &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX));
 
-                    Status = This->Stream->lpVtbl->SetState(This->Stream, 
KSSTATE_STOP);
-                    ASSERT(Status == STATUS_SUCCESS);
-                    This->State = KSSTATE_STOP;
+                    ASSERT(This->State == KSSTATE_STOP);
                     DPRINT1("NewDataFormat: Channels %u Bits %u Samples %u\n", 
((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
                                                                                
  ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
                                                                                
  ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
@@ -501,7 +515,6 @@
                         IoCompleteRequest(Irp, IO_NO_INCREMENT);
                         return STATUS_SUCCESS;
                     }
-
                 }
                 DPRINT1("Failed to set format\n");
                 Irp->IoStatus.Information = 0;
@@ -921,11 +934,9 @@
 
     if (This->IrpQueue->lpVtbl->MinimumDataAvailable(This->IrpQueue) == TRUE 
&& This->State != KSSTATE_RUN)
     {
+        SetStreamState(This, KSSTATE_RUN);
         /* some should initiate a state request but didnt do it */
-        DPRINT1("Starting stream with %lu\n", 
This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue));
-
-        This->Stream->lpVtbl->SetState(This->Stream, KSSTATE_RUN);
-        This->State = KSSTATE_RUN;
+        DPRINT1("Starting stream with %lu mappings Status %x\n", 
This->IrpQueue->lpVtbl->NumMappings(This->IrpQueue), Status);
     }
 
     return TRUE;
@@ -958,7 +969,6 @@
     This->KsPinDescriptor = KsPinDescriptor;
     This->ConnectDetails = ConnectDetails;
     This->Miniport = GetWaveCyclicMiniport(Port);
-    KeInitializeDpc(&This->Dpc, StopStreamRoutine, (PVOID)This);
 
     DeviceObject = GetDeviceObject(Port);
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c [iso-8859-1] Thu Apr 
23 23:06:36 2009
@@ -21,6 +21,8 @@
     UNICODE_STRING GuidString;
 
     DPRINT("PcNewPort entered\n");
+
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!OutPort)
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -97,6 +97,8 @@
 {
     IPortDMusImpl * This = (IPortDMusImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortDMus_fnNewRegistryKey called w/o initiazed\n");
@@ -119,6 +121,8 @@
     IMiniportDMus * Miniport;
     NTSTATUS Status;
     IPortDMusImpl * This = (IPortDMusImpl*)iface;
+
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (This->bInitialized)
     {
@@ -166,6 +170,8 @@
 {
     IPortDMusImpl * This = (IPortDMusImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortDMus_fnNewRegistryKey called w/o initialized\n");
@@ -173,13 +179,6 @@
     }
     return STATUS_UNSUCCESSFUL;
 }
-
-
-
-
-
-
-
 
 NTSTATUS
 NewPortDMus(

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_midi.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -134,6 +134,8 @@
 {
     IPortMidiImpl * This = (IPortMidiImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortMidi_fnNewRegistryKey called w/o initiazed\n");
@@ -160,6 +162,7 @@
 
     DPRINT("IPortMidi_fnInit entered This %p DeviceObject %p Irp %p 
UnknownMiniport %p UnknownAdapter %p ResourceList %p\n",
             This, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, 
ResourceList);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (This->bInitialized)
     {
@@ -239,6 +242,8 @@
 {
     IPortMidiImpl * This = (IPortMidiImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortMidi_fnNewRegistryKey called w/o initialized\n");
@@ -272,6 +277,7 @@
     IN PSERVICEGROUP  ServiceGroup)
 {
     UNIMPLEMENTED
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -153,6 +153,7 @@
     OUT PULONG  ReturnLength)
 {
     IPortTopologyImpl * This = (IPortTopologyImpl*)iface;
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {
@@ -179,6 +180,7 @@
 
     DPRINT("IPortTopology_fnInit entered This %p DeviceObject %p Irp %p 
UnknownMiniport %p UnknownAdapter %p ResourceList %p\n",
             This, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, 
ResourceList);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (This->bInitialized)
     {
@@ -255,6 +257,7 @@
     OUT PULONG  Disposition  OPTIONAL)
 {
     IPortTopologyImpl * This = (IPortTopologyImpl*)iface;
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {
@@ -506,7 +509,7 @@
     PKSOBJECT_CREATE_ITEM CreateItem;
     PPIN_WORKER_CONTEXT Context;
 
-    DPRINT("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject);
+    DPRINT1("PcCreateItemDispatch called DeviceObject %p\n", DeviceObject);
 
     /* access the create item */
     CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp);
@@ -570,7 +573,7 @@
                                              NULL);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT("Failed to get filter object\n");
+        DPRINT1("Failed to get filter object\n");
         return Status;
     }
 
@@ -580,7 +583,7 @@
         /* create the dispatch object */
         Status = NewDispatchObject(Irp, Filter);
 
-        DPRINT("Filter %p\n", Filter);
+        DPRINT1("Filter %p\n", Filter);
     }
     else
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -287,6 +287,7 @@
     OUT PULONG  ReturnLength)
 {
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {
@@ -314,6 +315,7 @@
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
     DPRINT("IPortWaveCyclic_Init entered %p\n", This);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (This->bInitialized)
     {
@@ -420,6 +422,8 @@
 {
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initialized\n");
@@ -450,6 +454,8 @@
     DEVICE_DESCRIPTION DeviceDescription;
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!This->bInitialized)
     {
         DPRINT("IPortWaveCyclic_fnNewSlaveDmaChannel called w/o 
initialized\n");
@@ -480,8 +486,9 @@
     DEVICE_DESCRIPTION DeviceDescription;
     PDMACHANNEL DmaChannel;
     NTSTATUS Status;
-
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
+
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c [iso-8859-1] 
Thu Apr 23 23:06:36 2009
@@ -114,6 +114,7 @@
     IN PKSEVENT_ENTRY EventEntry)
 {
     UNIMPLEMENTED
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 }
 
 
@@ -348,6 +349,7 @@
 
     DPRINT("IPortWavePci_fnInit entered with This %p, DeviceObject %p Irp %p 
UnknownMiniport %p, UnknownAdapter %p ResourceList %p\n", 
             This, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, 
ResourceList);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (This->bInitialized)
     {
@@ -471,6 +473,7 @@
     IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
 
     DPRINT("IPortWavePci_fnNewRegistryKey entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {
@@ -501,6 +504,7 @@
     IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
 
     DPRINT("IPortWavePci_fnGetDeviceProperty entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!This->bInitialized)
     {
@@ -533,6 +537,7 @@
     IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
 
     DPRINT("IPortWavePci_fnNewMasterDmaChannel This %p entered\n", This);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     Status = PcDmaMasterDescription(ResourceList, ScatterGather, 
Dma32BitAddresses, IgnoreCount, Dma64BitAddresses, DmaWidth, DmaSpeed, 
MaximumLength, DmaPort, &DeviceDescription);
     if (NT_SUCCESS(Status))

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepcistream.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -86,6 +86,8 @@
 {
     IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
 
+    ASSERT_IRQL(DISPATCH_LEVEL);
+
     return This->Queue->lpVtbl->GetMappingWithTag(This->Queue, Tag, 
PhysicalAddress, VirtualAddress, ByteCount, Flags);
 }
 
@@ -97,6 +99,9 @@
     IN PVOID  Tag)
 {
     IPortWavePciStreamImpl * This = (IPortWavePciStreamImpl*)iface;
+
+    ASSERT_IRQL(DISPATCH_LEVEL);
+
     This->Queue->lpVtbl->ReleaseMappingWithTag(This->Queue, Tag);
     return STATUS_SUCCESS;
 }
@@ -108,6 +113,7 @@
     IN IPortWavePciStream *iface)
 {
     UNIMPLEMENTED
+    ASSERT_IRQL(DISPATCH_LEVEL);
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -24,6 +24,7 @@
     IAdapterPowerManagement * pPower;
 
     DPRINT("PcRegisterAdapterPowerManagement pUnknown %p pvContext %p\n", 
pUnknown, pvContext);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     if (!pUnknown || !pvContext)
         return STATUS_INVALID_PARAMETER;
@@ -72,6 +73,8 @@
     POWER_STATE PowerState;
     PPCLASS_DEVICE_EXTENSION DeviceExt;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     if (!DeviceObject || !RequestedNewState)
         return STATUS_INVALID_PARAMETER;
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -28,6 +28,8 @@
   #define STDCALL
   #define DDKAPI
 #endif
+
+#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
 
 NTSTATUS
 NTAPI
@@ -181,12 +183,6 @@
     KSSTREAM_HEADER Header;
     PIRP Irp;
 }CONTEXT_WRITE, *PCONTEXT_WRITE;
-
-typedef struct
-{
-    PVOID Pin;
-    PIO_WORKITEM WorkItem;
-}STOPSTREAM_CONTEXT, *PSTOPSTREAM_CONTEXT;
 
 typedef struct
 {

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/registry.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/registry.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/registry.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/registry.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -14,6 +14,7 @@
 
     LONG ref;
     HANDLE hKey;
+    BOOL Deleted;
 
 }IRegistryKeyImpl;
 
@@ -22,7 +23,7 @@
 
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnAddRef(
     IN IRegistryKey* iface)
 {
@@ -34,7 +35,7 @@
 }
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnRelease(
     IN IRegistryKey* iface)
 {
@@ -56,7 +57,7 @@
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnQueryInterface(
     IN IRegistryKey* iface,
     IN  REFIID refiid,
@@ -77,17 +78,29 @@
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnDeleteKey(
     IN IRegistryKey* iface)
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-    DPRINT("IRegistryKey_fnDeleteKey entered\n");
-    return ZwDeleteKey(This->hKey);
-}
-
-NTSTATUS
-STDMETHODCALLTYPE
+    NTSTATUS Status;
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
+    Status = ZwDeleteKey(This->hKey);
+    if (NT_SUCCESS(Status))
+    {
+        This->Deleted = TRUE;
+    }
+    return Status;
+}
+
+NTSTATUS
+NTAPI
 IRegistryKey_fnEnumerateKey(
     IN IRegistryKey* iface,
     IN ULONG  Index,
@@ -97,12 +110,18 @@
     OUT PULONG  ResultLength)
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-    DPRINT("IRegistryKey_fnEnumerateKey entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
     return ZwEnumerateKey(This->hKey, Index, KeyInformationClass, 
KeyInformation, Length, ResultLength);
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnEnumerateKeyValue(
     IN IRegistryKey* iface,
     IN ULONG  Index,
@@ -112,12 +131,18 @@
     OUT PULONG  ResultLength)
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-    DPRINT("IRegistryKey_fnEnumerateKeyValue entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
     return ZwEnumerateValueKey(This->hKey, Index, KeyValueInformationClass, 
KeyValueInformation, Length, ResultLength);
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnNewSubKey(
     IN IRegistryKey* iface,
     OUT PREGISTRYKEY  *RegistrySubKey,
@@ -132,7 +157,14 @@
     HANDLE hKey;
     IRegistryKeyImpl * NewThis, *This = (IRegistryKeyImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     DPRINT("IRegistryKey_fnNewSubKey entered %S\n", SubKeyName);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
 
     InitializeObjectAttributes(&Attributes, SubKeyName, 0, This->hKey, NULL);
     Status = ZwCreateKey(&hKey, KEY_READ | KEY_WRITE, &Attributes, 0, NULL, 0, 
Disposition);
@@ -164,7 +196,7 @@
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnQueryKey(
     IN IRegistryKey* iface,
     IN KEY_INFORMATION_CLASS  KeyInformationClass,
@@ -173,25 +205,36 @@
     OUT PULONG  ResultLength)
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-    DPRINT("IRegistryKey_fnQueryKey entered\n");
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
     return ZwQueryKey(This->hKey, KeyInformationClass, KeyInformation, Length, 
ResultLength);
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnQueryRegistryValues(
     IN IRegistryKey* iface,
     IN PRTL_QUERY_REGISTRY_TABLE  QueryTable,
     IN PVOID  Context  OPTIONAL)
 {
-    //IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-    UNIMPLEMENTED
-    DbgBreakPoint();
-    return STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS
-STDMETHODCALLTYPE
+    IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
+    return RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, (PCWSTR)This->hKey, 
QueryTable, Context, NULL);
+}
+
+NTSTATUS
+NTAPI
 IRegistryKey_fnQueryValueKey(
     IN IRegistryKey* iface,
     IN PUNICODE_STRING  ValueName,
@@ -201,12 +244,20 @@
     OUT PULONG  ResultLength)
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+
     DPRINT("IRegistryKey_fnQueryValueKey entered %p value %wZ\n", This, 
ValueName);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
     return ZwQueryValueKey(This->hKey, ValueName, KeyValueInformationClass, 
KeyValueInformation, Length, ResultLength);
 }
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IRegistryKey_fnSetValueKey(
     IN IRegistryKey* iface,
     IN PUNICODE_STRING  ValueName  OPTIONAL,
@@ -217,6 +268,13 @@
 {
     IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
     DPRINT("IRegistryKey_fnSetValueKey entered %S\n", ValueName->Buffer);
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    if (This->Deleted)
+    {
+        return STATUS_INVALID_HANDLE;
+    }
+
     return ZwSetValueKey(This->hKey, ValueName, 0, Type, Data, DataSize);
 }
 

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c [iso-8859-1] 
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c [iso-8859-1] Thu 
Apr 23 23:06:36 2009
@@ -98,6 +98,8 @@
 {
     IResourceListImpl * This = (IResourceListImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     return This->TranslatedResourceList->List[0].PartialResourceList.Count;
 }
 
@@ -107,12 +109,13 @@
     IResourceList* iface,
     IN  CM_RESOURCE_TYPE Type)
 {
-    /* I guess the translated and untranslated lists will be same length? */
-
     IResourceListImpl * This = (IResourceListImpl*)iface;
     ULONG Index, Count = 0;
     PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
+    /* I guess the translated and untranslated lists will be same length? */
     for (Index = 0; Index < 
This->TranslatedResourceList->List[0].PartialResourceList.Count; Index ++ )
     {
         PartialDescriptor = 
&This->TranslatedResourceList->List[0].PartialResourceList.PartialDescriptors[Index];
@@ -138,6 +141,8 @@
     IResourceListImpl * This = (IResourceListImpl*)iface;
     ULONG DescIndex, Count = 0;
     PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
+
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     for (DescIndex = 0; DescIndex < 
This->TranslatedResourceList->List[0].PartialResourceList.Count; DescIndex ++ )
     {
@@ -168,6 +173,8 @@
     ULONG DescIndex, Count = 0;
     PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     for (DescIndex = 0; DescIndex < 
This->UntranslatedResourceList->List[0].PartialResourceList.Count; DescIndex ++ 
)
     {
         PartialDescriptor = 
&This->UntranslatedResourceList->List[0].PartialResourceList.PartialDescriptors[DescIndex];
@@ -196,6 +203,8 @@
     ULONG NewTranslatedSize, NewUntranslatedSize;
     IResourceListImpl * This = (IResourceListImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     NewTranslatedSize = sizeof(CM_RESOURCE_LIST) + 
This->TranslatedResourceList[0].List->PartialResourceList.Count * 
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
     NewTranslatedResources = AllocateItem(This->PoolType, NewTranslatedSize, 
TAG_PORTCLASS);
     if (!NewTranslatedResources)
@@ -254,6 +263,8 @@
     ULONG NewTranslatedSize;
     IResourceListImpl * This = (IResourceListImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     Translated = Parent->lpVtbl->FindTranslatedEntry(Parent, Type, Index);
     if (!Translated)
         return STATUS_INVALID_PARAMETER;
@@ -287,6 +298,8 @@
 {
     IResourceListImpl * This = (IResourceListImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     return This->TranslatedResourceList;
 }
 
@@ -296,6 +309,8 @@
     IResourceList* iface)
 {
     IResourceListImpl * This = (IResourceListImpl*)iface;
+
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     return This->UntranslatedResourceList;
 }

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c?rev=40672&r1=40671&r2=40672&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c 
[iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c 
[iso-8859-1] Thu Apr 23 23:06:36 2009
@@ -25,9 +25,7 @@
     BOOL Initialized;
     BOOL TimerActive;
     KTIMER Timer;
-    KEVENT DpcEvent;
     KDPC Dpc;
-
 }IServiceGroupImpl;
 
 
@@ -38,7 +36,7 @@
 
 
 NTSTATUS
-STDMETHODCALLTYPE
+NTAPI
 IServiceGroup_fnQueryInterface(
     IServiceGroup* iface,
     IN  REFIID refiid,
@@ -66,7 +64,7 @@
 }
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IServiceGroup_fnAddRef(
     IServiceGroup* iface)
 {
@@ -76,7 +74,7 @@
 }
 
 ULONG
-STDMETHODCALLTYPE
+NTAPI
 IServiceGroup_fnRelease(
     IServiceGroup* iface)
 {
@@ -95,7 +93,6 @@
             Entry->pServiceSink->lpVtbl->Release(Entry->pServiceSink);
             FreeItem(Entry, TAG_PORTCLASS);
         }
-        KeWaitForSingleObject(&This->DpcEvent, Executive, KernelMode, FALSE, 
NULL);
         KeCancelTimer(&This->Timer);
         FreeItem(This, TAG_PORTCLASS);
         return 0;
@@ -115,17 +112,18 @@
 IServiceGroup_fnRequestService(
     IN IServiceGroup * iface)
 {
-    PLIST_ENTRY CurEntry;
-    PGROUP_ENTRY Entry;
-    IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
-
-    CurEntry = This->ServiceSinkHead.Flink;
-    while (CurEntry != &This->ServiceSinkHead)
-    {
-        Entry = CONTAINING_RECORD(CurEntry, GROUP_ENTRY, Entry);
-        Entry->pServiceSink->lpVtbl->RequestService(Entry->pServiceSink);
-        CurEntry = CurEntry->Flink;
-    }
+    KIRQL OldIrql;
+    IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
+
+    if (KeGetCurrentIrql() > DISPATCH_LEVEL)
+    {
+        KeInsertQueueDpc(&This->Dpc, NULL, NULL);
+        return;
+    }
+
+    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+    KeInsertQueueDpc(&This->Dpc, NULL, NULL);
+    KeLowerIrql(OldIrql);
 }
 
 //---------------------------------------------------------------
@@ -141,6 +139,8 @@
     PGROUP_ENTRY Entry;
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
 
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
+
     Entry = AllocateItem(NonPagedPool, sizeof(GROUP_ENTRY), TAG_PORTCLASS);
     if (!Entry)
         return STATUS_INSUFFICIENT_RESOURCES;
@@ -148,8 +148,6 @@
     Entry->pServiceSink = pServiceSink;
     pServiceSink->lpVtbl->AddRef(pServiceSink);
 
-    //FIXME
-    //check if Dpc is active
     InsertTailList(&This->ServiceSinkHead, &Entry->Entry);
 
     return STATUS_SUCCESS;
@@ -165,9 +163,7 @@
     PGROUP_ENTRY Entry;
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
 
-    //FIXME
-    //check if Dpc is active
-    //
+    ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
 
     CurEntry = This->ServiceSinkHead.Flink;
     while (CurEntry != &This->ServiceSinkHead)
@@ -194,11 +190,18 @@
     IN PVOID  SystemArgument2
     )
 {
+    PLIST_ENTRY CurEntry;
+    PGROUP_ENTRY Entry;
     IServiceGroupImpl * This = (IServiceGroupImpl*)DeferredContext;
-    IServiceGroup_fnRequestService((IServiceGroup*)DeferredContext);
-    KeSetEvent(&This->DpcEvent, IO_SOUND_INCREMENT, FALSE);
-}
-
+
+    CurEntry = This->ServiceSinkHead.Flink;
+    while (CurEntry != &This->ServiceSinkHead)
+    {
+        Entry = CONTAINING_RECORD(CurEntry, GROUP_ENTRY, Entry);
+        Entry->pServiceSink->lpVtbl->RequestService(Entry->pServiceSink);
+        CurEntry = CurEntry->Flink;
+    }
+}
 
 VOID
 NTAPI
@@ -207,11 +210,11 @@
 {
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
 
+    ASSERT_IRQL(DISPATCH_LEVEL);
+
     if (!This->Initialized)
     {
-        KeInitializeEvent(&This->DpcEvent, SynchronizationEvent, FALSE);
         KeInitializeTimerEx(&This->Timer, NotificationTimer);
-        KeInitializeDpc(&This->Dpc, IServiceGroupDpc, (PVOID)This);
         This->Initialized = TRUE;
     }
 }
@@ -224,6 +227,8 @@
 {
     LARGE_INTEGER DueTime;
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
+
+    ASSERT_IRQL(DISPATCH_LEVEL);
 
     DueTime.QuadPart = ullDelay;
 
@@ -233,8 +238,6 @@
             KeSetTimer(&This->Timer, DueTime, &This->Dpc);
         else
             KeInsertQueueDpc(&This->Dpc, NULL, NULL);
-
-        KeClearEvent(&This->DpcEvent);
     }
 }
 
@@ -244,6 +247,8 @@
     IN IServiceGroup * iface)
 {
     IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
+
+    ASSERT_IRQL(DISPATCH_LEVEL);
 
     if (This->Initialized)
     {
@@ -283,6 +288,8 @@
 
     This->lpVtbl = &vt_IServiceGroup;
     This->ref = 1;
+    KeInitializeDpc(&This->Dpc, IServiceGroupDpc, (PVOID)This);
+    KeSetImportanceDpc(&This->Dpc, HighImportance);
     InitializeListHead(&This->ServiceSinkHead);
     *OutServiceGroup = (PSERVICEGROUP)&This->lpVtbl;
 

Reply via email to