Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfilter_topology.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/wdm/audio/backpln/portcls/filter_topology.c 00005 * PURPOSE: portcls topology filter 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 #include "private.hpp" 00010 00011 class CPortFilterTopology : public IPortFilterTopology 00012 { 00013 public: 00014 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00015 00016 STDMETHODIMP_(ULONG) AddRef() 00017 { 00018 InterlockedIncrement(&m_Ref); 00019 return m_Ref; 00020 } 00021 STDMETHODIMP_(ULONG) Release() 00022 { 00023 InterlockedDecrement(&m_Ref); 00024 00025 if (!m_Ref) 00026 { 00027 delete this; 00028 return 0; 00029 } 00030 return m_Ref; 00031 } 00032 IMP_IPortFilterTopology; 00033 CPortFilterTopology(IUnknown *OuterUnknown){} 00034 virtual ~CPortFilterTopology(){} 00035 00036 protected: 00037 IPortTopology * m_Port; 00038 SUBDEVICE_DESCRIPTOR * m_Descriptor; 00039 ISubdevice * m_SubDevice; 00040 LONG m_Ref; 00041 }; 00042 00043 00044 NTSTATUS 00045 NTAPI 00046 CPortFilterTopology::QueryInterface( 00047 IN REFIID refiid, 00048 OUT PVOID* Output) 00049 { 00050 00051 if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) || 00052 IsEqualGUIDAligned(refiid, IID_IUnknown)) 00053 { 00054 *Output = PVOID(PUNKNOWN(this)); 00055 PUNKNOWN(*Output)->AddRef(); 00056 return STATUS_SUCCESS; 00057 } 00058 else if (IsEqualGUIDAligned(refiid, IID_IPort)) 00059 { 00060 *Output = PVOID(PUNKNOWN(m_Port)); 00061 PUNKNOWN(*Output)->AddRef(); 00062 return STATUS_SUCCESS; 00063 } 00064 00065 return STATUS_UNSUCCESSFUL; 00066 } 00067 00068 NTSTATUS 00069 NTAPI 00070 CPortFilterTopology::NewIrpTarget( 00071 OUT struct IIrpTarget **OutTarget, 00072 IN PCWSTR Name, 00073 IN PUNKNOWN Unknown, 00074 IN POOL_TYPE PoolType, 00075 IN PDEVICE_OBJECT DeviceObject, 00076 IN PIRP Irp, 00077 IN KSOBJECT_CREATE *CreateObject) 00078 { 00079 DPRINT("CPortFilterTopology::NewIrpTarget entered\n"); 00080 00081 return STATUS_NOT_SUPPORTED; 00082 } 00083 00084 00085 NTSTATUS 00086 NTAPI 00087 CPortFilterTopology::DeviceIoControl( 00088 IN PDEVICE_OBJECT DeviceObject, 00089 IN PIRP Irp) 00090 { 00091 PIO_STACK_LOCATION IoStack; 00092 NTSTATUS Status; 00093 00094 IoStack = IoGetCurrentIrpStackLocation(Irp); 00095 00096 if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) 00097 { 00098 DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength); 00099 00100 Irp->IoStatus.Status = STATUS_SUCCESS; 00101 00102 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00103 return STATUS_SUCCESS; 00104 } 00105 00106 Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor); 00107 if (Status != STATUS_PENDING) 00108 { 00109 Irp->IoStatus.Status = Status; 00110 DPRINT("Result %x Length %u\n", Status, Irp->IoStatus.Information); 00111 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00112 } 00113 return Status; 00114 00115 } 00116 00117 NTSTATUS 00118 NTAPI 00119 CPortFilterTopology::Read( 00120 IN PDEVICE_OBJECT DeviceObject, 00121 IN PIRP Irp) 00122 { 00123 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00124 } 00125 00126 NTSTATUS 00127 NTAPI 00128 CPortFilterTopology::Write( 00129 IN PDEVICE_OBJECT DeviceObject, 00130 IN PIRP Irp) 00131 { 00132 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00133 } 00134 00135 NTSTATUS 00136 NTAPI 00137 CPortFilterTopology::Flush( 00138 IN PDEVICE_OBJECT DeviceObject, 00139 IN PIRP Irp) 00140 { 00141 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00142 } 00143 00144 NTSTATUS 00145 NTAPI 00146 CPortFilterTopology::Close( 00147 IN PDEVICE_OBJECT DeviceObject, 00148 IN PIRP Irp) 00149 { 00150 NTSTATUS Status = STATUS_SUCCESS; 00151 00152 // FIXME handle DirectSound 00153 00154 #if 0 00155 //FIXME 00156 if (m_ref == 1) 00157 { 00158 // release reference to port 00159 This->SubDevice->lpVtbl->Release(This->SubDevice); 00160 00161 // time to shutdown the audio system 00162 Status = This->SubDevice->lpVtbl->ReleaseChildren(This->SubDevice); 00163 } 00164 #endif 00165 00166 Irp->IoStatus.Status = Status; 00167 Irp->IoStatus.Information = 0; 00168 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00169 00170 return STATUS_SUCCESS; 00171 } 00172 00173 NTSTATUS 00174 NTAPI 00175 CPortFilterTopology::QuerySecurity( 00176 IN PDEVICE_OBJECT DeviceObject, 00177 IN PIRP Irp) 00178 { 00179 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00180 } 00181 00182 NTSTATUS 00183 NTAPI 00184 CPortFilterTopology::SetSecurity( 00185 IN PDEVICE_OBJECT DeviceObject, 00186 IN PIRP Irp) 00187 { 00188 return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); 00189 } 00190 00191 BOOLEAN 00192 NTAPI 00193 CPortFilterTopology::FastDeviceIoControl( 00194 IN PFILE_OBJECT FileObject, 00195 IN BOOLEAN Wait, 00196 IN PVOID InputBuffer, 00197 IN ULONG InputBufferLength, 00198 OUT PVOID OutputBuffer, 00199 IN ULONG OutputBufferLength, 00200 IN ULONG IoControlCode, 00201 OUT PIO_STATUS_BLOCK StatusBlock, 00202 IN PDEVICE_OBJECT DeviceObject) 00203 { 00204 return FALSE; 00205 } 00206 00207 BOOLEAN 00208 NTAPI 00209 CPortFilterTopology::FastRead( 00210 IN PFILE_OBJECT FileObject, 00211 IN PLARGE_INTEGER FileOffset, 00212 IN ULONG Length, 00213 IN BOOLEAN Wait, 00214 IN ULONG LockKey, 00215 IN PVOID Buffer, 00216 OUT PIO_STATUS_BLOCK StatusBlock, 00217 IN PDEVICE_OBJECT DeviceObject) 00218 { 00219 return FALSE; 00220 } 00221 00222 BOOLEAN 00223 NTAPI 00224 CPortFilterTopology::FastWrite( 00225 IN PFILE_OBJECT FileObject, 00226 IN PLARGE_INTEGER FileOffset, 00227 IN ULONG Length, 00228 IN BOOLEAN Wait, 00229 IN ULONG LockKey, 00230 IN PVOID Buffer, 00231 OUT PIO_STATUS_BLOCK StatusBlock, 00232 IN PDEVICE_OBJECT DeviceObject) 00233 { 00234 return FALSE; 00235 } 00236 00237 NTSTATUS 00238 NTAPI 00239 CPortFilterTopology::Init( 00240 IN IPortTopology* Port) 00241 { 00242 ISubdevice * ISubDevice; 00243 SUBDEVICE_DESCRIPTOR * Descriptor; 00244 NTSTATUS Status; 00245 00246 00247 // get our private interface 00248 Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice); 00249 if (!NT_SUCCESS(Status)) 00250 return STATUS_UNSUCCESSFUL; 00251 00252 // get the subdevice descriptor 00253 Status = ISubDevice->GetDescriptor(&Descriptor); 00254 00255 // store subdevice interface 00256 m_SubDevice = ISubDevice; 00257 00258 if (!NT_SUCCESS(Status)) 00259 return STATUS_UNSUCCESSFUL; 00260 00261 // save descriptor 00262 m_Descriptor = Descriptor; 00263 00264 // store port object 00265 m_Port = Port; 00266 00267 return STATUS_SUCCESS; 00268 } 00269 00270 NTSTATUS 00271 NewPortFilterTopology( 00272 OUT IPortFilterTopology ** OutFilter) 00273 { 00274 CPortFilterTopology * This; 00275 00276 This = new(NonPagedPool, TAG_PORTCLASS)CPortFilterTopology(NULL); 00277 if (!This) 00278 return STATUS_INSUFFICIENT_RESOURCES; 00279 00280 This->AddRef(); 00281 00282 // return result 00283 *OutFilter = (CPortFilterTopology*)This; 00284 00285 return STATUS_SUCCESS; 00286 } Generated on Fri May 25 2012 04:26:49 for ReactOS by
1.7.6.1
|