Author: janderwald
Date: Sat Jan 17 05:19:27 2009
New Revision: 38810
URL:
http://svn.reactos.org/svn/reactos?rev=38810&view=rev
Log:
- Check for valid DeviceExtensionSize
- Pass correct flags when creating the fdo
- set DO_DIRECT_IO flag
- clear DO_DEVICE_INITIALIZING flag
- Move all calls to ExAllocatePoolWithTag to a function AllocateItem which is also
responsible for zeroing memory
- Fix ISubDevice GUID
- don't disconnect the interrupt on cleanup, IInterruptSync_fnDisconnect exist for
that purpose
- If there is no interrupt yet connected, call the synchronized routine holding the
internal spinlock
- Copy the current stack location when forwarding a Irp PcForwardIrpSynchronous
- Implement ISubdevice interface for IPortTopology
- Initialize the dpc for calling Miniport object, as it might create an interrupt object
which immediately fires an interrupt
- If the caller doesnt provide an IAdapterPowerManagement interface, clear the existing
reference
- Fix 2 bugs in IRegistryKey_NewSubKey which made the system crashing
- Pass the pdo to IoOpenDeviceRegistryKey
- Move all guids and IIDs to own file and initialize them
- portcls initializes now to the first interrupt fired (vbox+ICH AC97 driver | qemu+es1370
driver)
Added:
trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.c (with props)
trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c (with props)
Modified:
trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
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/miniport.c
trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport_dmus.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_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/portcls.rbuild
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
trunk/reactos/drivers/wdm/audio/backpln/portcls/version.c
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/adapter.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -12,8 +12,6 @@
#include "private.h"
#include <devguid.h>
#include <initguid.h>
-
-const GUID IID_ISubdevice;
/*
This is called from DriverEntry so that PortCls can take care of some
@@ -49,7 +47,7 @@
//NTSTATUS status;
//ULONG i;
- DPRINT("PcInitializeAdapterDriver\n");
+ DPRINT1("PcInitializeAdapterDriver\n");
#if 0
/* Set default stub - is this a good idea? */
@@ -101,59 +99,41 @@
IN ULONG MaxObjects,
IN ULONG DeviceExtensionSize)
{
- /*
- Note - after this has been called, we can
- handle IRP_MN_START_DEVICE by calling StartDevice
-
- TODO:
- Validate DeviceExtensionSize!! (et al...)
- */
-
NTSTATUS status = STATUS_UNSUCCESSFUL;
PDEVICE_OBJECT fdo = NULL;
+ PDEVICE_OBJECT PrevDeviceObject;
PCExtension* portcls_ext;
DPRINT1("PcAddAdapterDevice called\n");
- if ( ! DriverObject)
- {
- DPRINT("DriverObject is NULL!\n");
+ if (!DriverObject || !PhysicalDeviceObject || !StartDevice)
+ {
return STATUS_INVALID_PARAMETER;
}
- if ( ! PhysicalDeviceObject )
- {
- DPRINT("PhysicalDeviceObject is NULL!\n");
- return STATUS_INVALID_PARAMETER;
- }
-
- if ( ! StartDevice )
- {
- DPRINT("No StartDevice parameter!\n");
- return STATUS_INVALID_PARAMETER;
- }
-
- /* TODO: Make sure this is right */
+ /* check if the DeviceExtensionSize is provided */
if ( DeviceExtensionSize < PORT_CLASS_DEVICE_EXTENSION_SIZE )
{
+ /* driver does not need a device extension */
if ( DeviceExtensionSize != 0 )
{
- /* TODO: Error */
- DPRINT("DeviceExtensionSize is invalid\n");
+ /* DeviceExtensionSize must be zero*/
return STATUS_INVALID_PARAMETER;
}
- }
-
- DPRINT("portcls is creating a device\n");
+ /* set size to our extension size */
+ DeviceExtensionSize = PORT_CLASS_DEVICE_EXTENSION_SIZE;
+ }
+
+ /* create the device */
status = IoCreateDevice(DriverObject,
DeviceExtensionSize,
NULL,
FILE_DEVICE_KS,
- PhysicalDeviceObject->Characteristics, /* TODO: Check */
+ FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN,
FALSE,
&fdo);
- if ( ! NT_SUCCESS(status) )
+ if (!NT_SUCCESS(status))
{
DPRINT("IoCreateDevice() failed with status 0x%08lx\n", status);
return status;
@@ -161,24 +141,60 @@
/* Obtain the new device extension */
portcls_ext = (PCExtension*) fdo->DeviceExtension;
-
- ASSERT(portcls_ext);
-
- /* Initialize */
- RtlZeroMemory(portcls_ext, sizeof(PCExtension));
+ /* initialize the device extension */
+ RtlZeroMemory(portcls_ext, DeviceExtensionSize);
+ /* allocate create item */
+ portcls_ext->CreateItems = AllocateItem(NonPagedPool, MaxObjects *
sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS);
+
+ /* store the physical device object */
portcls_ext->PhysicalDeviceObject = PhysicalDeviceObject;
+ /* set up the start device function */
portcls_ext->StartDevice = StartDevice;
+ /* prepare the subdevice list */
InitializeListHead(&portcls_ext->SubDeviceList);
+ /* prepare the physical connection list */
InitializeListHead(&portcls_ext->PhysicalConnectionList);
- status = KsAllocateDeviceHeader(&portcls_ext->KsDeviceHeader, 0, NULL);
+ /* set io flags */
+ fdo->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
+ /* clear initializing flag */
+ fdo->Flags &= ~ DO_DEVICE_INITIALIZING;
+
+ /* allocate the device header */
+ status = KsAllocateDeviceHeader(&portcls_ext->KsDeviceHeader, MaxObjects,
portcls_ext->CreateItems);
+ /* did we succeed */
if (!NT_SUCCESS(status))
{
+ /* free previously allocated create items */
+ FreeItem(portcls_ext->CreateItems, TAG_PORTCLASS);
+ /* delete created fdo */
IoDeleteDevice(fdo);
+ /* return error code */
return status;
}
- DPRINT("PcAddAdapterDriver succeeded\n");
+ /* attach device to device stack */
+ PrevDeviceObject = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);
+ /* did we succeed */
+ if (PrevDeviceObject)
+ {
+ /* store the device object in the device header */
+ //KsSetDevicePnpBaseObject(portcls_ext->KsDeviceHeader, PrevDeviceObject,
fdo);
+ portcls_ext->PrevDeviceObject = PrevDeviceObject;
+ }
+ else
+ {
+ /* free the device header */
+ KsFreeDeviceHeader(portcls_ext->KsDeviceHeader);
+ /* free previously allocated create items */
+ FreeItem(portcls_ext->CreateItems, TAG_PORTCLASS);
+ /* delete created fdo */
+ IoDeleteDevice(fdo);
+ /* return error code */
+ return STATUS_UNSUCCESSFUL;
+ }
+
+
return status;
}
@@ -206,7 +222,7 @@
return STATUS_UNSUCCESSFUL;
}
- Entry = ExAllocatePoolWithTag(NonPagedPool, sizeof(SUBDEVICE_ENTRY), TAG_PORTCLASS);
+ Entry = AllocateItem(NonPagedPool, sizeof(SUBDEVICE_ENTRY), TAG_PORTCLASS);
if (!Entry)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -221,7 +237,7 @@
Status = KsAllocateObjectHeader(&Entry->ObjectHeader, 1, NULL, Irp,
&DispatchTable);
if (!NT_SUCCESS(Status))
{
- ExFreePoolWithTag(Entry, TAG_PORTCLASS);
+ FreeItem(Entry, TAG_PORTCLASS);
return Status;
}
@@ -247,9 +263,13 @@
UNICODE_STRING ReferenceString;
UNICODE_STRING SymbolicLinkName;
+ DPRINT1("PcRegisterSubdevice DeviceObject %p Name %S Unknown %p\n",
DeviceObject, Name, Unknown);
if (!DeviceObject || !Name || !Unknown)
+ {
+ DPRINT("PcRegisterSubdevice invalid parameter\n");
return STATUS_INVALID_PARAMETER;
+ }
DeviceExt = (PCExtension*)DeviceObject->DeviceExtension;
if (!DeviceExt)
@@ -258,17 +278,20 @@
Status = Unknown->lpVtbl->QueryInterface(Unknown, &IID_ISubdevice,
(LPVOID)&SubDevice);
if (!NT_SUCCESS(Status))
{
+ DPRINT1("No ISubdevice interface\n");
/* the provided port driver doesnt support ISubdevice */
return STATUS_INVALID_PARAMETER;
}
-
+#if KS_IMPLEMENTED
Status = KsAddObjectCreateItemToDeviceHeader(DeviceExt->KsDeviceHeader,
PciDriverDispatch, (PVOID)SubDevice, Name, NULL);
if (!NT_SUCCESS(Status))
{
/* failed to attach */
SubDevice->lpVtbl->Release(SubDevice);
+ DPRINT1("KsAddObjectCreateItemToDeviceHeader failed with %x\n",
Status);
return Status;
}
+#endif
/* FIXME retrieve guid from subdescriptor */
@@ -284,6 +307,11 @@
RtlFreeUnicodeString(&SymbolicLinkName);
}
-
- return Status;
+ DPRINT1("PcRegisterSubdevice Status %x\n", Status);
+
+ /// HACK
+ /// IoRegisterDeviceInterface fails with
+ /// STATUS_OBJECT_PATH_NOT_FOUND
+ /// return Status;
+ return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/connection.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -59,7 +59,7 @@
goto cleanup;
}
- NewConnection = ExAllocatePoolWithTag(NonPagedPool, sizeof(PHYSICAL_CONNECTION),
TAG_PORTCLASS);
+ NewConnection = AllocateItem(NonPagedPool, sizeof(PHYSICAL_CONNECTION),
TAG_PORTCLASS);
if (!NewConnection)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
@@ -107,6 +107,9 @@
IN PUNKNOWN ToUnknown,
IN ULONG ToPin)
{
+
+ DPRINT1("PcRegisterPhysicalConnection\n");
+
if (!DeviceObject || !FromUnknown || !ToUnknown)
return STATUS_INVALID_PARAMETER;
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/dma_slave.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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
05:19:27 2009
@@ -85,7 +85,7 @@
if (This->ref == 0)
{
This->pAdapter->DmaOperations->PutDmaAdapter(This->pAdapter);
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -487,7 +487,7 @@
IDmaChannelSlaveImpl * This;
- This = ExAllocatePoolWithTag(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
+ This = AllocateItem(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
if (!This)
{
return STATUS_INSUFFICIENT_RESOURCES;
@@ -503,12 +503,11 @@
Adapter = IoGetDmaAdapter(DeviceObject, DeviceDescription, &MapRegisters);
if (!Adapter)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return STATUS_DEVICE_CONFIGURATION_ERROR;
}
- RtlZeroMemory(This, sizeof(IDmaChannelSlaveImpl));
-
+ /* initialize object */
This->ref = 1;
This->lpVtbl = &vt_IDmaChannelSlaveVtbl;
This->pAdapter = Adapter;
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -1,8 +1,7 @@
#include "private.h"
-const GUID IID_IDrmPort;
-const GUID IID_IDrmPort2;
+
typedef struct
{
@@ -33,7 +32,7 @@
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -154,7 +153,7 @@
NewIDrmPort(
OUT PDRMPORT2 *OutPort)
{
- IDrmPort2Impl * This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IDrmPort2Impl),
TAG_PORTCLASS);
+ IDrmPort2Impl * This = AllocateItem(NonPagedPool, sizeof(IDrmPort2Impl),
TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1]
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c [iso-8859-1] Sat
Jan 17 05:19:27 2009
@@ -59,7 +59,7 @@
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
return This->ref;
@@ -260,7 +260,7 @@
{
IPortFilterWaveCyclicImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IPortFilterWaveCyclicImpl),
TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IPortFilterWaveCyclicImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
Added: trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.c (added)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.c [iso-8859-1] Sat Jan 17
05:19:27 2009
@@ -1,0 +1,49 @@
+#include "private.h"
+
+
+
+
+const GUID CLSID_PortTopology = {0xb4c90a32L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID CLSID_PortMidi = {0xb4c90a43L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9,
0x11, 0xb5, 0x44}};
+const GUID CLSID_PortWaveCyclic = {0xb4c90a2aL, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID CLSID_PortWavePci = {0xb4c90a54L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID CLSID_PortDMus;
+const GUID IID_IMiniportDMus;
+
+const GUID IID_IMiniportTopology = {0xb4c90a31L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID IID_IPortTopology = {0xb4c90a30L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+
+const GUID CLSID_MiniportDriverDMusUART;
+const GUID CLSID_MiniportDriverUart;
+const GUID CLSID_MiniportDriverDMusUARTCapture;
+const GUID CLSID_MiniportDriverFmSynth;
+const GUID CLSID_MiniportDriverFmSynthWithVol;
+
+const GUID IID_IDrmPort = {0x286D3DF8L, 0xCA22, 0x4E2E, {0xB9, 0xBC, 0x20, 0xB4, 0xF0,
0xE2, 0x01, 0xCE}};
+const GUID IID_IDrmPort2 = {0x1ACCE59CL, 0x7311, 0x4B6B, {0x9F, 0xBA, 0xCC, 0x3B, 0xA5,
0x9A, 0xCD, 0xCE}};
+const GUID IID_IInterruptSync = {0x22C6AC63L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA,
0x00, 0x38, 0xAC, 0xFE}};
+const GUID IID_IPortWavePci = {0xb4c90a50L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID IID_IMiniportWavePci = {0xb4c90a52L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID IID_IAdapterPowerManagement = {0x793417D0L, 0x35FE, 0x11D1, {0xAD, 0x08, 0x00,
0xA0, 0xC9, 0x0A, 0xB1, 0xB0}};
+
+
+const GUID IID_IMiniportWaveCyclic = {0xb4c90a27L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00,
0xa0, 0xc9, 0x11, 0xb5, 0x44}};
+const GUID IID_IPortWaveCyclic = {0xb4c90a26L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0,
0xc9, 0x11, 0xb5, 0x44}};
+const GUID IID_IResourceList = {0x22C6AC60L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA,
0x00, 0x38, 0xAC, 0xFE}};
+const GUID IID_IServiceGroup = {0x22C6AC65L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA,
0x00, 0x38, 0xAC, 0xFE}};
+const GUID IID_IPinCount = {0x5dadb7dcL, 0xa2cb, 0x4540, {0xa4, 0xa8, 0x42, 0x5e, 0xe4,
0xae, 0x90, 0x51}};
+const GUID IID_IPowerNotify = {0x3DD648B8L, 0x969F, 0x11D1, {0x95, 0xA9, 0x00, 0xC0,
0x4F, 0xB9, 0x25, 0xD3}};
+const GUID IID_IDmaChannelSlave = {0x22C6AC62L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA,
0x00, 0x38, 0xAC, 0xFE}};
+const GUID IID_IDmaChannel = {0x22C6AC61L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00,
0x38, 0xAC, 0xFE}};
+const GUID IID_IRegistryKey = {0xE8DA4302l, 0xF304, 0x11D0, {0x95, 0x8B, 0x00, 0xC0,
0x4F, 0xB9, 0x25, 0xD3}};
+const GUID IID_IServiceSink = {0x22C6AC64L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA,
0x00, 0x38, 0xAC, 0xFE}};
+const GUID IID_IPortClsVersion = {0x7D89A7BBL, 0x869B, 0x4567, {0x8D, 0xBE, 0x1E, 0x16,
0x8C, 0xC8, 0x53, 0xDE}};
+const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x46}};
+
+///
+/// undocumented guids
+
+const GUID IID_ISubdevice = {0xB4C90A61, 0x5791, 0x11D0, {0x86, 0xF9, 0x00, 0xA0, 0xC9,
0x11, 0xB5, 0x44}};
+const GUID IID_IIrpTarget = {0xB4C90A60, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9,
0x11, 0xB5, 0x44}};
+const GUID IID_IIrpTargetFactory = {0xB4C90A62, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44}};
+
Propchange: trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h [iso-8859-1] Sat Jan 17
05:19:27 2009
@@ -1,9 +1,9 @@
#ifndef INTERFACES_H__
#define INTERFACES_H__
-DEFINE_GUID(IID_IIrpTarget, 0xB4C90A60, 0x5791, 0x11D0, 0x86, 0xF9, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
-DEFINE_GUID(IID_ISubdevice, 0xB4C90A61, 0x5791, 0x11D0, 0x86, 0xF9, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
-DEFINE_GUID(IID_IIrpTargetFactory, 0xB4C90A62, 0x5791, 0x11D0, 0x86, 0xF9, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
+DEFINE_GUID(IID_IIrpTarget, 0xB4C90A60, 0x5791, 0x11D0, 0xF9, 0x86, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
+DEFINE_GUID(IID_ISubdevice, 0xB4C90A61, 0x5791, 0x11D0, 0xF9, 0x86, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
+DEFINE_GUID(IID_IIrpTargetFactory, 0xB4C90A62, 0x5791, 0x11D0, 0xF9, 0x86, 0x00, 0xA0,
0xC9, 0x11, 0xB5, 0x44);
/*****************************************************************************
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -28,7 +28,7 @@
// IUnknown methods
//
-const GUID IID_IInterruptSync;
+
NTSTATUS
NTAPI
@@ -39,13 +39,15 @@
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+ DPRINT1("IInterruptSync_fnQueryInterface: This %p\n", This);
+
if (IsEqualGUIDAligned(refiid, &IID_IInterruptSync))
{
*Output = &This->lpVtbl;
_InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
-
+ DPRINT1("IInterruptSync_fnQueryInterface: This %p UNKNOWN interface
requested\n", This);
return STATUS_UNSUCCESSFUL;
}
@@ -56,7 +58,7 @@
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- DPRINT("IInterruptSync_AddRef: This %p\n", This);
+ DPRINT1("IInterruptSync_AddRef: This %p\n", This);
return _InterlockedIncrement(&This->ref);
}
@@ -72,24 +74,20 @@
_InterlockedDecrement(&This->ref);
- DPRINT("IInterruptSync_Release: This %p new ref %u\n", This,
This->ref);
+ DPRINT1("IInterruptSync_Release: This %p new ref %u\n", This,
This->ref);
if (This->ref == 0)
{
- if (This->Interrupt)
- {
- DPRINT1("Interrupt not disconnected! %p\n", This->Interrupt);
- IoDisconnectInterrupt(This->Interrupt);
- }
while(!IsListEmpty(&This->ServiceRoutines))
{
CurEntry = RemoveHeadList(&This->ServiceRoutines);
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
- ExFreePoolWithTag(Entry, TAG_PORTCLASS);
+ FreeItem(Entry, TAG_PORTCLASS);
}
- This->ResourceList->lpVtbl->Release(This->ResourceList);
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ //This->ResourceList->lpVtbl->Release(This->ResourceList);
+ //FreeItem(This, TAG_PORTCLASS);
+DPRINT1("IInterruptSync_Release: complete\n");
return 0;
}
/* Return new reference count */
@@ -107,8 +105,8 @@
IN PVOID ServiceContext)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
-
- return This->SyncRoutine((IInterruptSync*)This, This->DynamicContext);
+ DPRINT1("IInterruptSynchronizedRoutine This %p SyncRoutine%p\n", This,
This->SyncRoutine);
+ return This->SyncRoutine((IInterruptSync*)&This->lpVtbl,
This->DynamicContext);
}
NTSTATUS
@@ -118,12 +116,24 @@
IN PINTERRUPTSYNCROUTINE Routine,
IN PVOID DynamicContext)
{
- IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+ KIRQL OldIrql;
+ IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+
+ DPRINT1("IInterruptSync_fnCallSynchronizedRoutine This %p Routine %p
DynamicContext %p\n", This, Routine, DynamicContext);
if (!This->Interrupt)
{
DPRINT("IInterruptSync_CallSynchronizedRoutine %p no interrupt
connected\n", This);
- return STATUS_UNSUCCESSFUL;
+ if (KeGetCurrentIrql() > DISPATCH_LEVEL)
+ return STATUS_UNSUCCESSFUL;
+
+ KeAcquireSpinLock(&This->Lock, &OldIrql);
+ This->SyncRoutine = Routine;
+ This->DynamicContext = DynamicContext;
+ IInterruptSynchronizedRoutine((PVOID)This);
+ KeReleaseSpinLock(&This->Lock, OldIrql);
+
+ return STATUS_SUCCESS;
}
This->SyncRoutine = Routine;
@@ -138,6 +148,7 @@
IN IInterruptSync * iface)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+ DPRINT1("IInterruptSynchronizedRoutine\n");
return This->Interrupt;
}
@@ -153,6 +164,8 @@
NTSTATUS Status;
BOOL Success;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext;
+
+ DPRINT1("IInterruptServiceRoutine\n");
if (This->Mode == InterruptSyncModeNormal)
{
@@ -216,6 +229,8 @@
NTSTATUS Status;
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
+ DPRINT1("IInterruptSync_fnConnect\n");
+
Descriptor =
This->ResourceList->lpVtbl->FindTranslatedEntry(This->ResourceList,
CmResourceTypeInterrupt, This->ResourceIndex);
if (!Descriptor)
return STATUS_UNSUCCESSFUL;
@@ -244,6 +259,7 @@
IN IInterruptSync * iface)
{
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
+ DPRINT1("IInterruptSync_fnDisconnect\n");
if (!This->Interrupt)
{
@@ -266,7 +282,9 @@
PSYNC_ENTRY NewEntry;
IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface;
- NewEntry = ExAllocatePoolWithTag(NonPagedPool, sizeof(SYNC_ENTRY), TAG_PORTCLASS);
+DPRINT1("IInterruptSync_fnRegisterServiceRoutine\n");
+
+ NewEntry = AllocateItem(NonPagedPool, sizeof(SYNC_ENTRY), TAG_PORTCLASS);
if (!NewEntry)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -308,6 +326,7 @@
{
IInterruptSyncImpl * This;
+ DPRINT1("PcNewInterruptSync entered\n");
if (!OutInterruptSync || !ResourceList || Mode > InterruptSyncModeRepeat || Mode
< 0)
return STATUS_INVALID_PARAMETER;
@@ -315,22 +334,24 @@
if (ResourceIndex >
ResourceList->lpVtbl->NumberOfEntriesOfType(ResourceList, CmResourceTypeInterrupt))
return STATUS_INVALID_PARAMETER;
+
ResourceList->lpVtbl->AddRef(ResourceList);
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IInterruptSyncImpl),
TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IInterruptSyncImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
+ /* initialize object */
This->lpVtbl = &vt_IInterruptSyncVtbl;
This->ref = 1;
This->Mode = Mode;
- This->Interrupt = NULL;
This->ResourceIndex = ResourceIndex;
This->ResourceList = ResourceList;
InitializeListHead(&This->ServiceRoutines);
KeInitializeSpinLock(&This->Lock);
*OutInterruptSync = (PINTERRUPTSYNC)&This->lpVtbl;
- return STATUS_UNSUCCESSFUL;
-}
-
+ DPRINT1("PcNewInterruptSync success %p\n", *OutInterruptSync);
+ return STATUS_SUCCESS;
+}
+
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17 05:19:27
2009
@@ -205,7 +205,7 @@
{
PIO_STACK_LOCATION irp_stack;
- DPRINT("PcDispatchIrp called - handling IRP in PortCls\n");
+ DPRINT1("PcDispatchIrp called - handling IRP in PortCls\n");
irp_stack = IoGetCurrentIrpStackLocation(Irp);
@@ -289,9 +289,12 @@
DPRINT1("PcForwardIrpSynchronous\n");
DeviceExt = (PCExtension*)DeviceObject->DeviceExtension;
-
+return STATUS_SUCCESS;
/* initialize the notification event */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ /* copy the current stack location */
+ IoCopyCurrentIrpStackLocationToNext(Irp);
/* setup a completion routine */
IoSetCompletionRoutine(Irp, IrpCompletionRoutine, (PVOID)&Event, TRUE, FALSE,
FALSE);
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/miniport.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -12,11 +12,7 @@
#include "private.h"
-const GUID CLSID_MiniportDriverDMusUART;
-const GUID CLSID_MiniportDriverUart;
-const GUID CLSID_MiniportDriverDMusUARTCapture;
-const GUID CLSID_MiniportDriverFmSynth;
-const GUID CLSID_MiniportDriverFmSynthWithVol;
+
/*
* @implemented
@@ -27,6 +23,8 @@
IN REFCLSID ClassId)
{
NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ DPRINT1("PcNewMiniport entered\n");
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/…
==============================================================================
--- 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] Sat Jan
17 05:19:27 2009
@@ -8,7 +8,7 @@
}IMiniportDMusImpl;
-const GUID IID_IMiniportDMus;
+
/* IUnknown methods */
@@ -51,7 +51,7 @@
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -148,7 +148,7 @@
{
IMiniportDMusImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IMiniportDMusImpl),
TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IMiniportDMusImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
Added: trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c (added)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c [iso-8859-1] Sat Jan 17
05:19:27 2009
@@ -1,0 +1,26 @@
+#include "private.h"
+
+
+
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag)
+{
+ PVOID Item = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
+ if (!Item)
+ return Item;
+
+ RtlZeroMemory(Item, NumberOfBytes);
+ return Item;
+}
+
+VOID
+FreeItem(
+ IN PVOID Item,
+ IN ULONG Tag)
+{
+
+ //ExFreePoolWithTag(Item, Tag);
+}
Propchange: trunk/reactos/drivers/wdm/audio/backpln/portcls/pool.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -1,13 +1,31 @@
#include "private.h"
+NTSTATUS StringFromCLSID(
+ const CLSID *id, /* [in] GUID to be converted */
+ LPWSTR idstr /* [out] pointer to buffer to contain converted guid */
+) {
+ static const char hex[] = "0123456789ABCDEF";
+ WCHAR *s;
+ int i;
-const GUID CLSID_PortTopology;
-const GUID CLSID_PortMidi;
-const GUID CLSID_PortWaveCyclic;
-const GUID CLSID_PortWavePci;
-const GUID CLSID_PortDMus;
+ swprintf(idstr, L"{%08X-%04X-%04X-%02X%02X-",
+ id->Data1, id->Data2, id->Data3,
+ id->Data4[0], id->Data4[1]);
+ s = &idstr[25];
-PORTCLASSAPI
+ /* 6 hex bytes */
+ for (i = 2; i < 8; i++) {
+ *s++ = hex[id->Data4[i]>>4];
+ *s++ = hex[id->Data4[i] & 0xf];
+ }
+
+ *s++ = '}';
+ *s++ = '\0';
+
+ return STATUS_SUCCESS;
+}
+
+
NTSTATUS
NTAPI
PcNewPort(
@@ -15,6 +33,9 @@
IN REFCLSID ClassId)
{
NTSTATUS Status;
+ WCHAR Buffer[100];
+
+ DPRINT1("PcNewPort entered\n");
if (!OutPort)
{
@@ -33,8 +54,14 @@
else if (IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci))
Status = NewPortWavePci(OutPort);
else
+ {
+
+ StringFromCLSID(ClassId, Buffer);
+ DPRINT1("unknown interface %S\n", Buffer);
+
Status = STATUS_NOT_SUPPORTED;
-
+ return Status;
+ }
DPRINT("PcNewPort Status %lx\n", Status);
return Status;
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_dmus.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -66,7 +66,7 @@
{
This->pMiniport->lpVtbl->Release(This->pMiniport);
}
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan
17 05:19:27 2009
@@ -3,18 +3,20 @@
typedef struct
{
IPortTopologyVtbl *lpVtbl;
+ ISubdeviceVtbl *lpVtblSubDevice;
LONG ref;
BOOL bInitialized;
- PMINIPORTTOPOLOGY Miniport;
+ PMINIPORTTOPOLOGY pMiniport;
PDEVICE_OBJECT pDeviceObject;
PRESOURCELIST pResourceList;
+ PPINCOUNT pPinCount;
+ PPOWERNOTIFY pPowerNotify;
}IPortTopologyImpl;
-const GUID IID_IMiniportTopology;
-const GUID IID_IPortTopology;
+
#if 0
static
KSPROPERTY_SET PinPropertySet =
@@ -49,19 +51,32 @@
IN REFIID refiid,
OUT PVOID* Output)
{
- IPortTopologyImpl * This = (IPortTopologyImpl*)iface;
+ WCHAR Buffer[100];
+ IPortTopologyImpl * This = (IPortTopologyImpl*)iface;
+
+ DPRINT1("IPortTopology_fnQueryInterface\n");
if (IsEqualGUIDAligned(refiid, &IID_IPortTopology) ||
IsEqualGUIDAligned(refiid, &IID_IUnknown))
{
*Output = &This->lpVtbl;
- _InterlockedIncrement(&This->ref);
+ InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
+ else if (IsEqualGUIDAligned(refiid, &IID_ISubdevice))
+ {
+ *Output = &This->lpVtblSubDevice;
+ InterlockedIncrement(&This->ref);
+ return STATUS_SUCCESS;
+ }
else if (IsEqualGUIDAligned(refiid, &IID_IPortClsVersion))
{
return NewPortClsVersion((PPORTCLSVERSION*)Output);
}
+ StringFromCLSID(refiid, Buffer);
+ DPRINT1("IPortTopology_fnQueryInterface no iface %S\n", Buffer);
+ StringFromCLSID(&IID_IUnknown, Buffer);
+ DPRINT1("IPortTopology_fnQueryInterface IUnknown %S\n", Buffer);
return STATUS_UNSUCCESSFUL;
}
@@ -87,7 +102,7 @@
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -112,7 +127,7 @@
if (!This->bInitialized)
{
- DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initiazed\n");
+ DPRINT("IPortTopology_fnNewRegistryKey called w/o initiazed\n");
return STATUS_UNSUCCESSFUL;
}
@@ -133,37 +148,43 @@
NTSTATUS Status;
IPortTopologyImpl * This = (IPortTopologyImpl*)iface;
+ DPRINT1("IPortTopology_fnInit entered\n");
+
if (This->bInitialized)
{
- DPRINT("IPortWaveCyclic_Init called again\n");
+ DPRINT1("IPortTopology_Init called again\n");
return STATUS_SUCCESS;
}
Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport,
&IID_IMiniportTopology, (PVOID*)&Miniport);
if (!NT_SUCCESS(Status))
{
- DPRINT("IPortWaveCyclic_Init called with invalid IMiniport
adapter\n");
+ DPRINT1("IPortTopology_Init called with invalid IMiniport adapter\n");
return STATUS_INVALID_PARAMETER;
}
+
+ /* increment reference on resource list */
+ //HACK
+ //ResourceList->lpVtbl->AddRef(ResourceList);
Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList,
iface);
if (!NT_SUCCESS(Status))
{
- DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
+ DPRINT1("IPortTopology_Init failed with %x\n", Status);
return Status;
}
/* Initialize port object */
- This->Miniport = Miniport;
+ This->pMiniport = Miniport;
This->pDeviceObject = DeviceObject;
This->bInitialized = TRUE;
This->pResourceList = ResourceList;
/* increment reference on miniport adapter */
Miniport->lpVtbl->AddRef(Miniport);
- /* increment reference on resource list */
- ResourceList->lpVtbl->AddRef(ResourceList);
-
+
+
+ DPRINT1("IPortTopology_fnInit success\n");
return STATUS_SUCCESS;
}
@@ -184,7 +205,7 @@
if (!This->bInitialized)
{
- DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initialized\n");
+ DPRINT("IPortTopology_fnNewRegistryKey called w/o initialized\n");
return STATUS_UNSUCCESSFUL;
}
return PcNewRegistryKey(OutRegistryKey,
@@ -210,20 +231,185 @@
IPortTopology_fnNewRegistryKey
};
+//---------------------------------------------------------------
+// ISubdevice interface
+//
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnQueryInterface(
+ IN ISubdevice *iface,
+ IN REFIID InterfaceId,
+ IN PVOID* Interface)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ return IPortTopology_fnQueryInterface((IPortTopology*)This, InterfaceId, Interface);
+}
+
+static
+ULONG
+NTAPI
+ISubDevice_fnAddRef(
+ IN ISubdevice *iface)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ return IPortTopology_fnAddRef((IPortTopology*)This);
+}
+
+static
+ULONG
+NTAPI
+ISubDevice_fnRelease(
+ IN ISubdevice *iface)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ return IPortTopology_fnRelease((IPortTopology*)This);
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnNewIrpTarget(
+ IN ISubdevice *iface,
+ OUT struct IIrpTarget **OutTarget,
+ IN WCHAR * Name,
+ IN PUNKNOWN Unknown,
+ IN POOL_TYPE PoolType,
+ IN PDEVICE_OBJECT * DeviceObject,
+ IN PIRP Irp,
+ IN KSOBJECT_CREATE *CreateObject)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ DPRINT1("ISubDevice_NewIrpTarget this %p\n", This);
+ return STATUS_UNSUCCESSFUL;
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnReleaseChildren(
+ IN ISubdevice *iface)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ DPRINT1("ISubDevice_ReleaseChildren this %p\n", This);
+ return STATUS_UNSUCCESSFUL;
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnGetDescriptor(
+ IN ISubdevice *iface,
+ IN struct SUBDEVICE_DESCRIPTOR ** Descriptor)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ DPRINT1("ISubDevice_GetDescriptor this %p\n", This);
+ return STATUS_UNSUCCESSFUL;
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnDataRangeIntersection(
+ IN ISubdevice *iface,
+ IN ULONG PinId,
+ IN PKSDATARANGE DataRange,
+ IN PKSDATARANGE MatchingDataRange,
+ IN ULONG OutputBufferLength,
+ OUT PVOID ResultantFormat OPTIONAL,
+ OUT PULONG ResultantFormatLength)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ DPRINT("ISubDevice_DataRangeIntersection this %p\n", This);
+
+ if (This->pMiniport)
+ {
+ return This->pMiniport->lpVtbl->DataRangeIntersection
(This->pMiniport, PinId, DataRange, MatchingDataRange, OutputBufferLength,
ResultantFormat, ResultantFormatLength);
+ }
+
+ return STATUS_UNSUCCESSFUL;
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnPowerChangeNotify(
+ IN ISubdevice *iface,
+ IN POWER_STATE PowerState)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ if (This->pPowerNotify)
+ {
+ This->pPowerNotify->lpVtbl->PowerChangeNotify(This->pPowerNotify,
PowerState);
+ }
+
+ return STATUS_SUCCESS;
+}
+
+static
+NTSTATUS
+NTAPI
+ISubDevice_fnPinCount(
+ IN ISubdevice *iface,
+ IN ULONG PinId,
+ IN OUT PULONG FilterNecessary,
+ IN OUT PULONG FilterCurrent,
+ IN OUT PULONG FilterPossible,
+ IN OUT PULONG GlobalCurrent,
+ IN OUT PULONG GlobalPossible)
+{
+ IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface,
IPortTopologyImpl, lpVtblSubDevice);
+
+ if (This->pPinCount)
+ {
+ This->pPinCount->lpVtbl->PinCount(This->pPinCount, PinId,
FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible);
+ return STATUS_SUCCESS;
+ }
+
+ /* FIXME
+ * scan filter descriptor
+ */
+ return STATUS_UNSUCCESSFUL;
+}
+
+static ISubdeviceVtbl vt_ISubdeviceVtbl =
+{
+ ISubDevice_fnQueryInterface,
+ ISubDevice_fnAddRef,
+ ISubDevice_fnRelease,
+ ISubDevice_fnNewIrpTarget,
+ ISubDevice_fnReleaseChildren,
+ ISubDevice_fnGetDescriptor,
+ ISubDevice_fnDataRangeIntersection,
+ ISubDevice_fnPowerChangeNotify,
+ ISubDevice_fnPinCount
+};
+
+
NTSTATUS
NewPortTopology(
OUT PPORT* OutPort)
{
IPortTopologyImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IPortTopologyImpl),
TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IPortTopologyImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
- RtlZeroMemory(This, sizeof(IPortTopologyImpl));
This->lpVtbl = &vt_IPortTopology;
+ This->lpVtblSubDevice = &vt_ISubdeviceVtbl;
This->ref = 1;
*OutPort = (PPORT)(&This->lpVtbl);
+ DPRINT1("NewPortTopology result %p\n", *OutPort);
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/…
==============================================================================
--- 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 05:19:27 2009
@@ -20,13 +20,6 @@
}IPortWaveCyclicImpl;
-const GUID IID_IMiniportWaveCyclic;
-const GUID IID_IPortWaveCyclic;
-const GUID IID_IUnknown;
-const GUID IID_IIrpTarget;
-const GUID IID_IPinCount;
-const GUID IID_IPowerNotify;
-const GUID IID_IDmaChannelSlave;
const GUID GUID_DEVCLASS_SOUND; //FIXME
//---------------------------------------------------------------
@@ -98,7 +91,7 @@
if (This->pPowerNotify)
This->pPowerNotify->lpVtbl->Release(This->pPowerNotify);
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -509,16 +502,17 @@
{
IPortWaveCyclicImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IPortWaveCyclicImpl),
TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IPortWaveCyclicImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
- RtlZeroMemory(This, sizeof(IPortWaveCyclicImpl));
This->lpVtbl = (IPortWaveCyclicVtbl*)&vt_IPortWaveCyclicVtbl;
This->lpVtblSubDevice = (ISubdeviceVtbl*)&vt_ISubdeviceVtbl;
This->ref = 1;
*OutPort = (PPORT)(&This->lpVtbl);
+ DPRINT1("NewPortWaveCyclic %p\n", *OutPort);
+
return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -19,8 +19,7 @@
}IPortWavePciImpl;
-const GUID IID_IPortWavePci;
-const GUID IID_IMiniportWavePci;
+
//---------------------------------------------------------------
// IServiceSink
@@ -36,7 +35,10 @@
{
IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface,
IPortWavePciImpl, lpVtblServiceSink);
- if (IsEqualGUIDAligned(refiid, &IID_IServiceSink))
+ DPRINT1("IServiceSink_fnQueryInterface entered\n");
+
+ if (IsEqualGUIDAligned(refiid, &IID_IServiceSink) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
{
*Output = &This->lpVtblServiceSink;
InterlockedIncrement(&This->ref);
@@ -52,7 +54,7 @@
IServiceSink* iface)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface,
IPortWavePciImpl, lpVtblServiceSink);
-
+ DPRINT1("IServiceSink_fnAddRef entered\n");
return InterlockedIncrement(&This->ref);
}
@@ -63,12 +65,12 @@
IServiceSink* iface)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface,
IPortWavePciImpl, lpVtblServiceSink);
-
+ DPRINT1("IServiceSink_fnRelease entered\n");
InterlockedDecrement(&This->ref);
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -82,7 +84,7 @@
IServiceSink* iface)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface,
IPortWavePciImpl, lpVtblServiceSink);
-
+ DPRINT1("IServiceSink_fnRequestService entered\n");
if (This->Miniport)
{
This->Miniport->lpVtbl->Service(This->Miniport);
@@ -111,7 +113,10 @@
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
- if (IsEqualGUIDAligned(refiid, &IID_IPortWavePci))
+ DPRINT1("IPortWavePci_fnQueryInterface entered\n");
+
+ if (IsEqualGUIDAligned(refiid, &IID_IPortWavePci) ||
+ IsEqualGUIDAligned(refiid, &IID_IUnknown))
{
*Output = &This->lpVtbl;
InterlockedIncrement(&This->ref);
@@ -127,6 +132,9 @@
{
return NewPortClsVersion((PPORTCLSVERSION*)Output);
}
+
+ DPRINT1("IPortWavePci_fnQueryInterface no interface!!!\n");
+
return STATUS_UNSUCCESSFUL;
}
@@ -137,6 +145,9 @@
IPortWavePci* iface)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+ DPRINT1("IPortWavePci_fnAddRef entered\n");
+
return InterlockedIncrement(&This->ref);
}
@@ -148,11 +159,13 @@
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+ DPRINT1("IPortWavePci_fnRelease entered\n");
+
InterlockedDecrement(&This->ref);
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -167,8 +180,10 @@
IN PVOID SystemArgument1,
IN PVOID SystemArgument2)
{
+ DPRINT1("ServiceNotifyRoutine entered\n");
+
IPortWavePciImpl * This = (IPortWavePciImpl*)DeferredContext;
- if (This->ServiceGroup)
+ if (This->ServiceGroup && This->bInitialized)
{
This->ServiceGroup->lpVtbl->RequestService(This->ServiceGroup);
}
@@ -191,6 +206,9 @@
NTSTATUS Status;
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+ DPRINT1("IPortWavePci::Init entered with This %p, DeviceObject %p Irp %p
UnknownMiniport %p, UnknownAdapter %p ResourceList %p\n",
+ This, DeviceObject, Irp, UnknownMiniport, UnknownAdapter, ResourceList);
+
if (This->bInitialized)
{
DPRINT("IPortWaveCyclic_Init called again\n");
@@ -204,13 +222,17 @@
return STATUS_INVALID_PARAMETER;
}
+ /* initialize the dpc */
+ KeInitializeDpc(&This->Dpc, ServiceNotifyRoutine, (PVOID)This);
+
+
Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface,
&ServiceGroup);
if (!NT_SUCCESS(Status))
{
DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
return Status;
}
-
+ DPRINT1("IPortWaveCyclic_Init Miniport adapter initialized\n");
/* Initialize port object */
This->Miniport = Miniport;
This->pDeviceObject = DeviceObject;
@@ -218,8 +240,6 @@
This->pResourceList = ResourceList;
This->ServiceGroup = ServiceGroup;
- /* initialize the dpc */
- KeInitializeDpc(&This->Dpc, ServiceNotifyRoutine, (PVOID)This);
/* increment reference on miniport adapter */
Miniport->lpVtbl->AddRef(Miniport);
@@ -232,6 +252,7 @@
/* increment reference on service group */
ServiceGroup->lpVtbl->AddRef(ServiceGroup);
+ DPRINT("IPortWaveCyclic_Init sucessfully initialized\n");
return STATUS_SUCCESS;
}
@@ -248,6 +269,8 @@
OUT PULONG Disposition OPTIONAL)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+ DPRINT1("IPortWavePci_fnNewRegistryKey entered\n");
if (!This->bInitialized)
{
@@ -276,6 +299,8 @@
OUT PULONG ReturnLength)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+ DPRINT1("IPortWavePci_fnGetDeviceProperty entered\n");
if (!This->bInitialized)
{
@@ -307,6 +332,8 @@
DEVICE_DESCRIPTION DeviceDescription;
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+ DPRINT1("IPortWavePci_fnNewMasterDmaChannel entered\n");
+
Status = PcDmaMasterDescription(ResourceList, ScatterGather, Dma32BitAddresses,
IgnoreCount, Dma64BitAddresses, DmaWidth, DmaSpeed, MaximumLength, DmaPort,
&DeviceDescription);
if (NT_SUCCESS(Status))
{
@@ -323,6 +350,10 @@
IN PSERVICEGROUP ServiceGroup)
{
IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
+
+
+ DPRINT1("IPortWavePci_fnNotify entered\n");
+
KeInsertQueueDpc(&This->Dpc, NULL, NULL);
}
@@ -348,15 +379,15 @@
{
IPortWavePciImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IPortWavePciImpl), TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IPortWavePciImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
- RtlZeroMemory(This, sizeof(IPortWavePciImpl));
This->lpVtblServiceSink = &vt_IServiceSink;
This->lpVtbl = &vt_IPortWavePci;
This->ref = 1;
*OutPort = (PPORT)&This->lpVtbl;
+ DPRINT1("NewPortWavePci %p\n", *OutPort);
return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1]
(original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild [iso-8859-1] Sat Jan 17
05:19:27 2009
@@ -17,6 +17,7 @@
<file>drm_port.c</file>
<file>adapter.c</file>
<file>filter_wavecyclic.c</file>
+ <file>guids.c</file>
<file>irp.c</file>
<file>interrupt.c</file>
<file>drm.c</file>
@@ -24,7 +25,8 @@
<file>undoc.c</file>
<file>resource.c</file>
<file>registry.c</file>
- <file>service_group.c</file>
+ <file>service_group.c</file>
+ <file>pool.c</file>
<file>port.c</file>
<file>power.c</file>
<file>port_dmus.c</file>
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/power.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -1,6 +1,6 @@
#include "private.h"
-const GUID IID_IAdapterPowerManagement;
+
/*
* @implemented
@@ -17,23 +17,25 @@
PCExtension* DeviceExt;
IAdapterPowerManagement * pPower;
+ DPRINT1("PcRegisterAdapterPowerManagement pUnknown %p pvContext %p\n",
pUnknown, pvContext);
+
if (!pUnknown || !pvContext)
return STATUS_INVALID_PARAMETER;
- Status = pUnknown->lpVtbl->QueryInterface(pUnknown,
&IID_IAdapterPowerManagement, (PVOID*)&pPower);
- if (!NT_SUCCESS(Status))
- return Status;
pDeviceObject = (PDEVICE_OBJECT)pvContext;
DeviceExt = (PCExtension*)pDeviceObject->DeviceExtension;
- if (DeviceExt->AdapterPowerManagement)
+ Status = pUnknown->lpVtbl->QueryInterface(pUnknown,
&IID_IAdapterPowerManagement, (PVOID*)&pPower);
+ if (!NT_SUCCESS(Status))
{
- pPower->lpVtbl->Release(pPower);
- return STATUS_UNSUCCESSFUL;
+ DPRINT1("PcRegisterAdapterPowerManagement no IAdapterPowerManagement
interface %x\n", Status);
+ DeviceExt->AdapterPowerManagement = NULL;
+ return STATUS_SUCCESS;
}
DeviceExt->AdapterPowerManagement = pPower;
+ DPRINT1("PcRegisterAdapterPowerManagement success %x\n", Status);
return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/private.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -17,6 +17,7 @@
#include "interfaces.h"
#include <ks.h>
+#include <stdio.h>
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) +
((D)<<24))
#define TAG_PORTCLASS TAG('P', 'C', 'L', 'S')
@@ -81,6 +82,18 @@
NTSTATUS NewPortFilterWaveCyclic(
OUT IPortFilterWaveCyclic ** OutFilter);
+
+PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag);
+
+VOID
+FreeItem(
+ IN PVOID Item,
+ IN ULONG Tag);
+
+NTSTATUS StringFromCLSID(
+ const CLSID *id,
+ LPWSTR idstr);
+
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/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -9,13 +9,8 @@
}IRegistryKeyImpl;
-const GUID IID_IRegistryKey;
-
-/*
- Basic IUnknown methods
-*/
-
-static IRegistryKeyVtbl vt_IRegistryKeyVtbl;
+
+static IRegistryKeyVtbl vt_IRegistryKey;
ULONG
@@ -38,14 +33,14 @@
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
_InterlockedDecrement(&This->ref);
-
+ DPRINT1("IRegistryKey_fnRelease ref %u this %p entered\n", This->ref,
This);
if (This->ref == 0)
{
if (This->hKey)
{
ZwClose(This->hKey);
}
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -60,7 +55,7 @@
OUT PVOID* Output)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
-
+ DPRINT1("IRegistryKey_fnQueryInterface entered\n");
if (IsEqualGUIDAligned(refiid, &IID_IRegistryKey))
{
*Output = (PVOID)&This->lpVtbl;
@@ -78,6 +73,7 @@
IN IRegistryKey* iface)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnDeleteKey entered\n");
return ZwDeleteKey(This->hKey);
}
@@ -92,6 +88,7 @@
OUT PULONG ResultLength)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnEnumerateKey entered\n");
return ZwEnumerateKey(This->hKey, Index, KeyInformationClass, KeyInformation,
Length, ResultLength);
}
@@ -106,6 +103,7 @@
OUT PULONG ResultLength)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnEnumerateKeyValue entered\n");
return ZwEnumerateValueKey(This->hKey, Index, KeyValueInformationClass,
KeyValueInformation, Length, ResultLength);
}
@@ -125,13 +123,15 @@
HANDLE hKey;
IRegistryKeyImpl * NewThis, *This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnNewSubKey entered\n");
+
InitializeObjectAttributes(&Attributes, SubKeyName, 0, This->hKey, NULL);
Status = ZwCreateKey(&hKey, KEY_READ | KEY_WRITE, &Attributes, 0, NULL, 0,
Disposition);
if (!NT_SUCCESS(Status))
return Status;
- NewThis = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRegistryKeyImpl),
TAG_PORTCLASS);
+ NewThis = AllocateItem(NonPagedPool, sizeof(IRegistryKeyImpl), TAG_PORTCLASS);
if (!NewThis)
{
ZwClose(hKey);
@@ -140,8 +140,11 @@
NewThis->hKey = hKey;
NewThis->ref = 1;
- NewThis->lpVtbl = &vt_IRegistryKeyVtbl;
- *RegistrySubKey = (PREGISTRYKEY)&This->lpVtbl;
+ NewThis->lpVtbl = &vt_IRegistryKey;
+ *RegistrySubKey = (PREGISTRYKEY)&NewThis->lpVtbl;
+
+ DPRINT1("IRegistryKey_fnNewSubKey RESULT %p\n", *RegistrySubKey );
+
return STATUS_SUCCESS;
}
@@ -155,6 +158,7 @@
OUT PULONG ResultLength)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnQueryKey entered\n");
return ZwQueryKey(This->hKey, KeyInformationClass, KeyInformation, Length,
ResultLength);
}
@@ -166,7 +170,7 @@
IN PVOID Context OPTIONAL)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
- DPRINT("IRegistryKey_QueryRegistryValues: This %p\n", This);
+ DPRINT1("IRegistryKey_QueryRegistryValues: This %p\n", This);
return STATUS_UNSUCCESSFUL;
}
@@ -181,6 +185,7 @@
OUT PULONG ResultLength)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnQueryValueKey entered %p value %wZ\n", This,
ValueName);
return ZwQueryValueKey(This->hKey, ValueName, KeyValueInformationClass,
KeyValueInformation, Length, ResultLength);
}
@@ -195,6 +200,7 @@
)
{
IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface;
+ DPRINT1("IRegistryKey_fnSetValueKey entered\n");
return ZwSetValueKey(This->hKey, ValueName, 0, Type, Data, DataSize);
}
@@ -233,6 +239,9 @@
HANDLE hHandle;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IRegistryKeyImpl * This;
+ PCExtension* portcls_ext;
+
+ DPRINT1("PcNewRegistryKey entered\n");
if (!OutRegistryKey)
return STATUS_INVALID_PARAMETER;
@@ -246,28 +255,38 @@
return STATUS_INVALID_PARAMETER;
}
+ /* check for the key type */
if (RegistryKeyType == GeneralRegistryKey)
{
+ /* do we have the required object attributes */
if (!ObjectAttributes)
+ {
+ /* object attributes is mandatory */
return STATUS_INVALID_PARAMETER;
-
+ }
+ /* try to open the key */
Status = ZwOpenKey(&hHandle, DesiredAccess, ObjectAttributes);
}
else if (RegistryKeyType == DeviceRegistryKey ||
RegistryKeyType == DriverRegistryKey ||
RegistryKeyType == HwProfileRegistryKey)
{
+ /* check for HwProfileRegistryKey case */
if (RegistryKeyType == HwProfileRegistryKey)
{
/* IoOpenDeviceRegistryKey used different constant */
RegistryKeyType = PLUGPLAY_REGKEY_CURRENT_HWPROFILE;
}
- Status = IoOpenDeviceRegistryKey(DeviceObject, RegistryKeyType, DesiredAccess,
&hHandle);
+ /* obtain the new device extension */
+ portcls_ext = (PCExtension*) ((PDEVICE_OBJECT)DeviceObject)->DeviceExtension;
+
+ Status = IoOpenDeviceRegistryKey(portcls_ext->PhysicalDeviceObject,
RegistryKeyType, DesiredAccess, &hHandle);
}
else if (RegistryKeyType == DeviceInterfaceRegistryKey)
{
/* FIXME */
+ DPRINT1("fixme\n");
}
if (!NT_SUCCESS(Status))
@@ -275,7 +294,7 @@
return Status;
}
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRegistryKeyImpl), TAG_PORTCLASS);
+ This = AllocateItem(NonPagedPool, sizeof(IRegistryKeyImpl), TAG_PORTCLASS);
if (!This)
{
ZwClose(hHandle);
@@ -287,6 +306,7 @@
This->ref = 1;
*OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl;
+ DPRINT1("PcNewRegistryKey result %p\n", *OutRegistryKey);
return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/resource.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan 17
05:19:27 2009
@@ -24,7 +24,7 @@
PCM_RESOURCE_LIST UntranslatedResourceList;
} IResourceListImpl;
-const GUID IID_IResourceList;
+
/*
Basic IUnknown methods
@@ -41,7 +41,7 @@
if (IsEqualGUIDAligned(refiid, &IID_IResourceList))
{
*Output = &This->lpVtbl;
- _InterlockedIncrement(&This->ref);
+ InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
return STATUS_UNSUCCESSFUL;
@@ -54,7 +54,7 @@
{
IResourceListImpl * This = (IResourceListImpl*)iface;
- return _InterlockedIncrement(&This->ref);
+ return InterlockedIncrement(&This->ref);
}
ULONG
@@ -64,13 +64,15 @@
{
IResourceListImpl * This = (IResourceListImpl*)iface;
- _InterlockedDecrement(&This->ref);
+ InterlockedDecrement(&This->ref);
+
+ DPRINT("IResourceList_fnRelease %p ref %x\n", This, This->ref);
if (This->ref == 0)
{
- ExFreePool(This->TranslatedResourceList);
- ExFreePool(This->UntranslatedResourceList);
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This->TranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(This->UntranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -187,15 +189,15 @@
IResourceListImpl * This = (IResourceListImpl*)iface;
NewTranslatedSize = sizeof(CM_RESOURCE_LIST) +
This->TranslatedResourceList[0].List->PartialResourceList.Count *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- NewTranslatedResources = ExAllocatePoolWithTag(This->PoolType, NewTranslatedSize,
TAG_PORTCLASS);
+ NewTranslatedResources = AllocateItem(This->PoolType, NewTranslatedSize,
TAG_PORTCLASS);
if (!NewTranslatedResources)
return STATUS_INSUFFICIENT_RESOURCES;
NewUntranslatedSize = sizeof(CM_RESOURCE_LIST) +
This->UntranslatedResourceList[0].List->PartialResourceList.Count *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- NewUntranslatedResources = ExAllocatePoolWithTag(This->PoolType,
NewUntranslatedSize, TAG_PORTCLASS);
+ NewUntranslatedResources = AllocateItem(This->PoolType, NewUntranslatedSize,
TAG_PORTCLASS);
if (!NewUntranslatedResources)
{
- ExFreePoolWithTag(NewTranslatedResources, TAG_PORTCLASS);
+ FreeItem(NewTranslatedResources, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -205,8 +207,8 @@
RtlCopyMemory(NewUntranslatedResources, This->UntranslatedResourceList,
sizeof(CM_RESOURCE_LIST) +
(This->UntranslatedResourceList[0].List->PartialResourceList.Count-1) *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
RtlCopyMemory(&NewUntranslatedResources->List[0].PartialResourceList.PartialDescriptors[This->UntranslatedResourceList[0].List->PartialResourceList.Count],
Untranslated, sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
- ExFreePoolWithTag(This->TranslatedResourceList, TAG_PORTCLASS);
- ExFreePoolWithTag(This->UntranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(This->TranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(This->UntranslatedResourceList, TAG_PORTCLASS);
This->UntranslatedResourceList = NewUntranslatedResources;
This->TranslatedResourceList = NewTranslatedResources;
@@ -235,14 +237,14 @@
return STATUS_INVALID_PARAMETER;
NewTranslatedSize = sizeof(CM_RESOURCE_LIST) +
This->TranslatedResourceList[0].List->PartialResourceList.Count *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- NewTranslatedResources = ExAllocatePoolWithTag(This->PoolType, NewTranslatedSize,
TAG_PORTCLASS);
+ NewTranslatedResources = AllocateItem(This->PoolType, NewTranslatedSize,
TAG_PORTCLASS);
if (!NewTranslatedResources)
return STATUS_INSUFFICIENT_RESOURCES;
RtlCopyMemory(NewTranslatedResources, This->TranslatedResourceList,
sizeof(CM_RESOURCE_LIST) +
(This->TranslatedResourceList[0].List->PartialResourceList.Count-1) *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
RtlCopyMemory(&NewTranslatedResources->List[0].PartialResourceList.PartialDescriptors[This->TranslatedResourceList[0].List->PartialResourceList.Count],
Translated, sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
- ExFreePoolWithTag(This->TranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(This->TranslatedResourceList, TAG_PORTCLASS);
This->TranslatedResourceList = NewTranslatedResources;
NewTranslatedResources->List[0].PartialResourceList.Count++;
@@ -308,32 +310,32 @@
/* TODO: Validate parameters */
- DPRINT("PcNewResourceList\n");
-
- NewList = ExAllocatePoolWithTag(PoolType, sizeof(IResourceListImpl), TAG_PORTCLASS);
+ DPRINT1("PcNewResourceList\n");
+
+ NewList = AllocateItem(PoolType, sizeof(IResourceListImpl), TAG_PORTCLASS);
if (!NewList)
{
- DPRINT("ExAllocatePoolWithTag failed\n");
+ DPRINT("AllocateItem failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Initialize */
NewTranslatedSize = sizeof(CM_RESOURCE_LIST) +
(TranslatedResourceList[0].List->PartialResourceList.Count-1) *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- NewTranslatedResources = ExAllocatePoolWithTag(PoolType, NewTranslatedSize,
TAG_PORTCLASS);
+ NewTranslatedResources = AllocateItem(PoolType, NewTranslatedSize, TAG_PORTCLASS);
if (!NewTranslatedResources)
{
- ExFreePoolWithTag(NewList, TAG_PORTCLASS);
+ FreeItem(NewList, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
NewUntranslatedSize = sizeof(CM_RESOURCE_LIST) +
(UntranslatedResourceList[0].List->PartialResourceList.Count-1) *
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
- NewUntranslatedResources = ExAllocatePoolWithTag(PoolType, NewUntranslatedSize,
TAG_PORTCLASS);
+ NewUntranslatedResources = AllocateItem(PoolType, NewUntranslatedSize,
TAG_PORTCLASS);
if (!NewUntranslatedResources)
{
- ExFreePoolWithTag(NewList, TAG_PORTCLASS);
- ExFreePoolWithTag(NewTranslatedResources, TAG_PORTCLASS);
+ FreeItem(NewList, TAG_PORTCLASS);
+ FreeItem(NewTranslatedResources, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -363,11 +365,12 @@
{
IResourceListImpl* NewList, *Parent;
- if (!OuterUnknown || !ParentList || !MaximumEntries)
+ if (!OutResourceList || !ParentList || !MaximumEntries)
return STATUS_INVALID_PARAMETER;
Parent = (IResourceListImpl*)ParentList;
+ DPRINT1("PcNewResourceSublist entered\n");
if (!Parent->TranslatedResourceList->List->PartialResourceList.Count ||
!Parent->UntranslatedResourceList->List->PartialResourceList.Count)
@@ -376,22 +379,22 @@
return STATUS_INVALID_PARAMETER;
}
- NewList = ExAllocatePoolWithTag(PoolType, sizeof(IResourceListImpl), TAG_PORTCLASS);
+ NewList = AllocateItem(PoolType, sizeof(IResourceListImpl), TAG_PORTCLASS);
if (!NewList)
return STATUS_INSUFFICIENT_RESOURCES;
- NewList->TranslatedResourceList = ExAllocatePoolWithTag(PoolType,
sizeof(CM_RESOURCE_LIST), TAG_PORTCLASS);
+ NewList->TranslatedResourceList = AllocateItem(PoolType, sizeof(CM_RESOURCE_LIST),
TAG_PORTCLASS);
if (!NewList->TranslatedResourceList)
{
- ExFreePoolWithTag(NewList, TAG_PORTCLASS);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NewList->UntranslatedResourceList = ExAllocatePoolWithTag(PoolType,
sizeof(CM_RESOURCE_LIST), TAG_PORTCLASS);
+ FreeItem(NewList, TAG_PORTCLASS);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ NewList->UntranslatedResourceList = AllocateItem(PoolType,
sizeof(CM_RESOURCE_LIST), TAG_PORTCLASS);
if (!NewList->UntranslatedResourceList)
{
- ExFreePoolWithTag(NewList->TranslatedResourceList, TAG_PORTCLASS);
- ExFreePoolWithTag(NewList, TAG_PORTCLASS);
+ FreeItem(NewList->TranslatedResourceList, TAG_PORTCLASS);
+ FreeItem(NewList, TAG_PORTCLASS);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -409,5 +412,6 @@
*OutResourceList = (IResourceList*)&NewList->lpVtbl;
+ DPRINT1("PcNewResourceSublist OutResourceList %p OuterUnknown %p ParentList
%p\n", *OutResourceList, OuterUnknown, ParentList);
return STATUS_SUCCESS;
}
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/service_group.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- 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] Sat Jan
17 05:19:27 2009
@@ -21,8 +21,7 @@
}IServiceGroupImpl;
-const GUID IID_IServiceGroup;
-const GUID IID_IServiceSink;
+
//---------------------------------------------------------------
// IUnknown methods
@@ -75,11 +74,11 @@
CurEntry = RemoveHeadList(&This->ServiceSinkHead);
Entry = CONTAINING_RECORD(CurEntry, GROUP_ENTRY, Entry);
Entry->pServiceSink->lpVtbl->Release(Entry->pServiceSink);
- ExFreePoolWithTag(Entry, TAG_PORTCLASS);
+ FreeItem(Entry, TAG_PORTCLASS);
}
KeWaitForSingleObject(&This->DpcEvent, Executive, KernelMode, FALSE,
NULL);
KeCancelTimer(&This->Timer);
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -123,7 +122,7 @@
PGROUP_ENTRY Entry;
IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
- Entry = ExAllocatePoolWithTag(NonPagedPool, sizeof(GROUP_ENTRY), TAG_PORTCLASS);
+ Entry = AllocateItem(NonPagedPool, sizeof(GROUP_ENTRY), TAG_PORTCLASS);
if (!Entry)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -159,7 +158,7 @@
{
RemoveEntryList(&Entry->Entry);
pServiceSink->lpVtbl->Release(pServiceSink);
- ExFreePoolWithTag(Entry, TAG_PORTCLASS);
+ FreeItem(Entry, TAG_PORTCLASS);
return;
}
CurEntry = CurEntry->Flink;
@@ -253,14 +252,15 @@
{
IServiceGroupImpl * This;
- This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IServiceGroupImpl),
TAG_PORTCLASS);
+ DPRINT1("PcNewServiceGroup entered\n");
+
+ This = AllocateItem(NonPagedPool, sizeof(IServiceGroupImpl), TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;
This->lpVtbl = &vt_IServiceGroup;
This->ref = 1;
InitializeListHead(&This->ServiceSinkHead);
- This->Initialized = FALSE;
*OutServiceGroup = (PSERVICEGROUP)&This->lpVtbl;
return STATUS_SUCCESS;
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/version.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/backpln/portcls/version.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/backpln/portcls/version.c [iso-8859-1] Sat Jan 17
05:19:27 2009
@@ -7,7 +7,7 @@
LONG ref;
}IPortClsVersionImpl;
-const GUID IID_IPortClsVersion;
+
//---------------------------------------------------------------
// IPortClsVersion interface functions
@@ -53,7 +53,7 @@
if (This->ref == 0)
{
- ExFreePoolWithTag(This, TAG_PORTCLASS);
+ FreeItem(This, TAG_PORTCLASS);
return 0;
}
/* Return new reference count */
@@ -80,7 +80,7 @@
NTSTATUS NewPortClsVersion(
OUT PPORTCLSVERSION * OutVersion)
{
- IPortClsVersionImpl * This = ExAllocatePoolWithTag(NonPagedPool,
sizeof(IPortClsVersionImpl), TAG_PORTCLASS);
+ IPortClsVersionImpl * This = AllocateItem(NonPagedPool, sizeof(IPortClsVersionImpl),
TAG_PORTCLASS);
if (!This)
return STATUS_INSUFFICIENT_RESOURCES;