From 9507d41badc95f0c2c3c2fce441e79540c9dad3a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 11 Dec 2008 14:51:57 +0000 Subject: [PATCH] - Implement IDrmPort, IDrmPort2 interface svn path=/trunk/; revision=38018 --- .../wdm/audio/backpln/portcls/drm_port.c | 166 ++++++++++++++++++ .../wdm/audio/backpln/portcls/portcls.rbuild | 1 + .../wdm/audio/backpln/portcls/private.h | 2 + 3 files changed, 169 insertions(+) create mode 100644 reactos/drivers/wdm/audio/backpln/portcls/drm_port.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c b/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c new file mode 100644 index 00000000000..20ad65c628f --- /dev/null +++ b/reactos/drivers/wdm/audio/backpln/portcls/drm_port.c @@ -0,0 +1,166 @@ +#include "private.h" + + +const GUID IID_IDrmPort; +const GUID IID_IDrmPort2; + +typedef struct +{ + IDrmPort2Vtbl *lpVtbl; + LONG ref; +}IDrmPort2Impl; + +ULONG +NTAPI +IDrmPort2_fnAddRef( + IN IDrmPort2* iface) +{ + IDrmPort2Impl * This = (IDrmPort2Impl*)iface; + + DPRINT("IDrmPort2_AddRef: This %p\n", This); + + return _InterlockedIncrement(&This->ref); +} + +ULONG +NTAPI +IDrmPort2_fnRelease( + IN IDrmPort2* iface) +{ + IDrmPort2Impl * This = (IDrmPort2Impl*)iface; + + _InterlockedDecrement(&This->ref); + + if (This->ref == 0) + { + ExFreePoolWithTag(This, TAG_PORTCLASS); + return 0; + } + /* Return new reference count */ + return This->ref; +} + +NTSTATUS +NTAPI +IDrmPort2_fnQueryInterface( + IN IDrmPort2* iface, + IN REFIID refiid, + OUT PVOID* Output) +{ + IDrmPort2Impl * This = (IDrmPort2Impl*)iface; + + if (IsEqualGUIDAligned(refiid, &IID_IDrmPort) || + IsEqualGUIDAligned(refiid, &IID_IDrmPort2) || + IsEqualGUIDAligned(refiid, &IID_IUnknown)) + { + *Output = (PVOID)&This->lpVtbl; + _InterlockedIncrement(&This->ref); + return STATUS_SUCCESS; + } + + DPRINT("IDrmPort2_QueryInterface: This %p unknown iid\n", This, This->ref); + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +NTAPI +IDrmPort2_fnCreateContentMixed( + IN IDrmPort2 * iface, + IN PULONG paContentId, + IN ULONG cContentId, + OUT PULONG pMixedContentId) +{ + return DrmCreateContentMixed(paContentId, cContentId, pMixedContentId); +} + +NTSTATUS +NTAPI +IDrmPort2_fnDestroyContent( + IN IDrmPort2 * iface, + IN ULONG ContentId) +{ + return DrmDestroyContent(ContentId); +} + +NTSTATUS +NTAPI +IDrmPort2_fnForwardContentToFileObject( + IN IDrmPort2 * iface, + IN ULONG ContentId, + IN PFILE_OBJECT FileObject) +{ + return DrmForwardContentToFileObject(ContentId, FileObject); +} + +NTSTATUS +NTAPI +IDrmPort2_fnForwardContentToInterface( + IN IDrmPort2 * iface, + IN ULONG ContentId, + IN PUNKNOWN pUnknown, + IN ULONG NumMethods) +{ + return DrmForwardContentToInterface(ContentId, pUnknown, NumMethods); +} + +NTSTATUS +NTAPI +IDrmPort2_fnGetContentRights( + IN IDrmPort2 * iface, + IN ULONG ContentId, + OUT PDRMRIGHTS DrmRights) +{ + return DrmGetContentRights(ContentId, DrmRights); +} + +NTSTATUS +NTAPI +IDrmPort2_fnAddContentHandlers( + IN IDrmPort2 * iface, + IN ULONG ContentId, + IN PVOID * paHandlers, + IN ULONG NumHandlers) +{ + return DrmAddContentHandlers(ContentId, paHandlers, NumHandlers); +} + +NTSTATUS +NTAPI +IDrmPort2_fnForwardContentToDeviceObject( + IN IDrmPort2 * iface, + IN ULONG ContentId, + IN PVOID Reserved, + IN PCDRMFORWARD DrmForward) +{ + return DrmForwardContentToDeviceObject(ContentId, Reserved, DrmForward); +} + +static IDrmPort2Vtbl vt_IDrmPort2 = +{ + /* IUnknown methods */ + IDrmPort2_fnQueryInterface, + IDrmPort2_fnAddRef, + IDrmPort2_fnRelease, + IDrmPort2_fnCreateContentMixed, + IDrmPort2_fnDestroyContent, + IDrmPort2_fnForwardContentToFileObject, + IDrmPort2_fnForwardContentToInterface, + IDrmPort2_fnGetContentRights, + IDrmPort2_fnAddContentHandlers, + IDrmPort2_fnForwardContentToDeviceObject +}; + +NTSTATUS +NewIDrmPort( + OUT PDRMPORT2 *OutPort) +{ + IDrmPort2Impl * This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IDrmPort2Impl), TAG_PORTCLASS); + if (!This) + return STATUS_INSUFFICIENT_RESOURCES; + + This->lpVtbl = &vt_IDrmPort2; + This->ref = 1; + + *OutPort = (PDRMPORT2)&This->lpVtbl; + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild index 57a899175d0..b15f9ed89fe 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild +++ b/reactos/drivers/wdm/audio/backpln/portcls/portcls.rbuild @@ -13,6 +13,7 @@ dll.c dma_master.c dma_slave.c + drm_port.c adapter.c irp.c interrupt.c diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index ba05eebbd5c..7a008af21e2 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -74,6 +74,8 @@ NTSTATUS NewDmaChannelSlave( IN PDMA_ADAPTER Adapter, OUT PDMACHANNELSLAVE* DmaChannel); +NTSTATUS NewIDrmPort( + OUT PDRMPORT2 *OutPort); typedef struct {