1 /* 2 PortCls FDO Extension 3 4 by Andrew Greenwood 5 */ 6 7 #ifndef PORTCLS_PRIVATE_H 8 #define PORTCLS_PRIVATE_H 9 10 //#define _KS_NO_ANONYMOUS_STRUCTURES_ 11 #define PC_IMPLEMENTATION 12 #define COM_STDMETHOD_CAN_THROW 13 #define PC_NO_IMPORTS 14 15 #include <ntddk.h> 16 #include <portcls.h> 17 #define NDEBUG 18 #include <debug.h> 19 20 #include <dmusicks.h> 21 #include <kcom.h> 22 #include "interfaces.hpp" 23 #include <ks.h> 24 #include <ksmedia.h> 25 //#include <intrin.h> 26 27 #define TAG_PORTCLASS 'SLCP' 28 29 #define PC_ASSERT(exp) \ 30 (VOID)((!(exp)) ? \ 31 RtlAssert((PVOID) #exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE) 32 33 #define PC_ASSERT_IRQL(x) PC_ASSERT(KeGetCurrentIrql() <= (x)) 34 #define PC_ASSERT_IRQL_EQUAL(x) PC_ASSERT(KeGetCurrentIrql()==(x)) 35 36 extern 37 "C" 38 NTSTATUS 39 NTAPI 40 PortClsCreate( 41 IN PDEVICE_OBJECT DeviceObject, 42 IN PIRP Irp); 43 44 extern 45 "C" 46 NTSTATUS 47 NTAPI 48 PortClsPnp( 49 IN PDEVICE_OBJECT DeviceObject, 50 IN PIRP Irp); 51 52 extern 53 "C" 54 NTSTATUS 55 NTAPI 56 PortClsPower( 57 IN PDEVICE_OBJECT DeviceObject, 58 IN PIRP Irp); 59 60 extern 61 "C" 62 NTSTATUS 63 NTAPI 64 PortClsSysControl( 65 IN PDEVICE_OBJECT DeviceObject, 66 IN PIRP Irp); 67 68 NTSTATUS 69 NewMiniportDMusUART( 70 OUT PMINIPORT* OutMiniport, 71 IN REFCLSID ClassId); 72 73 NTSTATUS 74 NewMiniportFmSynth( 75 OUT PMINIPORT* OutMiniport, 76 IN REFCLSID ClassId); 77 78 NTSTATUS 79 NewPortDMus( 80 OUT PPORT* OutPort); 81 82 NTSTATUS 83 NewPortTopology( 84 OUT PPORT* OutPort); 85 86 NTSTATUS 87 NewPortWaveCyclic( 88 OUT PPORT* OutPort); 89 90 NTSTATUS 91 NewPortWavePci( 92 OUT PPORT* OutPort); 93 94 NTSTATUS 95 NewIDrmPort( 96 OUT PDRMPORT2 *OutPort); 97 98 NTSTATUS 99 NewPortClsVersion( 100 OUT PPORTCLSVERSION * OutVersion); 101 102 NTSTATUS 103 NewPortFilterWaveCyclic( 104 OUT IPortFilterWaveCyclic ** OutFilter); 105 106 NTSTATUS 107 NewPortPinWaveCyclic( 108 OUT IPortPinWaveCyclic ** OutPin); 109 110 NTSTATUS 111 NewPortFilterWavePci( 112 OUT IPortFilterWavePci ** OutFilter); 113 114 NTSTATUS 115 NewPortPinWavePci( 116 OUT IPortPinWavePci ** OutPin); 117 118 PDEVICE_OBJECT 119 GetDeviceObjectFromWaveCyclic( 120 IPortWavePci* iface); 121 122 PDEVICE_OBJECT 123 GetDeviceObjectFromPortWavePci( 124 IPortWavePci* iface); 125 126 PMINIPORTWAVEPCI 127 GetWavePciMiniport( 128 PPORTWAVEPCI Port); 129 130 131 NTSTATUS 132 NewPortFilterDMus( 133 OUT PPORTFILTERDMUS * OutFilter); 134 135 136 NTSTATUS 137 NewPortPinDMus( 138 OUT PPORTPINDMUS * OutPin); 139 140 VOID 141 GetDMusMiniport( 142 IN IPortDMus * iface, 143 IN PMINIPORTDMUS * Miniport, 144 IN PMINIPORTMIDI * MidiMiniport); 145 146 #if (NTDDI_VERSION >= NTDDI_VISTA) 147 148 NTSTATUS 149 NewPortFilterWaveRT( 150 OUT IPortFilterWaveRT ** OutFilter); 151 152 NTSTATUS 153 NewPortPinWaveRT( 154 OUT IPortPinWaveRT ** OutPin); 155 156 PMINIPORTWAVERT 157 GetWaveRTMiniport( 158 IN IPortWaveRT* iface); 159 160 PDEVICE_OBJECT 161 GetDeviceObjectFromPortWaveRT( 162 IPortWaveRT* iface); 163 164 165 NTSTATUS 166 NewPortWaveRTStream( 167 PPORTWAVERTSTREAM *OutStream); 168 169 NTSTATUS 170 NewPortWaveRT( 171 OUT PPORT* OutPort); 172 173 174 #endif 175 176 NTSTATUS 177 NewPortFilterTopology( 178 OUT IPortFilterTopology ** OutFilter); 179 180 PMINIPORTTOPOLOGY 181 GetTopologyMiniport( 182 PPORTTOPOLOGY Port); 183 184 NTSTATUS 185 NTAPI 186 NewDispatchObject( 187 IN PIRP Irp, 188 IN IIrpTarget * Target, 189 IN ULONG ObjectCreateItemCount, 190 IN PKSOBJECT_CREATE_ITEM ObjectCreateItem); 191 192 PMINIPORTWAVECYCLIC 193 GetWaveCyclicMiniport( 194 IN IPortWaveCyclic* iface); 195 196 PVOID 197 AllocateItem( 198 IN POOL_TYPE PoolType, 199 IN SIZE_T NumberOfBytes, 200 IN ULONG Tag); 201 202 VOID 203 FreeItem( 204 IN PVOID Item, 205 IN ULONG Tag); 206 207 NTSTATUS 208 NTAPI 209 NewIrpQueue( 210 IN IIrpQueue **Queue); 211 212 NTSTATUS 213 NTAPI 214 TopologyPropertyHandler( 215 IN PIRP Irp, 216 IN PKSIDENTIFIER Request, 217 IN OUT PVOID Data); 218 219 NTSTATUS 220 NTAPI 221 PinPropertyHandler( 222 IN PIRP Irp, 223 IN PKSIDENTIFIER Request, 224 IN OUT PVOID Data); 225 226 extern 227 "C" 228 NTSTATUS 229 NTAPI 230 PcDmaMasterDescription( 231 IN PRESOURCELIST ResourceList OPTIONAL, 232 IN BOOLEAN ScatterGather, 233 IN BOOLEAN Dma32BitAddresses, 234 IN BOOLEAN IgnoreCount, 235 IN BOOLEAN Dma64BitAddresses, 236 IN DMA_WIDTH DmaWidth, 237 IN DMA_SPEED DmaSpeed, 238 IN ULONG MaximumLength, 239 IN ULONG DmaPort, 240 OUT PDEVICE_DESCRIPTION DeviceDescription); 241 242 extern 243 "C" 244 NTSTATUS 245 NTAPI 246 PcDmaSlaveDescription( 247 IN PRESOURCELIST ResourceList OPTIONAL, 248 IN ULONG DmaIndex, 249 IN BOOLEAN DemandMode, 250 IN BOOLEAN AutoInitialize, 251 IN DMA_SPEED DmaSpeed, 252 IN ULONG MaximumLength, 253 IN ULONG DmaPort, 254 OUT PDEVICE_DESCRIPTION DeviceDescription); 255 256 extern 257 "C" 258 NTSTATUS 259 NTAPI 260 PcCreateSubdeviceDescriptor( 261 OUT SUBDEVICE_DESCRIPTOR ** OutSubdeviceDescriptor, 262 IN ULONG InterfaceCount, 263 IN GUID * InterfaceGuids, 264 IN ULONG IdentifierCount, 265 IN KSIDENTIFIER *Identifier, 266 IN ULONG FilterPropertiesCount, 267 IN KSPROPERTY_SET * FilterProperties, 268 IN ULONG Unknown1, 269 IN ULONG Unknown2, 270 IN ULONG PinPropertiesCount, 271 IN KSPROPERTY_SET * PinProperties, 272 IN ULONG EventSetCount, 273 IN KSEVENT_SET * EventSet, 274 IN PPCFILTER_DESCRIPTOR FilterDescription); 275 276 extern 277 "C" 278 NTSTATUS 279 NTAPI 280 PcValidateConnectRequest( 281 IN PIRP Irp, 282 IN KSPIN_FACTORY * Descriptor, 283 OUT PKSPIN_CONNECT* Connect); 284 285 NTSTATUS 286 NTAPI 287 PcCreateItemDispatch( 288 IN PDEVICE_OBJECT DeviceObject, 289 IN PIRP Irp); 290 291 PDEVICE_OBJECT 292 GetDeviceObject( 293 IPortWaveCyclic* iface); 294 295 VOID 296 NTAPI 297 PcIoTimerRoutine( 298 IN PDEVICE_OBJECT DeviceObject, 299 IN PVOID Context); 300 301 NTSTATUS 302 NTAPI 303 NewIUnregisterSubdevice( 304 OUT PUNREGISTERSUBDEVICE *OutDevice); 305 306 NTSTATUS 307 NTAPI 308 NewIUnregisterPhysicalConnection( 309 OUT PUNREGISTERPHYSICALCONNECTION *OutConnection); 310 311 NTSTATUS 312 NTAPI 313 PcHandlePropertyWithTable( 314 IN PIRP Irp, 315 IN ULONG PropertySetCount, 316 IN PKSPROPERTY_SET PropertySet, 317 IN PSUBDEVICE_DESCRIPTOR Descriptor); 318 319 NTSTATUS 320 NTAPI 321 PcHandleEnableEventWithTable( 322 IN PIRP Irp, 323 IN PSUBDEVICE_DESCRIPTOR Descriptor); 324 325 NTSTATUS 326 NTAPI 327 PcHandleDisableEventWithTable( 328 IN PIRP Irp, 329 IN PSUBDEVICE_DESCRIPTOR Descriptor); 330 331 IIrpTarget * 332 NTAPI 333 KsoGetIrpTargetFromIrp( 334 PIRP Irp); 335 336 #define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\ 337 PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\ 338 DEFINE_KSPROPERTY_TABLE(PinSet) {\ 339 DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\ 340 DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler),\ 341 DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(PropAllocatorFraming)\ 342 } 343 344 #define DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(GetHandler, SetHandler)\ 345 DEFINE_KSPROPERTY_ITEM(\ 346 KSPROPERTY_AUDIO_POSITION,\ 347 (GetHandler),\ 348 sizeof(KSPROPERTY),\ 349 sizeof(KSAUDIO_POSITION),\ 350 (SetHandler),\ 351 NULL, 0, NULL, NULL, 0) 352 353 #define DEFINE_KSPROPERTY_AUDIOSET(PinSet,\ 354 PropPositionHandler)\ 355 DEFINE_KSPROPERTY_TABLE(PinSet) {\ 356 DEFINE_KSPROPERTY_ITEM_AUDIO_POSITION(PropPositionHandler, PropPositionHandler)\ 357 } 358 359 #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\ 360 PropGeneral, PropInstances, PropIntersection)\ 361 DEFINE_KSPROPERTY_TABLE(PinSet) {\ 362 DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\ 363 DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\ 364 DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\ 365 DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\ 366 DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\ 367 DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\ 368 DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\ 369 DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\ 370 DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(PropGeneral),\ 371 DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(PropGeneral),\ 372 DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(PropGeneral),\ 373 DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\ 374 DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\ 375 DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\ 376 DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\ 377 } 378 379 typedef struct 380 { 381 KSDEVICE_HEADER KsDeviceHeader; 382 PDEVICE_OBJECT PhysicalDeviceObject; 383 PDEVICE_OBJECT PrevDeviceObject; 384 PCPFNSTARTDEVICE StartDevice; 385 ULONG_PTR Unused[4]; 386 IAdapterPowerManagement * AdapterPowerManagement; 387 ULONG MaxSubDevices; 388 KSOBJECT_CREATE_ITEM * CreateItems; 389 390 IResourceList* resources; 391 392 LIST_ENTRY TimerList; 393 KSPIN_LOCK TimerListLock; 394 395 DEVICE_POWER_STATE DevicePowerState; 396 SYSTEM_POWER_STATE SystemPowerState; 397 398 } PCLASS_DEVICE_EXTENSION, *PPCLASS_DEVICE_EXTENSION; 399 400 401 typedef struct 402 { 403 PVOID Pin; 404 PIO_WORKITEM WorkItem; 405 PIRP Irp; 406 }CLOSESTREAM_CONTEXT, *PCLOSESTREAM_CONTEXT; 407 408 typedef struct 409 { 410 LIST_ENTRY Entry; 411 PIO_TIMER_ROUTINE pTimerRoutine; 412 PVOID Context; 413 }TIMER_CONTEXT, *PTIMER_CONTEXT; 414 415 typedef struct 416 { 417 KSOBJECT_HEADER ObjectHeader; 418 IIrpTarget * Target; 419 PKSOBJECT_CREATE_ITEM CreateItem; 420 }DISPATCH_CONTEXT, *PDISPATCH_CONTEXT; 421 422 #endif 423