From d56dde4a07d7123c73bf78a36dc1dbf33b866398 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 11 Dec 2008 11:23:14 +0000 Subject: [PATCH] - Use FILE_DEVICE_KS when creating new device object - Partly implement PcNewRegistryKey, PcRegisterSubdevice - DPC event is a Synchronization event- Implement PcRegisterAdapterPowerManagement svn path=/trunk/; revision=38011 --- .../wdm/audio/backpln/portcls/adapter.c | 49 ++++++++++++++- .../wdm/audio/backpln/portcls/portcls.rbuild | 1 + .../drivers/wdm/audio/backpln/portcls/power.c | 38 ++++++++++++ .../wdm/audio/backpln/portcls/private.h | 8 +++ .../wdm/audio/backpln/portcls/registry.c | 60 ++++++++++++++++++- .../wdm/audio/backpln/portcls/service_group.c | 7 +-- .../drivers/wdm/audio/backpln/portcls/stubs.c | 26 -------- 7 files changed, 154 insertions(+), 35 deletions(-) create mode 100644 reactos/drivers/wdm/audio/backpln/portcls/power.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c index 2a6a752bd0a..ecca86c182c 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c @@ -144,7 +144,7 @@ PcAddAdapterDevice( status = IoCreateDevice(DriverObject, DeviceExtensionSize, NULL, - PhysicalDeviceObject->DeviceType, /* FILE_DEVICE_KS ? */ + FILE_DEVICE_KS, PhysicalDeviceObject->Characteristics, /* TODO: Check */ FALSE, &fdo); @@ -161,9 +161,56 @@ PcAddAdapterDevice( ASSERT(portcls_ext); /* Initialize */ + RtlZeroMemory(portcls_ext, sizeof(PCExtension)); portcls_ext->StartDevice = StartDevice; + status = KsAllocateDeviceHeader(&portcls_ext->KsDeviceHeader, 0, NULL); + if (!NT_SUCCESS(status)) + { + IoDeleteDevice(fdo); + return status; + } + DPRINT("PcAddAdapterDriver succeeded\n"); + return status; +} + +NTSTATUS +NTAPI +PciDriverDispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + DPRINT1("PortClsSysControl called\n"); + + /* TODO */ + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; } + +NTSTATUS NTAPI +PcRegisterSubdevice( + IN PDEVICE_OBJECT DeviceObject, + IN PWCHAR Name, + IN PUNKNOWN Unknown) +{ + PCExtension* DeviceExt; + NTSTATUS Status; + + if (!DeviceObject || !Name || !Unknown) + return STATUS_INVALID_PARAMETER; + + DeviceExt = (PCExtension*)DeviceObject->DeviceExtension; + if (!DeviceExt) + return STATUS_UNSUCCESSFUL; + + Status = KsAddObjectCreateItemToDeviceHeader(DeviceExt->KsDeviceHeader, PciDriverDispatch, (PVOID)Unknown, Name, NULL); + + + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild index 4359c202b5c..57a899175d0 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild +++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild @@ -23,6 +23,7 @@ registry.c service_group.c port.c + power.c port_dmus.c port_midi.c port_topology.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/power.c b/reactos/drivers/wdm/audio/backpln/portcls/power.c new file mode 100644 index 00000000000..3f0a4060c2c --- /dev/null +++ b/reactos/drivers/wdm/audio/backpln/portcls/power.c @@ -0,0 +1,38 @@ +#include "private.h" + +const GUID IID_IAdapterPowerManagement; + +/* + * @implemented + */ + +NTSTATUS +NTAPI +PcRegisterAdapterPowerManagement( + IN PUNKNOWN pUnknown, + IN PVOID pvContext) +{ + NTSTATUS Status; + PDEVICE_OBJECT pDeviceObject; + PCExtension* DeviceExt; + IAdapterPowerManagement * pPower; + + 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) + { + pPower->lpVtbl->Release(pPower); + return STATUS_UNSUCCESSFUL; + } + + DeviceExt->AdapterPowerManagement = pPower; + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index a2e127a78b3..ba05eebbd5c 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -69,9 +69,17 @@ NTSTATUS NewPortWaveCyclic( NTSTATUS NewPortWavePci( OUT PPORT* OutPort); +NTSTATUS NewDmaChannelSlave( + IN PDEVICE_DESCRIPTION DeviceDesc, + IN PDMA_ADAPTER Adapter, + OUT PDMACHANNELSLAVE* DmaChannel); + + typedef struct { PCPFNSTARTDEVICE StartDevice; + KSDEVICE_HEADER KsDeviceHeader; + IAdapterPowerManagement * AdapterPowerManagement; IResourceList* resources; } PCExtension; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/registry.c b/reactos/drivers/wdm/audio/backpln/portcls/registry.c index 8b3d2291b05..722860153ca 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/registry.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/registry.c @@ -198,6 +198,22 @@ IRegistryKey_fnSetValueKey( return ZwSetValueKey(This->hKey, ValueName, 0, Type, Data, DataSize); } +static IRegistryKeyVtbl vt_IRegistryKey = +{ + /* IUnknown methods */ + IRegistryKey_fnQueryInterface, + IRegistryKey_fnAddRef, + IRegistryKey_fnRelease, + /* IRegistryKey methods */ + IRegistryKey_fnQueryKey, + IRegistryKey_fnEnumerateKey, + IRegistryKey_fnQueryValueKey, + IRegistryKey_fnEnumerateKeyValue, + IRegistryKey_fnSetValueKey, + IRegistryKey_fnQueryRegistryValues, + IRegistryKey_fnNewSubKey, + IRegistryKey_fnDeleteKey +}; /* * @unimplemented @@ -214,9 +230,47 @@ PcNewRegistryKey( IN ULONG CreateOptions OPTIONAL, OUT PULONG Disposition OPTIONAL) { - UNIMPLEMENTED; - //IoGetDeviceProperty + HANDLE hHandle; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + IRegistryKeyImpl * This; - return STATUS_UNSUCCESSFUL; + if (!OutRegistryKey) + return STATUS_INVALID_PARAMETER; + + if (RegistryKeyType != GeneralRegistryKey && + RegistryKeyType != DeviceRegistryKey && + RegistryKeyType != DriverRegistryKey && + RegistryKeyType != HwProfileRegistryKey && + RegistryKeyType != DeviceInterfaceRegistryKey) + { + return STATUS_INVALID_PARAMETER; + } + + if (RegistryKeyType == GeneralRegistryKey) + { + if (!ObjectAttributes) + return STATUS_INVALID_PARAMETER; + + Status = ZwOpenKey(&hHandle, DesiredAccess, ObjectAttributes); + } + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IRegistryKeyImpl), TAG_PORTCLASS); + if (!This) + { + ZwClose(hHandle); + return STATUS_INSUFFICIENT_RESOURCES; + } + + This->hKey = hHandle; + This->lpVtbl = &vt_IRegistryKey; + This->ref = 1; + + *OutRegistryKey = (PREGISTRYKEY)&This->lpVtbl; + return STATUS_SUCCESS; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c index f178c3a2af3..fa014b589de 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/service_group.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/service_group.c @@ -191,7 +191,7 @@ IServiceGroup_fnSupportDelayedService( if (!This->Initialized) { - KeInitializeEvent(&This->DpcEvent, NotificationEvent, FALSE); + KeInitializeEvent(&This->DpcEvent, SynchronizationEvent, FALSE); KeInitializeTimerEx(&This->Timer, NotificationTimer); KeInitializeDpc(&This->Dpc, IServiceGroupDpc, (PVOID)This); This->Initialized = TRUE; @@ -263,8 +263,5 @@ PcNewServiceGroup( This->Initialized = FALSE; *OutServiceGroup = (PSERVICEGROUP)&This->lpVtbl; - return STATUS_UNSUCCESSFUL; + return STATUS_SUCCESS; } - - - diff --git a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c index 4d6302fc5c7..d1740bc48c6 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/stubs.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/stubs.c @@ -32,18 +32,6 @@ PcNewDmaChannel( Power Management */ -/* - * @unimplemented - */ -NTSTATUS NTAPI -PcRegisterAdapterPowerManagement( - IN PUNKNOWN pUnknown, - IN PVOID pvContext1) -{ - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; -} - /* * @unimplemented */ @@ -130,17 +118,3 @@ PcRegisterPhysicalConnectionToExternal( /* * @unimplemented */ - - -/* - * @unimplemented - */ -NTSTATUS NTAPI -PcRegisterSubdevice( - IN PDEVICE_OBJECT DeviceObject, - IN PWCHAR Name, - IN PUNKNOWN Unknown) -{ - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; -}