/***************************************************************************** * portclsp.h - WDM Streaming port class driver definitions for port drivers ***************************************************************************** * Copyright (c) 1996-2000 Microsoft Corporation. All Rights Reserved. */ #ifndef _PORTCLSP_H_ #define _PORTCLSP_H_ #include "kso.h" #define PC_NEW_NAMES #define PC_IMPLEMENTATION #include "portcls.h" #include "ksshellp.h" extern ULONG gBufferDuration; extern KAFFINITY gInterruptAffinity; #define WAVECYC_NOTIFICATION_FREQUENCY gBufferDuration #ifdef UNDER_NT #ifdef __cplusplus extern "C" { #endif NTKERNELAPI ULONG KeGetRecommendedSharedDataAlignment ( VOID ); KAFFINITY KeQueryActiveProcessors ( VOID ); #ifdef __cplusplus } #endif #else // UNDER_NT #define KeGetRecommendedSharedDataAlignment() 0x40 #define KeQueryActiveProcessors() 1 #endif PKSPIN_LOCK GetServiceGroupSpinLock ( PSERVICEGROUP pServiceGroup ); #ifndef _WIN64 #define DRM_PORTCLS #endif #if DBG #define kEnableDebugLogging 1 #endif #if kEnableDebugLogging #define kNumDebugLogEntries 256 #define kNumULONG_PTRsPerEntry 4 #define DebugLog PcDebugLog extern ULONG_PTR *gPcDebugLog; extern DWORD gPcDebugLogIndex; void PcDebugLog(ULONG_PTR param1,ULONG_PTR param2,ULONG_PTR param3,ULONG_PTR param4); #else // !kEnableDebugLogging #define DebugLog (void) #endif // !kEnableDebugLogging /***************************************************************************** * Structures. */ /***************************************************************************** * PORT_DRIVER ***************************************************************************** * This structure describes a port driver. This is just a hack until we get * real object servers running. * TODO: Create real object servers and put port drivers in 'em. */ typedef struct { const GUID * ClassId; PFNCREATEINSTANCE Create; } PORT_DRIVER, *PPORT_DRIVER; /***************************************************************************** * Interface identifiers. */ DEFINE_GUID(IID_ISubdevice, 0xb4c90a61, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStream, 0xb4c90a70, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStreamSubmit, 0xb4c90a71, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStreamVirtual, 0xb4c90a72, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStreamPhysical, 0xb4c90a73, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStreamNotify, 0xb4c90a74, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); DEFINE_GUID(IID_IIrpStreamNotifyPhysical, 0xb4c90a75, 0x5791, 0x11d0, 0x86, 0xf9, 0x0, 0xa0, 0xc9, 0x11, 0xb5, 0x44); /***************************************************************************** * Types */ /***************************************************************************** * PROPERTY_TABLE ***************************************************************************** * Table of properties for KS consumption. */ typedef struct { ULONG PropertySetCount; PKSPROPERTY_SET PropertySets; BOOLEAN StaticSets; PBOOLEAN StaticItems; // NULL means all item tables are static. } PROPERTY_TABLE, *PPROPERTY_TABLE; /***************************************************************************** * EVENT_TABLE ***************************************************************************** * Table of events for KS consumption. */ typedef struct { ULONG EventSetCount; PKSEVENT_SET EventSets; BOOLEAN StaticSets; PBOOLEAN StaticItems; // NULL means all item tables are static. } EVENT_TABLE, *PEVENT_TABLE; /***************************************************************************** * PIN_CINSTANCES ***************************************************************************** * This structure stores instance information for a pin. */ typedef struct { ULONG FilterPossible; ULONG FilterNecessary; ULONG GlobalPossible; ULONG GlobalCurrent; } PIN_CINSTANCES, *PPIN_CINSTANCES; /***************************************************************************** * SUBDEVICE_DESCRIPTOR ***************************************************************************** * This structure describes a filter. */ typedef struct { ULONG PinCount; PKSTOPOLOGY Topology; PKSPIN_DESCRIPTOR PinDescriptors; PPIN_CINSTANCES PinInstances; PROPERTY_TABLE FilterPropertyTable; PPROPERTY_TABLE PinPropertyTables; EVENT_TABLE FilterEventTable; PEVENT_TABLE PinEventTables; } SUBDEVICE_DESCRIPTOR, *PSUBDEVICE_DESCRIPTOR; /***************************************************************************** * PROPERTY_CONTEXT ***************************************************************************** * Context for property handling. */ typedef struct { struct ISubdevice * pSubdevice; PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor; PPCFILTER_DESCRIPTOR pPcFilterDescriptor; PUNKNOWN pUnknownMajorTarget; PUNKNOWN pUnknownMinorTarget; ULONG ulNodeId; PULONG pulPinInstanceCounts; } PROPERTY_CONTEXT, *PPROPERTY_CONTEXT; /***************************************************************************** * INTERLOCKED_LIST ***************************************************************************** * A LIST_ENTRY with a SPIN_LOCK. */ typedef struct { LIST_ENTRY List; KSPIN_LOCK ListLock; } INTERLOCKED_LIST, *PINTERLOCKED_LIST; /***************************************************************************** * EVENT_CONTEXT ***************************************************************************** * Context for event handling. */ typedef struct { PPROPERTY_CONTEXT pPropertyContext; PINTERLOCKED_LIST pEventList; ULONG ulPinId; ULONG ulEventSetCount; const KSEVENT_SET* pEventSets; } EVENT_CONTEXT, *PEVENT_CONTEXT; /***************************************************************************** * PCEVENT_ENTRY ***************************************************************************** * An event entry with attached node and pin ids. */ typedef struct { KSEVENT_ENTRY EventEntry; const PCEVENT_ITEM * EventItem; PUNKNOWN pUnknownMajorTarget; PUNKNOWN pUnknownMinorTarget; ULONG PinId; ULONG NodeId; } PCEVENT_ENTRY, *PPCEVENT_ENTRY; typedef struct { GUID* Set; ULONG EventId; BOOL PinEvent; ULONG PinId; BOOL NodeEvent; ULONG NodeId; BOOL ContextInUse; } EVENT_DPC_CONTEXT,*PEVENT_DPC_CONTEXT; /***************************************************************************** * IRPSTREAM_POSITION ***************************************************************************** * Position descriptor for IrpStream. */ typedef struct { ULONGLONG ullCurrentExtent; // Current Extent - Maximum stream position ULONGLONG ullMappingPosition; // Mapping Position - The current mapping position ULONGLONG ullUnmappingPosition; // Unmapping Position - The current unmapping position ULONGLONG ullStreamPosition; // Stream Position - The current stream position ULONGLONG ullStreamOffset; // Stream Base Position - The offset between stream and unmapping position ULONGLONG ullPhysicalOffset; // Physical Offset - Used by clock to adjust for starvation ULONG ulMappingPacketSize; // Size of current mapping packet ULONG ulMappingOffset; // Offset into mapping packet that is currently mapped ULONG ulUnmappingPacketSize; // Size of current unmapping packet ULONG ulUnmappingOffset; // Offset into unmapping packet that is currently unmapped BOOLEAN bLoopedInterface; // Pin interface is KSINTERFACE_STANDARD_LOOPED_STREAMING ? BOOLEAN bMappingPacketLooped; // Mapping packet is KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA ? BOOLEAN bUnmappingPacketLooped; // Unmapping packet is KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA ? } IRPSTREAM_POSITION, *PIRPSTREAM_POSITION; /***************************************************************************** * Interfaces. */ /***************************************************************************** * ISubdevice ***************************************************************************** * Interface for subdevices. */ #if !defined(DEFINE_ABSTRACT_SUBDEVICE) #define DEFINE_ABSTRACT_SUBDEVICE() \ STDMETHOD_(void,ReleaseChildren) \ ( THIS \ ) PURE; \ STDMETHOD_(NTSTATUS,GetDescriptor) \ ( THIS_ \ OUT const SUBDEVICE_DESCRIPTOR ** Descriptor \ ) PURE; \ STDMETHOD_(NTSTATUS,DataRangeIntersection) \ ( THIS_ \ IN ULONG PinId, \ IN PKSDATARANGE DataRange, \ IN PKSDATARANGE MatchingDataRange, \ IN ULONG OutputBufferLength, \ OUT PVOID ResultantFormat OPTIONAL, \ OUT PULONG ResultantFormatLength \ ) PURE; \ STDMETHOD_(void,PowerChangeNotify) \ ( THIS_ \ IN POWER_STATE PowerState \ ) PURE; \ STDMETHOD_(void,PinCount) \ ( THIS_ \ IN ULONG PinId, \ IN OUT PULONG FilterNecessary, \ IN OUT PULONG FilterCurrent, \ IN OUT PULONG FilterPossible, \ IN OUT PULONG GlobalCurrent, \ IN OUT PULONG GlobalPossible \ ) PURE; #endif //!defined(DEFINE_ABSTRACT_SUBDEVICE) DECLARE_INTERFACE_(ISubdevice,IIrpTargetFactory) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown DEFINE_ABSTRACT_IRPTARGETFACTORY() // For IIrpTargetFactory DEFINE_ABSTRACT_SUBDEVICE() // For ISubdevice }; typedef ISubdevice *PSUBDEVICE; #define IMP_ISubdevice_\ STDMETHODIMP_(void)\ ReleaseChildren\ ( void\ );\ STDMETHODIMP_(NTSTATUS)\ GetDescriptor\ ( OUT const SUBDEVICE_DESCRIPTOR ** Descriptor\ );\ STDMETHODIMP_(NTSTATUS)\ DataRangeIntersection\ ( IN ULONG PinId,\ IN PKSDATARANGE DataRange,\ IN PKSDATARANGE MatchingDataRange,\ IN ULONG OutputBufferLength,\ OUT PVOID ResultantFormat OPTIONAL,\ OUT PULONG ResultantFormatLength\ );\ STDMETHODIMP_(void)\ PowerChangeNotify\ ( IN POWER_STATE PowerState\ );\ STDMETHODIMP_(void)\ PinCount\ ( IN ULONG PinId,\ IN OUT PULONG FilterNecessary,\ IN OUT PULONG FilterCurrent,\ IN OUT PULONG FilterPossible,\ IN OUT PULONG GlobalCurrent,\ IN OUT PULONG GlobalPossible\ ) #define IMP_ISubdevice\ IMP_IIrpTargetFactory;\ IMP_ISubdevice_ /***************************************************************************** * IIrpStreamNotify ***************************************************************************** * Irp stream notification interface (IrpStream sources this). */ DECLARE_INTERFACE_(IIrpStreamNotify,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown STDMETHOD_(void,IrpSubmitted) ( THIS_ IN PIRP Irp, IN BOOLEAN WasExhausted ) PURE; STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; }; typedef IIrpStreamNotify *PIRPSTREAMNOTIFY; #define IMP_IIrpStreamNotify\ STDMETHODIMP_(void)\ IrpSubmitted\ ( IN PIRP pIrp\ , IN BOOLEAN bWasExhausted\ );\ STDMETHODIMP_(NTSTATUS)\ GetPosition\ ( IN OUT PIRPSTREAM_POSITION pIrpStreamPosition\ ) /***************************************************************************** * IIrpStreamNotifyPhysical ***************************************************************************** * Irp stream notification interface (IrpStream sources this). */ DECLARE_INTERFACE_(IIrpStreamNotifyPhysical,IIrpStreamNotify) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown // For IIrpStreamNotify STDMETHOD_(void,IrpSubmitted) ( THIS_ IN PIRP Irp, IN BOOLEAN WasExhausted ) PURE; STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; // For IIrpStreamNotifyPhysical STDMETHOD_(void,MappingsCancelled) ( THIS_ IN PVOID FirstTag, IN PVOID LastTag, OUT PULONG MappingsCancelled ) PURE; }; typedef IIrpStreamNotifyPhysical *PIRPSTREAMNOTIFYPHYSICAL; #define IMP_IIrpStreamNotifyPhysical_\ STDMETHODIMP_(void)\ MappingsCancelled\ ( IN PVOID FirstTag\ , IN PVOID LastTag\ , OUT PULONG MappingsCancelled\ ) #define IMP_IIrpStreamNotifyPhysical\ IMP_IIrpStreamNotify;\ IMP_IIrpStreamNotifyPhysical_ /***************************************************************************** * IIrpStreamSubmit ***************************************************************************** * Irp stream submission interface. */ DECLARE_INTERFACE_(IIrpStreamSubmit,IKsShellTransport) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown // for IKsShellTransport STDMETHOD_(NTSTATUS,TransferKsIrp)(THIS_ IN PIRP Irp, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,Connect)(THIS_ IN PIKSSHELLTRANSPORT NewTransport OPTIONAL, OUT PIKSSHELLTRANSPORT *OldTransport OPTIONAL, IN KSPIN_DATAFLOW DataFlow ) PURE; STDMETHOD_(NTSTATUS,SetDeviceState)(THIS_ IN KSSTATE NewState, IN KSSTATE OldState, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,SetResetState)(THIS_ IN KSRESET ksReset, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; #if DBG STDMETHOD_(void,DbgRollCall)(THIS_ IN ULONG NameMaxSize, OUT PCHAR Name, OUT PIKSSHELLTRANSPORT* NextTransport, OUT PIKSSHELLTRANSPORT* PrevTransport ) PURE; #endif // for IIrpStreamSubmit STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; }; typedef IIrpStreamSubmit *PIRPSTREAMSUBMIT; #define IMP_IIrpStreamSubmit\ IMP_IKsShellTransport;\ STDMETHODIMP_(NTSTATUS)\ GetPosition\ ( IN OUT PIRPSTREAM_POSITION pIrpStreamPosition\ ) /***************************************************************************** * IRPSTREAMPACKETINFO ***************************************************************************** * Structure for information regarding an IrpStream packet. */ typedef struct { KSSTREAM_HEADER Header; ULONGLONG InputPosition; ULONGLONG OutputPosition; ULONG CurrentOffset; } IRPSTREAMPACKETINFO, *PIRPSTREAMPACKETINFO; /***************************************************************************** * IIrpStream ***************************************************************************** * Irp stream primary interface. */ DECLARE_INTERFACE_(IIrpStream,IIrpStreamSubmit) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown // for IKsShellTransport STDMETHOD_(NTSTATUS,TransferKsIrp)(THIS_ IN PIRP Irp, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,Connect)(THIS_ IN PIKSSHELLTRANSPORT NewTransport OPTIONAL, OUT PIKSSHELLTRANSPORT *OldTransport OPTIONAL, IN KSPIN_DATAFLOW DataFlow ) PURE; STDMETHOD_(NTSTATUS,SetDeviceState)(THIS_ IN KSSTATE NewState, IN KSSTATE OldState, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,SetResetState)(THIS_ IN KSRESET ksReset, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; #if DBG STDMETHOD_(void,DbgRollCall)(THIS_ IN ULONG NameMaxSize, OUT PCHAR Name, OUT PIKSSHELLTRANSPORT* NextTransport, OUT PIKSSHELLTRANSPORT* PrevTransport ) PURE; #endif // for IIrpStreamSubmit STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; // for IIrpStream STDMETHOD_(NTSTATUS,Init) ( THIS_ IN BOOLEAN WriteOperation, IN PKSPIN_CONNECT PinConnect, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PADAPTER_OBJECT AdapterObject OPTIONAL ) PURE; STDMETHOD_(void,CancelAllIrps) ( THIS_ IN BOOL ClearPositionCounters ) PURE; STDMETHOD_(void,TerminatePacket) ( THIS ) PURE; STDMETHOD_(NTSTATUS,ChangeOptionsFlags) ( THIS_ IN ULONG MappingOrMask, IN ULONG MappingAndMask, IN ULONG UnmappingOrMask, IN ULONG UnmappingAndMask ) PURE; STDMETHOD_(NTSTATUS,GetPacketInfo) ( THIS_ OUT PIRPSTREAMPACKETINFO Mapping OPTIONAL, OUT PIRPSTREAMPACKETINFO Unmapping OPTIONAL ) PURE; STDMETHOD_(NTSTATUS,SetPacketOffsets) ( THIS_ IN ULONG MappingOffset, IN ULONG UnmappingOffset ) PURE; }; typedef IIrpStream *PIRPSTREAM; #define IMP_IIrpStream_\ STDMETHODIMP_(NTSTATUS)\ Init\ ( IN BOOLEAN WriteOperation,\ IN PKSPIN_CONNECT PinConnect,\ IN PDEVICE_OBJECT DeviceObject OPTIONAL,\ IN PADAPTER_OBJECT AdapterObject OPTIONAL\ );\ STDMETHODIMP_(void)\ CancelAllIrps\ ( IN BOOL ClearPositionCounters\ );\ STDMETHODIMP_(void)\ TerminatePacket\ ( void\ );\ STDMETHODIMP_(NTSTATUS)\ ChangeOptionsFlags\ ( IN ULONG MappingOrMask,\ IN ULONG MappingAndMask,\ IN ULONG UnmappingOrMask,\ IN ULONG UnmappingAndMask\ );\ STDMETHODIMP_(NTSTATUS)\ GetPacketInfo\ ( OUT PIRPSTREAMPACKETINFO Mapping OPTIONAL,\ OUT PIRPSTREAMPACKETINFO Unmapping OPTIONAL\ );\ STDMETHODIMP_(NTSTATUS)\ SetPacketOffsets\ ( IN ULONG MappingOffset,\ IN ULONG UnmappingOffset\ ) #define IMP_IIrpStream\ IMP_IIrpStreamSubmit;\ IMP_IIrpStream_ /***************************************************************************** * IIrpStreamVirtual ***************************************************************************** * Irp stream virtual mapping interface. */ DECLARE_INTERFACE_(IIrpStreamVirtual,IIrpStream) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown // for IKsShellTransport STDMETHOD_(NTSTATUS,TransferKsIrp)(THIS_ IN PIRP Irp, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,Connect)(THIS_ IN PIKSSHELLTRANSPORT NewTransport OPTIONAL, OUT PIKSSHELLTRANSPORT *OldTransport OPTIONAL, IN KSPIN_DATAFLOW DataFlow ) PURE; STDMETHOD_(NTSTATUS,SetDeviceState)(THIS_ IN KSSTATE NewState, IN KSSTATE OldState, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,SetResetState)(THIS_ IN KSRESET ksReset, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; #if DBG STDMETHOD_(void,DbgRollCall)(THIS_ IN ULONG NameMaxSize, OUT PCHAR Name, OUT PIKSSHELLTRANSPORT* NextTransport, OUT PIKSSHELLTRANSPORT* PrevTransport ) PURE; #endif // for IIrpStreamSubmit STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; // for IIrpStream STDMETHOD_(NTSTATUS,Init) ( THIS_ IN BOOLEAN WriteOperation, IN PKSPIN_CONNECT PinConnect, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PADAPTER_OBJECT AdapterObject OPTIONAL ) PURE; STDMETHOD_(void,CancelAllIrps) ( THIS_ IN BOOL ClearPositionCounters ) PURE; STDMETHOD_(void,TerminatePacket) ( THIS ) PURE; STDMETHOD_(NTSTATUS,ChangeOptionsFlags) ( THIS_ IN ULONG MappingOrMask, IN ULONG MappingAndMask, IN ULONG UnmappingOrMask, IN ULONG UnmappingAndMask ) PURE; STDMETHOD_(NTSTATUS,GetPacketInfo) ( THIS_ OUT PIRPSTREAMPACKETINFO Mapping OPTIONAL, OUT PIRPSTREAMPACKETINFO Unmapping OPTIONAL ) PURE; STDMETHOD_(NTSTATUS,SetPacketOffsets) ( THIS_ IN ULONG MappingOffset, IN ULONG UnmappingOffset ) PURE; // For IIrpStreamVirtual STDMETHOD_(void,RegisterNotifySink) ( THIS_ IN PIRPSTREAMNOTIFY NotificationSink OPTIONAL ) PURE; STDMETHOD_(void,GetLockedRegion) ( THIS_ OUT PULONG ByteCount, OUT PVOID * SystemAddress ) PURE; STDMETHOD_(void,ReleaseLockedRegion) ( THIS_ IN ULONG ByteCount ) PURE; STDMETHOD_(void,Copy) ( THIS_ IN BOOLEAN WriteOperation, IN ULONG RequestedSize, OUT PULONG ActualSize, IN OUT PVOID Buffer ) PURE; STDMETHOD_(void,Complete) ( THIS_ IN ULONG RequestedSize, OUT PULONG ActualSize ) PURE; STDMETHOD_(PKSPIN_LOCK,GetIrpStreamPositionLock) ( THIS ) PURE; }; typedef IIrpStreamVirtual *PIRPSTREAMVIRTUAL; #define IMP_IIrpStreamVirtual_\ STDMETHODIMP_(void)\ RegisterNotifySink\ ( IN PIRPSTREAMNOTIFY NotificationSink OPTIONAL\ );\ STDMETHODIMP_(void)\ GetLockedRegion\ ( OUT PULONG ByteCount,\ OUT PVOID * SystemAddress\ );\ STDMETHODIMP_(void)\ ReleaseLockedRegion\ ( IN ULONG ByteCount\ );\ STDMETHODIMP_(void)\ Copy\ ( IN BOOLEAN WriteOperation,\ IN ULONG RequestedSize,\ OUT PULONG ActualSize,\ IN OUT PVOID Buffer\ );\ STDMETHODIMP_(void)\ Complete\ ( IN ULONG RequestedSize,\ OUT PULONG ActualSize\ );\ STDMETHODIMP_(PKSPIN_LOCK)\ GetIrpStreamPositionLock\ (\ ) #define IMP_IIrpStreamVirtual\ IMP_IIrpStream;\ IMP_IIrpStreamVirtual_ /***************************************************************************** * IIrpStreamPhysical ***************************************************************************** * Irp stream physical mapping interface. */ DECLARE_INTERFACE_(IIrpStreamPhysical,IIrpStream) { DEFINE_ABSTRACT_UNKNOWN() // For IUnknown // for IKsShellTransport STDMETHOD_(NTSTATUS,TransferKsIrp)(THIS_ IN PIRP Irp, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,Connect)(THIS_ IN PIKSSHELLTRANSPORT NewTransport OPTIONAL, OUT PIKSSHELLTRANSPORT *OldTransport OPTIONAL, IN KSPIN_DATAFLOW DataFlow ) PURE; STDMETHOD_(NTSTATUS,SetDeviceState)(THIS_ IN KSSTATE NewState, IN KSSTATE OldState, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; STDMETHOD_(void,SetResetState)(THIS_ IN KSRESET ksReset, OUT PIKSSHELLTRANSPORT* NextTransport ) PURE; #if DBG STDMETHOD_(void,DbgRollCall)(THIS_ IN ULONG NameMaxSize, OUT PCHAR Name, OUT PIKSSHELLTRANSPORT* NextTransport, OUT PIKSSHELLTRANSPORT* PrevTransport ) PURE; #endif // for IIrpStreamSubmit STDMETHOD_(NTSTATUS,GetPosition) ( THIS_ IN OUT PIRPSTREAM_POSITION pIrpStreamPosition ) PURE; // for IIrpStream STDMETHOD_(NTSTATUS,Init) ( THIS_ IN BOOLEAN WriteOperation, IN PKSPIN_CONNECT PinConnect, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PADAPTER_OBJECT AdapterObject OPTIONAL ) PURE; STDMETHOD_(void,CancelAllIrps) ( THIS_ IN BOOL ClearPositionCounters ) PURE; STDMETHOD_(void,TerminatePacket) ( THIS ) PURE; STDMETHOD_(NTSTATUS,ChangeOptionsFlags) ( THIS_ IN ULONG MappingOrMask, IN ULONG MappingAndMask, IN ULONG UnmappingOrMask, IN ULONG UnmappingAndMask ) PURE; STDMETHOD_(NTSTATUS,GetPacketInfo) ( THIS_ OUT PIRPSTREAMPACKETINFO Mapping OPTIONAL, OUT PIRPSTREAMPACKETINFO Unmapping OPTIONAL ) PURE; STDMETHOD_(NTSTATUS,SetPacketOffsets) ( THIS_ IN ULONG MappingOffset, IN ULONG UnmappingOffset ) PURE; // For IIrpStreamPhysical STDMETHOD_(void,RegisterPhysicalNotifySink) ( THIS_ IN PIRPSTREAMNOTIFYPHYSICAL NotificationSink OPTIONAL ) PURE; STDMETHOD_(void,GetMapping) ( THIS_ IN PVOID Tag, OUT PPHYSICAL_ADDRESS PhysicalAddress, OUT PVOID * VirtualAddress, OUT PULONG ByteCount, OUT PULONG Flags #define MAPPING_FLAG_END_OF_PACKET 0x00000001 ) PURE; STDMETHOD_(void,ReleaseMapping) ( THIS_ IN PVOID Tag ) PURE; }; typedef IIrpStreamPhysical *PIRPSTREAMPHYSICAL; #define IMP_IIrpStreamPhysical_\ STDMETHODIMP_(void)\ RegisterPhysicalNotifySink\ ( IN PIRPSTREAMNOTIFYPHYSICAL NotificationSink OPTIONAL\ );\ STDMETHODIMP_(void)\ GetMapping\ ( IN PVOID Tag,\ OUT PPHYSICAL_ADDRESS PhysicalAddress,\ OUT PVOID * VirtualAddress,\ OUT PULONG ByteCount,\ OUT PULONG Flags\ );\ STDMETHODIMP_(void)\ ReleaseMapping\ ( IN PVOID Tag\ ) #define IMP_IIrpStreamPhysical\ IMP_IIrpStream;\ IMP_IIrpStreamPhysical_ #define IMP_IPortClsVersion \ STDMETHODIMP_(DWORD) GetVersion() { return kVersionWinXPServer; }; /***************************************************************************** * PcCreateSubdeviceDescriptor() ***************************************************************************** * Creates a subdevice descriptor. */ PORTCLASSAPI NTSTATUS NTAPI PcCreateSubdeviceDescriptor ( IN PPCFILTER_DESCRIPTOR FilterDescriptor, IN ULONG CategoriesCount, IN GUID * Categories, IN ULONG StreamInterfacesCount, IN PKSPIN_INTERFACE StreamInterfaces, IN ULONG FilterPropertySetCount, IN PKSPROPERTY_SET FilterPropertySets, IN ULONG FilterEventSetCount, IN PKSEVENT_SET FilterEventSets, IN ULONG PinPropertySetCount, IN PKSPROPERTY_SET PinPropertySets, IN ULONG PinEventSetCount, IN PKSEVENT_SET PinEventSets, OUT PSUBDEVICE_DESCRIPTOR * OutDescriptor ); /***************************************************************************** * PcDeleteSubdeviceDescriptor() ***************************************************************************** * Deletes a subdevice descriptor. */ PORTCLASSAPI void NTAPI PcDeleteSubdeviceDescriptor ( IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor ); /***************************************************************************** * PcValidateConnectRequest() ***************************************************************************** * Validate attempt to create a pin. */ PORTCLASSAPI NTSTATUS NTAPI PcValidateConnectRequest ( IN PIRP pIrp, IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, OUT PKSPIN_CONNECT * ppKsPinConnect ); /***************************************************************************** * PcValidatePinCount() ***************************************************************************** * Validate pin count. */ PORTCLASSAPI NTSTATUS NTAPI PcValidatePinCount ( IN ULONG ulPinId, IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, IN PULONG pulPinInstanceCounts ); /***************************************************************************** * PcTerminateConnection() ***************************************************************************** * Decrement instance counts associated with a pin. */ PORTCLASSAPI void NTAPI PcTerminateConnection ( IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, IN PULONG pulPinInstanceCounts, IN ULONG ulPinId ); /***************************************************************************** * PcVerifyFilterIsReady() ***************************************************************************** * Verify necessary pins are connected. */ PORTCLASSAPI NTSTATUS NTAPI PcVerifyFilterIsReady ( IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, IN PULONG pulPinInstanceCounts ); /***************************************************************************** * PcAddToPropertyTable() ***************************************************************************** * Adds a PROPERTYITEM property table to a PROPERTY_TABLE structure. */ PORTCLASSAPI NTSTATUS NTAPI PcAddToPropertyTable ( IN OUT PPROPERTY_TABLE PropertyTable, IN ULONG PropertyItemCount, IN const PCPROPERTY_ITEM * PropertyItems, IN ULONG PropertyItemSize, IN BOOLEAN NodeTable ); /***************************************************************************** * PcFreePropertyTable() ***************************************************************************** * Frees allocated memory in a PROPERTY_TABLE structure. */ PORTCLASSAPI void NTAPI PcFreePropertyTable ( IN PPROPERTY_TABLE PropertyTable ); /***************************************************************************** * PcHandlePropertyWithTable() ***************************************************************************** * Uses a property table to handle a property request IOCTL. */ PORTCLASSAPI NTSTATUS NTAPI PcHandlePropertyWithTable ( IN PIRP pIrp, IN ULONG ulPropertySetsCount, IN const KSPROPERTY_SET* pKsPropertySet, IN PPROPERTY_CONTEXT pPropertyContext ); /***************************************************************************** * PcPinPropertyHandler() ***************************************************************************** * Property handler for pin properties on the filter. */ PORTCLASSAPI NTSTATUS NTAPI PcPinPropertyHandler ( IN PIRP pIrp, IN PKSP_PIN pKsPPin, IN OUT PVOID pvData ); /***************************************************************************** * PcAddToEventTable() ***************************************************************************** * Adds a EVENTITEM event table to an EVENT_TABLE structure. */ PORTCLASSAPI NTSTATUS NTAPI PcAddToEventTable ( IN OUT PEVENT_TABLE EventTable, IN ULONG EventItemCount, IN const PCEVENT_ITEM * EventItems, IN ULONG EventItemSize, IN BOOLEAN NodeTable ); /***************************************************************************** * PcFreeEventTable() ***************************************************************************** * Frees allocated memory in an EVENT_TABLE structure. */ PORTCLASSAPI void NTAPI PcFreeEventTable ( IN PEVENT_TABLE EventTable ); /***************************************************************************** * PcHandleEnableEventWithTable() ***************************************************************************** * Uses an event table to handle a KS enable event IOCTL. */ PORTCLASSAPI NTSTATUS NTAPI PcHandleEnableEventWithTable ( IN PIRP pIrp, IN PEVENT_CONTEXT pContext ); /***************************************************************************** * PcHandleDisableEventWithTable() ***************************************************************************** * Uses an event table to handle a KS disable event IOCTL. */ PORTCLASSAPI NTSTATUS NTAPI PcHandleDisableEventWithTable ( IN PIRP pIrp, IN PEVENT_CONTEXT pContext ); /***************************************************************************** * PcGenerateEventList() ***************************************************************************** * Walks an event list and generates desired events. */ PORTCLASSAPI void NTAPI PcGenerateEventList ( IN PINTERLOCKED_LIST EventList, IN GUID* Set OPTIONAL, IN ULONG EventId, IN BOOL PinEvent, IN ULONG PinId, IN BOOL NodeEvent, IN ULONG NodeId ); /***************************************************************************** * PcGenerateEventDeferredRoutine() ***************************************************************************** * This DPC routine is used when GenerateEventList is called at greater * that DISPATCH_LEVEL. */ PORTCLASSAPI void NTAPI PcGenerateEventDeferredRoutine ( IN PKDPC Dpc, IN PVOID DeferredContext, // PEVENT_DPC_CONTEXT IN PVOID SystemArgument1, // PINTERLOCKED_LIST IN PVOID SystemArgument2 ); /***************************************************************************** * PcNewIrpStreamVirtual() ***************************************************************************** * Creates and initializes an IrpStream object with a virtual access * interface. */ PORTCLASSAPI NTSTATUS NTAPI PcNewIrpStreamVirtual ( OUT PIRPSTREAMVIRTUAL * OutIrpStreamVirtual, IN PUNKNOWN OuterUnknown OPTIONAL, IN BOOLEAN WriteOperation, IN PKSPIN_CONNECT PinConnect, IN PDEVICE_OBJECT DeviceObject ); /***************************************************************************** * PcNewIrpStreamPhysical() ***************************************************************************** * Creates and initializes an IrpStream object with a physical access * interface. */ PORTCLASSAPI NTSTATUS NTAPI PcNewIrpStreamPhysical ( OUT PIRPSTREAMPHYSICAL * OutIrpStreamPhysical, IN PUNKNOWN OuterUnknown OPTIONAL, IN BOOLEAN WriteOperation, IN PKSPIN_CONNECT PinConnect, IN PDEVICE_OBJECT DeviceObject, IN PADAPTER_OBJECT AdapterObject ); /***************************************************************************** * PcDmaSlaveDescription() ***************************************************************************** * Fills in a DMA device description for a slave device based on a resource. */ PORTCLASSAPI NTSTATUS NTAPI PcDmaSlaveDescription ( IN PRESOURCELIST ResourceList, IN ULONG ResourceIndex, IN BOOLEAN DemandMode, IN BOOLEAN AutoInitialize, IN DMA_SPEED DmaSpeed, IN ULONG MaximumLength, IN ULONG DmaPort, OUT PDEVICE_DESCRIPTION DeviceDescription ); /***************************************************************************** * PcDmaMasterDescription() ***************************************************************************** * Fills in a DMA device description for a master device based on a resource * list. */ PORTCLASSAPI void NTAPI PcDmaMasterDescription ( IN PRESOURCELIST ResourceList OPTIONAL, IN BOOLEAN ScatterGather, IN BOOLEAN Dma32BitAddresses, IN BOOLEAN IgnoreCount, IN BOOLEAN Dma64BitAddresses, IN DMA_WIDTH DmaWidth, IN DMA_SPEED DmaSpeed, IN ULONG MaximumLength, IN ULONG DmaPort, OUT PDEVICE_DESCRIPTION DeviceDescription ); /***************************************************************************** * PcCaptureFormat() ***************************************************************************** * Capture a data format in an allocated buffer, possibly changing offensive * formats. */ PORTCLASSAPI NTSTATUS NTAPI PcCaptureFormat ( OUT PKSDATAFORMAT * ppKsDataFormatOut, IN PKSDATAFORMAT pKsDataFormatIn, IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, IN ULONG ulPinId ); /***************************************************************************** * PcAcquireFormatResources() ***************************************************************************** * Acquire resources specified in a format. */ PORTCLASSAPI void NTAPI PcAcquireFormatResources ( IN PKSDATAFORMAT pKsDataFormatIn, IN PSUBDEVICE_DESCRIPTOR pSubdeviceDescriptor, IN ULONG ulPinId, IN PPROPERTY_CONTEXT pPropertyContext ); NTSTATUS KspShellCreateRequestor( OUT PIKSSHELLTRANSPORT* TransportInterface, IN ULONG ProbeFlags, IN ULONG StreamHeaderSize OPTIONAL, IN ULONG FrameSize, IN ULONG FrameCount, IN PDEVICE_OBJECT NextDeviceObject, IN PFILE_OBJECT AllocatorFileObject OPTIONAL ); #endif