[ros-diffs] [janderwald] 38857: - Store DeviceObject before calling IMiniportWaveCyclic as the driver might immediately call port functions - Pass the PhysicalDeviceObject to IoGetDmaAdapter

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Jan 17 23:22:09 CET 2009


Author: janderwald
Date: Sat Jan 17 16:22:09 2009
New Revision: 38857

URL: http://svn.reactos.org/svn/reactos?rev=38857&view=rev
Log:
- Store DeviceObject before calling IMiniportWaveCyclic as the driver might immediately call port functions
- Pass the PhysicalDeviceObject to IoGetDmaAdapter

Modified:
    trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
    trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c

Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c?rev=38857&r1=38856&r2=38857&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c [iso-8859-1] Sat Jan 17 16:22:09 2009
@@ -484,8 +484,12 @@
     ULONG MapRegisters;
     INTERFACE_TYPE BusType;
     ULONG ResultLength;
+    PCExtension* DeviceExt;
 
     IDmaChannelSlaveImpl * This;
+
+    DPRINT1("OutDmaChannel %p OuterUnknown %p PoolType %p DeviceDescription %p DeviceObject %p\n",
+            OutDmaChannel, OuterUnknown, PoolType, DeviceDescription, DeviceObject);
 
     This = AllocateItem(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
     if (!This)
@@ -493,6 +497,7 @@
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
+    DeviceExt = (PCExtension*) DeviceObject->DeviceExtension;
 
     Status = IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength);
     if (NT_SUCCESS(Status))
@@ -500,7 +505,9 @@
         DeviceDescription->InterfaceType = BusType;
     }
 
-    Adapter = IoGetDmaAdapter(DeviceObject, DeviceDescription, &MapRegisters);
+    DPRINT1("Calling IoGetDmaAdapter\n");
+
+    Adapter = IoGetDmaAdapter(DeviceExt->PhysicalDeviceObject, DeviceDescription, &MapRegisters);
     if (!Adapter)
     {
         FreeItem(This, TAG_PORTCLASS);
@@ -516,7 +523,7 @@
     This->MaxMapRegisters = MapRegisters;
 
     *OutDmaChannel = (PVOID)(&This->lpVtbl);
-
+    DPRINT1("PcNewDmaChannel result %p\n", *OutDmaChannel);
     return STATUS_SUCCESS;
 
 }

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=38857&r1=38856&r2=38857&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] Sat Jan 17 16:22:09 2009
@@ -139,6 +139,8 @@
     PPOWERNOTIFY PowerNotify;
     IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
 
+    DPRINT1("IPortWaveCyclic_Init entered\n");
+
     if (This->bInitialized)
     {
         DPRINT("IPortWaveCyclic_Init called again\n");
@@ -151,43 +153,6 @@
         DPRINT("IPortWaveCyclic_Init called with invalid IMiniport adapter\n");
         return STATUS_INVALID_PARAMETER;
     }
-
-    Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
-        Miniport->lpVtbl->Release(Miniport);
-        return Status;
-    }
-
-    /* check if it supports IPinCount interface */
-    Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPinCount, (PVOID*)&PinCount);
-    if (NT_SUCCESS(Status))
-    {
-        This->pPinCount = PinCount;
-        This->pDescriptor = NULL;
-    }
-    else
-    {
-        Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor);
-        if (!NT_SUCCESS(Status))
-        {
-            Miniport->lpVtbl->Release(Miniport);
-            return Status;
-        }
-        This->pPinCount = NULL;
-    }
-
-    Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPowerNotify, (PVOID*)&PowerNotify);
-    if (NT_SUCCESS(Status))
-    {
-        This->pPowerNotify = PowerNotify;
-    }
-    else
-    {
-        This->pPowerNotify = NULL;
-    }
-
 
     /* Initialize port object */
     This->pMiniport = Miniport;
@@ -197,9 +162,50 @@
 
     /* increment reference on miniport adapter */
     Miniport->lpVtbl->AddRef(Miniport);
+
+    Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
+        Miniport->lpVtbl->Release(Miniport);
+        This->bInitialized = FALSE;
+        return Status;
+    }
+
+    /* check if it supports IPinCount interface */
+    Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPinCount, (PVOID*)&PinCount);
+    if (NT_SUCCESS(Status))
+    {
+        This->pPinCount = PinCount;
+        This->pDescriptor = NULL;
+    }
+    else
+    {
+        Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("failed to get description\n");
+            Miniport->lpVtbl->Release(Miniport);
+            return Status;
+        }
+        This->pPinCount = NULL;
+    }
+
+    Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPowerNotify, (PVOID*)&PowerNotify);
+    if (NT_SUCCESS(Status))
+    {
+        This->pPowerNotify = PowerNotify;
+    }
+    else
+    {
+        This->pPowerNotify = NULL;
+    }
+
     /* increment reference on resource list */
     ResourceList->lpVtbl->AddRef(ResourceList);
 
+
+    DPRINT1("IPortWaveCyclic successfully initialized\n");
     return STATUS_SUCCESS;
 }
 
@@ -314,7 +320,7 @@
     ServiceGroup->lpVtbl->RequestService (ServiceGroup);
 }
 
-static const IPortWaveCyclicVtbl vt_IPortWaveCyclicVtbl =
+static IPortWaveCyclicVtbl vt_IPortWaveCyclicVtbl =
 {
     IPortWaveCyclic_fnQueryInterface,
     IPortWaveCyclic_fnAddRef,
@@ -506,8 +512,8 @@
     if (!This)
         return STATUS_INSUFFICIENT_RESOURCES;
 
-    This->lpVtbl = (IPortWaveCyclicVtbl*)&vt_IPortWaveCyclicVtbl;
-    This->lpVtblSubDevice = (ISubdeviceVtbl*)&vt_ISubdeviceVtbl;
+    This->lpVtbl = &vt_IPortWaveCyclicVtbl;
+    This->lpVtblSubDevice = &vt_ISubdeviceVtbl;
     This->ref = 1;
     *OutPort = (PPORT)(&This->lpVtbl);
 



More information about the Ros-diffs mailing list