#define ENABLE_STREAM_CLASS_AS_ALLOCATOR #define ENABLE_KS_METHODS #define ENABLE_MULTIPLE_FILTER_TYPES 1 // enable/disable support for multiple // filters on a single hardware/driver. // // when the code for the method support is finally done, STRMINI.H will have // to be checked into the tree also, in the include directory. // /*++ Copyright (c) 1996 Microsoft Corporation Module Name: codcls.h Abstract: This file defines the necessary structures, defines, and functions for the common CODEC class driver. Author: Bill Parry (billpa) Environment: Kernel mode only Revision History: --*/ #ifndef _STREAMCLASS_H #define _STREAMCLASS_H #include "messages.h" #include "strmini.h" #include // // I don't want to try to include cfgmgr32 just for this. // #ifndef MAX_DEVICE_ID_LEN #define MAX_DEVICE_ID_LEN 200 #endif // MAX_DEVICE_ID_LEN #ifndef _WIN64 // 4 byte alignment causes Alignment Fault for spinlock. #pragma pack(4) #endif #if ENABLE_MULTIPLE_FILTER_TYPES #define IF_MF( s ) s #define IF_MFS( s ) { s } #define IFN_MF( s ) #define IFN_MFS( s ) #define MFTRACE( s ) StreamClassDebugPrint s #else #define IF_MF( s ) #define IF_MFS( s ) #define IFN_MF( s ) s #define IFN_MFS( s ) { s } #define MFTRACE( s ) #endif #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR // // this is a debug string header // #define STR_MODULENAME "STREAM.SYS:" // // define some data allocation tags // #define STREAMCLASS_TAG_STREAMHEADER 'pdCS' #define STREAMCLASS_TAG_FILTERCONNECTION '10CS' #define STREAMCLASS_TAG_DATAFORMAT '20CS' #define ID_DATA_DESTINATION_PIN 0 #define ID_DATA_SOURCE_PIN 1 #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR #define MAX_STRING_LENGTH 256 #define TRAP DEBUG_BREAKPOINT() // // the following macros are used to correctly synchronize class driver entry // points called by the minidriver. // #define BEGIN_MINIDRIVER_STREAM_CALLIN(DeviceExtension, Irql) { \ DeviceExtension->BeginMinidriverCallin(DeviceExtension, \ Irql); \ ASSERT(++DeviceExtension->LowerApiThreads == 1);\ } #define END_MINIDRIVER_STREAM_CALLIN(StreamObject, Irql) { \ ASSERT(--DeviceExtension->LowerApiThreads == 0);\ DeviceExtension->EndMinidriverStreamCallin(StreamObject, \ Irql); \ } #define BEGIN_MINIDRIVER_DEVICE_CALLIN(DeviceExtension, Irql) { \ DeviceExtension->BeginMinidriverCallin(DeviceExtension, \ Irql); \ ASSERT(++DeviceExtension->LowerApiThreads == 1);\ } #define END_MINIDRIVER_DEVICE_CALLIN(DeviceExtension, Irql) { \ ASSERT(--DeviceExtension->LowerApiThreads == 0);\ DeviceExtension->EndMinidriverDeviceCallin(DeviceExtension, \ Irql); \ } // // The following flags should not be cleared from the interrupt data structure // by SCGetInterruptState. // #define STREAM_FLAGS_INTERRUPT_FLAG_MASK 0 // // Device Extension flags follow - PASSIVE LEVEL ACCESS ONLY!!!!!! // // // Indicates that the PNP start function has been received for the device. // #define DEVICE_FLAGS_PNP_STARTED 0x00001 // // Indicates that this device is a child device (PDO) // #define DEVICE_FLAGS_CHILD 0x0002 // // indicates that the device has been removed // #define DEVICE_FLAGS_DEVICE_INACCESSIBLE 0x00100 // // debug flag indicates that we've warned of too many low pri calls // #define DEVICE_FLAGS_PRI_WARN_GIVEN 0x00200 // // flag indicates that we've received an NT style surprise remove call // #define DEVICE_FLAGS_SURPRISE_REMOVE_RECEIVED 0x00400 // // flag indicated that a Child device ( PDO ) has received a remove // #define DEVICE_FLAGS_CHILD_MARK_DELETE 0x00800 // // flag indicates (FDO) has enum children from registry // #define DEVICE_FLAGS_CHILDREN_ENUMED 0x01000 // // device registry flags follow // // // page out the driver when not opened // #define DEVICE_REG_FL_PAGE_CLOSED 0x00000001 // // page out the driver when opened but idle // #define DEVICE_REG_FL_PAGE_IDLE 0x00000002 // // power down the device when not opened // #define DEVICE_REG_FL_POWER_DOWN_CLOSED 0x00000004 // // don't suspend if any pins are running // #define DEVICE_REG_FL_NO_SUSPEND_IF_RUNNING 0x00000008 // // This driver uses SWEnum to load, which means it is a kernel mode // streaming driver that has no hardware associated with it. We need to // AddRef/DeRef this driver special. // #define DRIVER_USES_SWENUM_TO_LOAD 0x00000010 // // This flag indicates that the dirver is OK for system power to go to // hibernation, even the driver does not process/support the irp_mn_query_power // for system power hinbernation. // #define DEVICE_REG_FL_OK_TO_HIBERNATE 0x00000020 // // The following flags should not be cleared from the interrupt data structure // by SCGetInterruptState. // #define DEVICE_FLAGS_INTERRUPT_FLAG_MASK 0 // // Interrupt flags follow. // // // Indicates that StreamClassCompletionDpc needs to be run. This is set when // A minidriver makes a request which must be done at DPC and is cleared when // when the request information is gotten by MpGetInterruptState. // #define INTERRUPT_FLAGS_NOTIFICATION_REQUIRED 0x00001 // // Indicates the minidriver is wants a timer request. Set by // StreamClassNotification and cleared by MpGetInterruptState. This flag is // stored in the interrupt data structure. The timer request parameters are // stored in the interrupt data structure. // #define INTERRUPT_FLAGS_TIMER_CALL_REQUEST 0x00002 // // Indicates the minidriver is wants a priority change. Set by // StreamClassRequestNewPriority and cleared by SCGetInterruptState. This flag // is stored in the interrupt data structure. The timer request parameters are // stored in the interrupt data structure. // #define INTERRUPT_FLAGS_PRIORITY_CHANGE_REQUEST 0x00004 // // Indicates that the PNP stop function has been received for the device. // #define INTERRUPT_FLAGS_LOG_ERROR 0x00008 // // Indicates that the clock is beinq queried. // #define INTERRUPT_FLAGS_CLOCK_QUERY_REQUEST 0x00010 // // Indicates that the streams need to be rescanned. // #define INTERRUPT_FLAGS_NEED_STREAM_RESCAN 0x00020 // // Pointer to the synchronize execution routine. // typedef BOOLEAN (__stdcall * PSYNCHRONIZE_ROUTINE) ( IN PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext); // // Pointer to the begin minidriver callin routine. // typedef VOID (__stdcall * PBEGIN_CALLIN_ROUTINE) ( IN struct _DEVICE_EXTENSION * DeviceExtension, IN PKIRQL Irql ); // // Pointer to the end minidriver callin routine. // typedef VOID (__stdcall * PEND_DEVICE_CALLIN_ROUTINE) ( IN struct _DEVICE_EXTENSION * DeviceExtension, IN PKIRQL Irql ); typedef VOID (__stdcall * PEND_STREAM_CALLIN_ROUTINE) ( IN struct _STREAM_OBJECT * StreamObject, IN PKIRQL Irql ); // // Queue link for mapped addresses stored for unmapping. // typedef struct _MAPPED_ADDRESS { struct _MAPPED_ADDRESS *NextMappedAddress; PVOID MappedAddress; ULONG NumberOfBytes; LARGE_INTEGER IoAddress; ULONG BusNumber; } MAPPED_ADDRESS, *PMAPPED_ADDRESS; // // error log entry definition // typedef struct _ERROR_LOG_ENTRY { NTSTATUS ErrorCode; // error code ULONG SequenceNumber; // request sequence number ULONG UniqueId; // uniqe ID for the error } ERROR_LOG_ENTRY, *PERROR_LOG_ENTRY; // // callback procedure definition // typedef NTSTATUS (*PSTREAM_CALLBACK_PROCEDURE) ( IN PVOID SRB ); typedef VOID (*PSTREAM_ASYNC_CALLBACK_PROCEDURE) ( IN struct _STREAM_REQUEST_BLOCK *SRB ); // // STREAM request block // typedef struct _STREAM_REQUEST_BLOCK { HW_STREAM_REQUEST_BLOCK HwSRB; ULONG Flags; ULONG SequenceNumber; ULONG ExtensionLength; PMDL Mdl; PVOID MapRegisterBase; PHYSICAL_ADDRESS PhysicalAddress; ULONG Length; PSTREAM_ASYNC_CALLBACK_PROCEDURE Callback; LIST_ENTRY SRBListEntry; KEVENT Event; ULONG StreamHeaderSize; BOOLEAN DoNotCallBack; KEVENT DmaEvent; BOOLEAN bMemPtrValid; PVOID *pMemPtrArray; } STREAM_REQUEST_BLOCK, *PSTREAM_REQUEST_BLOCK; // // SRB flags (not to be confused with the HW SRB flags) // #define SRB_FLAGS_IS_ACTIVE 0x00000001 // // define the minidriver information structure // typedef struct _MINIDRIVER_INFORMATION { HW_INITIALIZATION_DATA HwInitData; ULONG Flags; KEVENT ControlEvent; ULONG UseCount; ULONG OpenCount; } MINIDRIVER_INFORMATION, *PMINIDRIVER_INFORMATION; // // flags for minidriver information Flags field above // // // indicates that the driver may not be paged out // #define DRIVER_FLAGS_NO_PAGEOUT 0x01 // // indicates that the driver has been paged out // #define DRIVER_FLAGS_PAGED_OUT 0x02 // // pin info not contained in the pin description // typedef struct _ADDITIONAL_PIN_INFO { ULONG CurrentInstances; ULONG MaxInstances; // NextFileObject must be per instance, i.e. can't be here. // Move to streamobject #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR //PFILE_OBJECT NextFileObject; // The chained file object #endif ULONG Reserved; } ADDITIONAL_PIN_INFO, *PADDITIONAL_PIN_INFO; // // Define data storage for access at interrupt Irql. // typedef struct _INTERRUPT_DATA { // // interrupt flags // ULONG Flags; ERROR_LOG_ENTRY LogEntry; // // List head for singlely linked list of complete IRPs. // PHW_STREAM_REQUEST_BLOCK CompletedSRB; // // Minidriver timer request routine. // PHW_TIMER_ROUTINE HwTimerRoutine; // // Mindriver timer request time in micro seconds. // ULONG HwTimerValue; PVOID HwTimerContext; // // Mindriver priority change routine. // PHW_PRIORITY_ROUTINE HwPriorityRoutine; // // Mindriver priority change level. // STREAM_PRIORITY HwPriorityLevel; PVOID HwPriorityContext; PHW_QUERY_CLOCK_ROUTINE HwQueryClockRoutine; TIME_FUNCTION HwQueryClockFunction; } INTERRUPT_DATA, *PINTERRUPT_DATA; // // object common to both stream and filter instances // typedef struct _COMMON_OBJECT { PVOID DeviceHeader; ULONG Cookie; #ifdef _WIN64 ULONG Alignment; #endif // _WIN64 INTERRUPT_DATA InterruptData; PHW_TIMER_ROUTINE HwTimerRoutine; // Timer request routine PVOID HwTimerContext; KTIMER MiniDriverTimer; // Miniclass timer object. KDPC MiniDriverTimerDpc; // Miniclass DPC for timer object. WORK_QUEUE_ITEM WorkItem; #if DBG BOOLEAN PriorityWorkItemScheduled; #endif } COMMON_OBJECT, *PCOMMON_OBJECT; // // stream name info // typedef struct _STREAM_OPEN_INFORMATION { WCHAR Guid[11]; ULONG Instance; } STREAM_OPEN_INFORMATION, *PSTREAM_OPEN_INFORMATION; // // clock instance structure // typedef struct _CLOCK_INSTANCE { PVOID DeviceHeader; PFILE_OBJECT ParentFileObject; //PFILE_OBJECT ClockFileObject; johnlee struct _STREAM_OBJECT *StreamObject; } CLOCK_INSTANCE, *PCLOCK_INSTANCE; // // master clock info structure // typedef struct _MASTER_CLOCK_INFO { PFILE_OBJECT ClockFileObject; KSCLOCK_FUNCTIONTABLE FunctionTable; } MASTER_CLOCK_INFO, *PMASTER_CLOCK_INFO; #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR typedef enum { PinStopped, PinStopPending, PinPrepared, PinRunning } PIN_STATE; typedef enum { IrpSource, IrpSink, } PIN_TYPE; #define READ 0 #define WRITE 1 typedef struct _QUEUE { KSPIN_LOCK QueueLock; LIST_ENTRY ActiveQueue; WORK_QUEUE_ITEM WorkItem; BOOL WorkItemQueued; } QUEUE, PQUEUE; #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR // // TODO: WORKITEM: remove this once KS can multiplex cleanup calls. // #define STREAM_OBJECT_COOKIE 0xd73afe3f typedef struct _COOKIE_CHECK { PVOID Header; ULONG PossibleCookie; } COOKIE_CHECK, *PCOOKIE_CHECK; // // stream object definition // typedef struct _STREAM_OBJECT { COMMON_OBJECT ComObj; PFILE_OBJECT FilterFileObject; PFILE_OBJECT FileObject; struct _FILTER_INSTANCE *FilterInstance; HW_STREAM_OBJECT HwStreamObject; LIST_ENTRY DataPendingQueue; LIST_ENTRY ControlPendingQueue; LIST_ENTRY OutstandingQueue; LIST_ENTRY NextStream; LIST_ENTRY NotifyList; struct _DEVICE_EXTENSION *DeviceExtension; struct _STREAM_OBJECT *NextNeedyStream; PKSPROPERTY_SET PropertyInfo; ULONG PropInfoSize; PKSEVENT_SET EventInfo; ULONG EventInfoCount; KEVENT ControlSetMasterClock; // to serialize SetMasterClock KSPIN_LOCK LockUseMasterClock; // control use of MasterClockInfo PMASTER_CLOCK_INFO MasterClockInfo; PCLOCK_INSTANCE ClockInstance; PKSPROPERTY_SET ConstructedPropertyInfo; ULONG ConstructedPropInfoSize; KSSTATE CurrentState; BOOLEAN ReadyForNextControlReq; BOOLEAN ReadyForNextDataReq; BOOLEAN OnNeedyQueue; BOOLEAN InFlush; #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR PIN_STATE PinState; PIN_TYPE PinType; // IrpSource or IrpSink PFILE_OBJECT AllocatorFileObject; PFILE_OBJECT NextFileObject; LIST_ENTRY FreeQueue; KSPIN_LOCK FreeQueueLock; KEVENT StopEvent; PKSDATAFORMAT DataFormat; ULONG PinId; HANDLE PinToHandle; KSALLOCATOR_FRAMING Framing; BOOL EndOfStream; QUEUE Queues[2]; #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR #ifdef ENABLE_KS_METHODS PKSMETHOD_SET MethodInfo; ULONG MethodInfoSize; #endif BOOLEAN StandardTransport; // // This keeps track of the number of frames in circulation between the // output and the downstream input. It is a total count of those frames // queued to EITHER pin or in a pending list OTHER THAN THE FREE LIST // on the output pin. // LONG QueuedFramesPlusOne; } STREAM_OBJECT, *PSTREAM_OBJECT; #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR // // NOTE! This is the minimal structure size for STREAM_HEADER_EX. // The connected pins are queried for the actual header size (including // whatever extended header size is required). // typedef struct _STREAM_HEADER_EX *PSTREAM_HEADER_EX; typedef struct _STREAM_HEADER_EX { ULONG WhichQueue; ULONG Id; IO_STATUS_BLOCK IoStatus; KEVENT CompletionEvent; LIST_ENTRY ListEntry; ULONG ReferenceCount; PFILE_OBJECT OwnerFileObject; PFILE_OBJECT NextFileObject; // next one to stream to. #if (DBG) PVOID Data; ULONG OnFreeList; ULONG OnActiveList; #else ULONG Reserved; #endif KSSTREAM_HEADER Header; } STREAM_HEADER_EX, *PSTREAM_HEADER_EX; #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR // // struct for retrieving the interrupt data // typedef struct _INTERRUPT_CONTEXT { PSTREAM_OBJECT NeedyStream; struct _DEVICE_EXTENSION *DeviceExtension; PINTERRUPT_DATA SavedStreamInterruptData; PINTERRUPT_DATA SavedDeviceInterruptData; } INTERRUPT_CONTEXT, *PINTERRUPT_CONTEXT; // // Performance improvement chance - array for stream prop & event pointers // typedef struct _STREAM_ADDITIONAL_INFO { PKSPROPERTY_SET StreamPropertiesArray; PKSEVENT_SET StreamEventsArray; } STREAM_ADDITIONAL_INFO, *PSTREAM_ADDITIONAL_INFO; // // filter instance structure // (right now, this is global across all same filter creates!) // #if ENABLE_MULTIPLE_FILTER_TYPES // // for forward reference in FILTER_INSTANCE // typedef struct _DEVICE_EXTENSION; // // I claim that as it currently stands, 5/17/99 "No multiple instance // mini driver works" because the bug in stream.sys. Therefore, backward // compatibility is only a concern for single instance mini drivers. // // The reason is the implemention following: // FilterDispatchGlobalCreate() // { // ... // if (!DeviceExtension->GlobalFilterInstance) { // // // Status = SCOpenMinidriverInstance(DeviceExtension, // &FilterInstance, // SCGlobalInstanceCallback, // Irp); // ... // if (NT_SUCCESS(Status)) { // ... // DeviceExtension->GlobalFilterInstance = FilterInstance; // ... // } // } // else { // will not call mini drivers // } // } // // At the 2nd call, the FilterInstance will point to the same 1st one. // // We are braching out code here to support Multiple Filters without // disturbing the exisitng support to max the backward compatibilty. // The multiple filter support include 1 type n instances, // and m types p instances. // // MinidriverData->HwInitData. // 1 x 1 FilterInstanceExtensionSize =0 NumNameExtension =0 // 1 x n FilterInstanceExtensionSize!=0 NumNameExtension =0 // m x p FilterInstanceExtensionSize!=0 NumNameExtension!=0 // typedef struct _FILTER_TYPE_INFORMATION { UNICODE_STRING *SymbolicLinks; ULONG LinkNameCount; PHW_STREAM_DESCRIPTOR StreamDescriptor; ULONG Reserved; } FILTER_TYPE_INFO; typedef FILTER_TYPE_INFO *PFILTER_TYPE_INFO; #endif typedef struct _DEVICE_EXTENSION; typedef struct _FILTER_INSTANCE { PVOID DeviceHeader; PDEVICE_OBJECT DeviceObject; LIST_ENTRY NextFilterInstance; // internal linked list of filter I's. LIST_ENTRY FirstStream; PVOID HwInstanceExtension; PADDITIONAL_PIN_INFO PinInstanceInfo; // pointer to array of pins // allocated directly below this // structure. #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR // // Feature work: add per filter filter type when data splitting is enabled! // PKSWORKER WorkerRead; PKSWORKER WorkerWrite; #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR #ifdef ENABLE_KS_METHODS IF_MF( PKSMETHOD_SET DeviceMethodsArray; // from pDevExt ) #endif #define SIGN_FILTER_INSTANCE 'FrtS' //StrF #if ENABLE_MULTIPLE_FILTER_TYPES #define ASSERT_FILTER_INSTANCE(FI) ASSERT((FI)->Signature==SIGN_FILTER_INSTANCE) #else #define ASSERT_FILTER_INSTANCE(FI) #endif IF_MF( ULONG Signature; PKSPIN_DESCRIPTOR PinInformation; // moved from pDevExt //ULONG PinInformationSize; // from pDevExt,not used ULONG NumberOfPins; // from pDevExt PKSEVENT_SET EventInfo; // from pDevExt ULONG EventInfoCount; // from pDevExt LIST_ENTRY NotifyList; // from pDevExt PHW_EVENT_ROUTINE HwEventRoutine; // from pDevExt PKSPROPERTY_SET DevicePropertiesArray; // from pDevExt PSTREAM_ADDITIONAL_INFO StreamPropEventArray; // ditto ULONG Reenumerated; // if 1, StreamDescriptor is newly alloc // need to be freed. Else, it points into // the global one which belong to DevExt. ULONG NeedReenumeration; // requesting reenumeration ULONG StreamDescriptorSize; // the new size for streamdescriptor; struct _DEVICE_EXTENSION *DeviceExtension; PHW_STREAM_DESCRIPTOR StreamDescriptor; ULONG FilterTypeIndex; // // Performance improvement chance. Per filterinstance ControlEvent etc might be // better.For now, let them share ones in DeviceExtension // //KEVENT ControlEvent //PHW_TIMER_ROUTINE HwTimerRoutine; // Timer request routine //PVOID HwTimerContext; //KTIMER MiniDriverTimer; // Miniclass timer object. //KDPC MiniDriverTimerDpc; // Miniclass DPC for timer object. //WORK_QUEUE_ITEM WorkItem; ) // IF_MF } FILTER_INSTANCE, *PFILTER_INSTANCE; // // Per Device data // typedef struct _DEVICE_EXTENSION { COMMON_OBJECT ComObj; ULONG Flags; // per device flags (PD_xx) PDEVICE_OBJECT DeviceObject; // device object PDEVICE_OBJECT AttachedPdo; // device object returned from the attach ULONG RegistryFlags; // registry flags // callback routine on DMA allocate // callback function for // KeSynch execution PKINTERRUPT InterruptObject; // Interrupt object and routine PKSERVICE_ROUTINE InterruptRoutine; PADAPTER_OBJECT DmaAdapterObject; // Dma Adapter information. ULONG NumberOfMapRegisters; // max. number of map registers // for // device PVOID MapRegisterBase; PMINIDRIVER_INFORMATION MinidriverData; // pointer to minidriver data PDEVICE_OBJECT PhysicalDeviceObject; // pointer to PDO for adapter PVOID HwDeviceExtension; // minidriver's device extension PPORT_CONFIGURATION_INFORMATION ConfigurationInformation; // configuration info for adapter PMAPPED_ADDRESS MappedAddressList; // address map list head // // Routine to call to synchronize execution for the minidriver. // PSYNCHRONIZE_ROUTINE SynchronizeExecution; KSPIN_LOCK SpinLock; ULONG SequenceNumber; // offset 0x30 ULONG DmaBufferLength; PHYSICAL_ADDRESS DmaBufferPhysical; PVOID DmaBuffer; LIST_ENTRY PendingQueue; LIST_ENTRY OutstandingQueue; KDPC WorkDpc; IFN_MF( // // Move to FilterInstance for IF_MF // PKSPIN_DESCRIPTOR PinInformation; ULONG PinInformationSize; ULONG NumberOfPins; ) #define SIGN_DEVICE_EXTENSION 'DrtS' //StrD #if ENABLE_MULTIPLE_FILTER_TYPES #define ASSERT_DEVICE_EXTENSION(DE) ASSERT((DE)->Signature==SIGN_DEVICE_EXTENSION) #else #define ASSERT_DEVICE_EXTENSION(DE) #endif ULONG Signature2; LIST_ENTRY FilterInstanceList; ULONG NumberOfOpenInstances; IFN_MF( // // Don't need for IF_MF // PFILTER_INSTANCE GlobalFilterInstance; ULONG NumberOfGlobalInstances; ) struct _STREAM_OBJECT *NeedyStream; PHW_STREAM_DESCRIPTOR StreamDescriptor; KEVENT ControlEvent; KEVENT RemoveEvent; BOOLEAN NoSync; PMINIDRIVER_INFORMATION DriverInfo; PBEGIN_CALLIN_ROUTINE BeginMinidriverCallin; PEND_STREAM_CALLIN_ROUTINE EndMinidriverStreamCallin; PEND_DEVICE_CALLIN_ROUTINE EndMinidriverDeviceCallin; LONG OneBasedIoCount; UNICODE_STRING *SymbolicLinks; DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]; DEVICE_POWER_STATE CurrentPowerState; LIST_ENTRY Children; LIST_ENTRY DeadEventList; WORK_QUEUE_ITEM EventWorkItem; WORK_QUEUE_ITEM RescanWorkItem; WORK_QUEUE_ITEM PowerCompletionWorkItem; // this is used for S Irp, S and D Irps dont exclude between. WORK_QUEUE_ITEM DevIrpCompletionWorkItem; // this is for D Irp as opposed to S Irp which uses above BOOLEAN ReadyForNextReq; BOOLEAN DeadEventItemQueued; IFN_MF( // // move to FilterInstace for MF // PKSEVENT_SET EventInfo; ULONG EventInfoCount; LIST_ENTRY NotifyList; PHW_EVENT_ROUTINE HwEventRoutine; PKSPROPERTY_SET DevicePropertiesArray; PSTREAM_ADDITIONAL_INFO StreamPropEventArray; ) #ifdef ENABLE_KS_METHODS IFN_MF( // // move to FilterInstance for MF PKSMETHOD_SET DeviceMethodsArray; ) #endif IF_MF( ULONG NumberOfNameExtensions; ULONG NumberOfFilterTypes; PKSOBJECT_CREATE_ITEM CreateItems; PFILTER_TYPE_INFO FilterTypeInfos; ULONG Signature; ULONG FilterExtensionSize; ) #if DBG ULONG LowerApiThreads; ULONG NumberOfRequests; ULONG NumberOfLowPriCalls; #endif LIST_ENTRY PendedIrps; KSPIN_LOCK PendedIrpsLock; KSPIN_LOCK PowerLock; SYSTEM_POWER_STATE CurrentSystemState; KEVENT BlockPoweredDownEvent; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; // // debug work item trap structure // #if DBG typedef struct _DEBUG_WORK_ITEM { PCOMMON_OBJECT Object; PHW_PRIORITY_ROUTINE HwPriorityRoutine; PVOID HwPriorityContext; } DEBUG_WORK_ITEM, *PDEBUG_WORK_ITEM; #endif // // registry entry structure // typedef struct _STREAM_REGISTRY_ENTRY { PWCHAR String; ULONG StringLength; ULONG Flags; } STREAM_REGISTRY_ENTRY, *PSTREAM_REGISTRY_ENTRY; // // power context structure // typedef struct _POWER_CONTEXT { KEVENT Event; NTSTATUS Status; } POWER_CONTEXT, *PPOWER_CONTEXT; // // child device extension // typedef struct _CHILD_DEVICE_EXTENSION { COMMON_OBJECT ComObj; ULONG Flags; // per device flags (PD_xx) PDEVICE_OBJECT ChildDeviceObject; PDEVICE_OBJECT ParentDeviceObject; LIST_ENTRY ChildExtensionList; PWCHAR DeviceName; ULONG DeviceIndex; } CHILD_DEVICE_EXTENSION, *PCHILD_DEVICE_EXTENSION; // // Function declarations // NTSTATUS StreamClassOpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassNull( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID StreamClassDpc( IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); BOOLEAN StreamClassInterrupt( IN PKINTERRUPT InterruptObject, IN PDEVICE_OBJECT DeviceObject ); NTSTATUS StreamClassShutDown( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); BOOLEAN SCGetInterruptState( IN PVOID ServiceContext ); VOID SCMinidriverDeviceTimerDpc( IN struct _KDPC * Dpc, IN PVOID DeviceObject, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); VOID SCMinidriverStreamTimerDpc( IN struct _KDPC * Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); PSTREAM_REQUEST_BLOCK SCBuildRequestPacket( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp, IN ULONG AdditionalSize1, IN ULONG AdditionalSize2 ); BOOLEAN SCSynchronizeExecution( IN PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext ); VOID SCLogError( IN PDEVICE_OBJECT DeviceObject, IN ULONG SequenceNumber, IN NTSTATUS ErrorCode, IN ULONG UniqueId ); VOID SCLogErrorWithString( IN PDEVICE_OBJECT DeviceObject, IN OPTIONAL PDEVICE_EXTENSION DeviceExtension, IN NTSTATUS ErrorCode, IN ULONG UniqueId, IN PUNICODE_STRING String1 ); VOID SCMinidriverTimerDpc( IN struct _KDPC * Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); BOOLEAN SCSetUpForDMA( IN PDEVICE_OBJECT DeviceObject, IN PSTREAM_REQUEST_BLOCK Request ); IO_ALLOCATION_ACTION StreamClassDmaCallback( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID MapRegisterBase, IN PVOID Context ); VOID SCStartMinidriverRequest( IN PSTREAM_OBJECT StreamObject, IN PSTREAM_REQUEST_BLOCK Request, IN PVOID EntryPoint ); NTSTATUS SCProcessCompletedRequest( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS StreamClassUninitializeMinidriver( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS StreamClassVideoRegister( IN PVOID Argument1, IN PVOID Argument2, IN PHW_INITIALIZATION_DATA HwInitializationData ); NTSTATUS StreamClassCleanup ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); void SCSetCurrentDPowerState ( IN PDEVICE_EXTENSION DeviceExtension, IN DEVICE_POWER_STATE PowerState ); void SCSetCurrentSPowerState ( IN PDEVICE_EXTENSION DeviceExtension, IN SYSTEM_POWER_STATE PowerState ); void SCRedispatchPendedIrps ( IN PDEVICE_EXTENSION DeviceExtension, IN BOOLEAN FailRequests ); NTSTATUS StreamClassPassThroughIrp ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassPnP( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassPnPAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ); VOID SCFreeAllResources( IN PDEVICE_EXTENSION DeviceExtension ); VOID StreamClassUnload( IN PDRIVER_OBJECT DriverObject ); BOOLEAN StreamClassSynchronizeExecution( IN PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext ); VOID StreamClassDebugPrint( STREAM_DEBUG_LEVEL DebugPrintLevel, PSCHAR DebugMessage, ... ); NTSTATUS SCCompleteIrp( IN PIRP Irp, IN NTSTATUS Status, IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCUninitializeMinidriver( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); BOOLEAN SCDummyMinidriverRoutine( IN PVOID Context ); NTSTATUS SCStreamInfoCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS FilterDispatchGlobalCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamDispatchCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FilterDispatchIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FilterDispatchClose ( IN PDEVICE_OBJECT pdo, IN PIRP pIrp ); NTSTATUS SCStreamDeviceState ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSSTATE DeviceState ); NTSTATUS StreamDispatchIoControl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamDispatchRead ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamDispatchWrite ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCLocalInstanceCallback( IN PSTREAM_REQUEST_BLOCK SRB ); IFN_MF( NTSTATUS SCGlobalInstanceCallback( IN PSTREAM_REQUEST_BLOCK SRB ); ) NTSTATUS SCOpenStreamCallback( IN PSTREAM_REQUEST_BLOCK SRB ); VOID SCRequestDpcForStream( IN PSTREAM_OBJECT StreamObject ); NTSTATUS SCSubmitRequest( IN SRB_COMMAND Command, IN PVOID Buffer, IN ULONG BufferLength, IN PSTREAM_CALLBACK_PROCEDURE Callback, IN PDEVICE_EXTENSION DeviceExtension, IN PVOID InstanceExtension, IN PHW_STREAM_OBJECT HwStreamObject, IN PIRP Irp, OUT PBOOLEAN RequestIssued, IN PLIST_ENTRY Queue, IN PVOID MinidriverRoutine ); NTSTATUS SCCloseInstanceCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCFilterPinInstances( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS SCFilterPinDataRouting( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS SCFilterPinDataIntersection( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS SCFilterPinPropertyHandler( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS SCFilterProvider( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS StreamDispatchClose ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamDispatchCleanup ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCloseStreamCallback( IN PSTREAM_REQUEST_BLOCK SRB ); BOOLEAN SCProcessPioDataBuffers( IN PKSSTREAM_HEADER FirstHeader, IN ULONG NumberOfHeaders, IN PSTREAM_OBJECT StreamObject, IN PMDL FirstMdl, IN ULONG StreamHeaderSize, IN PVOID *pMemPtrArray, IN BOOLEAN Write ); VOID SCProcessDmaDataBuffers( IN PKSSTREAM_HEADER FirstHeader, IN ULONG NumberOfHeaders, IN PSTREAM_OBJECT StreamObject, IN PMDL FirstMdl, OUT PULONG NumberOfPages, IN ULONG StreamHeaderSize, IN BOOLEAN Write ); VOID SCErrorDataSRB( IN PHW_STREAM_REQUEST_BLOCK SRB ); VOID SCCheckOutstandingRequestsForTimeouts( IN PLIST_ENTRY ListEntry ); VOID SCCheckFilterInstanceStreamsForTimeouts( IN PFILTER_INSTANCE FilterInstance ); VOID StreamClassTickHandler( IN PDEVICE_OBJECT DeviceObject, IN PVOID Context ); VOID StreamClassCancelOutstandingIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID StreamClassCancelPendingIrp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID SCCancelOutstandingIrp( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp ); BOOLEAN SCCheckFilterInstanceStreamsForIrp( IN PFILTER_INSTANCE FilterInstance, IN PIRP Irp ); BOOLEAN SCCheckRequestsForIrp( IN PLIST_ENTRY ListEntry, IN PIRP Irp, IN BOOLEAN IsIrpQueue, IN PDEVICE_EXTENSION DeviceExtension ); VOID SCNotifyMinidriverCancel( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCProcessCompletedPropertyRequest( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS StreamClassMinidriverDeviceGetProperty ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); NTSTATUS StreamClassMinidriverDeviceSetProperty ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); NTSTATUS StreamClassMinidriverStreamGetProperty ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); NTSTATUS StreamClassMinidriverStreamSetProperty ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS SCOpenMinidriverInstance( IN PDEVICE_EXTENSION DeviceExtension, OUT PFILTER_INSTANCE * ReturnedFilterInstance, IN PSTREAM_CALLBACK_PROCEDURE Callback, IN PIRP Irp ); NTSTATUS SCMinidriverDevicePropertyHandler ( IN SRB_COMMAND Command, IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); NTSTATUS SCMinidriverStreamPropertyHandler ( IN SRB_COMMAND Command, IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID PropertyInfo ); VOID SCStartRequestOnStream( IN PSTREAM_OBJECT StreamObject, IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS StreamClassPnPAddDeviceWorker( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN OUT PDEVICE_EXTENSION * ReturnedDeviceExtension ); NTSTATUS SCProcessDataTransfer( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp, IN SRB_COMMAND Command ); VOID SCUpdateMinidriverProperties( IN ULONG NumProps, IN PKSPROPERTY_SET MinidriverProps, IN BOOLEAN Stream ); VOID SCInitializeWorkItem( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCInitializeCallback( IN PSTREAM_REQUEST_BLOCK SRB ); VOID SCStreamInfoWorkItem( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCDequeueAndDeleteSrb( IN PSTREAM_REQUEST_BLOCK SRB ); VOID SCReadRegistryValues(IN PDEVICE_EXTENSION DeviceExtension, IN PDEVICE_OBJECT PhysicalDeviceObject ); NTSTATUS SCGetRegistryValue( IN HANDLE Handle, IN PWCHAR KeyNameString, IN ULONG KeyNameStringLength, IN PVOID Data, IN ULONG DataLength ); VOID SCInsertStreamInFilter( IN PSTREAM_OBJECT StreamObject, IN PDEVICE_EXTENSION DeviceExtension ); VOID SCReferenceDriver( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCDereferenceDriver( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCQueueSrbWorkItem( IN PSTREAM_REQUEST_BLOCK Srb ); VOID SCProcessPriorityChangeRequest( IN PCOMMON_OBJECT CommonObject, IN PINTERRUPT_DATA SavedInterruptData, IN PDEVICE_EXTENSION DeviceExtension ); VOID SCProcessTimerRequest( IN PCOMMON_OBJECT CommonObject, IN PINTERRUPT_DATA SavedInterruptData ); NTSTATUS SCPowerCallback( IN PSTREAM_REQUEST_BLOCK SRB ); BOOLEAN SCCheckIfOkToPowerDown( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCIssueRequestToDevice( IN PDEVICE_EXTENSION DeviceExtension, IN PSTREAM_OBJECT StreamObject, PSTREAM_REQUEST_BLOCK Request, IN PVOID MinidriverRoutine, IN PLIST_ENTRY Queue, IN PIRP Irp ); VOID SCBeginSynchronizedMinidriverCallin( IN PDEVICE_EXTENSION DeviceExtension, IN PKIRQL Irql ); VOID SCBeginUnsynchronizedMinidriverCallin( IN PDEVICE_EXTENSION DeviceExtension, IN PKIRQL Irql ); VOID SCEndUnsynchronizedMinidriverDeviceCallin( IN PDEVICE_EXTENSION DeviceExtension, IN PKIRQL Irql ); VOID SCEndUnsynchronizedMinidriverStreamCallin( IN PSTREAM_OBJECT StreamObject, IN PKIRQL Irql ); VOID SCEndSynchronizedMinidriverStreamCallin( IN PSTREAM_OBJECT StreamObject, IN PKIRQL Irql ); VOID SCEndSynchronizedMinidriverDeviceCallin( IN PDEVICE_EXTENSION DeviceExtension, IN PKIRQL Irql ); NTSTATUS SCStartWorker( IN PIRP Irp ); NTSTATUS SCShowIoPending( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp ); VOID SCWaitForOutstandingIo( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCCheckPoweredUp( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCCheckPowerDown( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCUninitializeCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCRemoveComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID SCRemoveCompleteWorkItem( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCDetachDevice( IN PDEVICE_OBJECT Fdo, IN PDEVICE_OBJECT Pdo ); NTSTATUS SCQueryWorker( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCCallNextDriver( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp ); VOID StreamFlushIo( IN PDEVICE_EXTENSION DeviceExtension, IN PSTREAM_OBJECT StreamObject ); NTSTATUS ClockDispatchCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCOpenMasterCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCSetMasterClock( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PHANDLE ClockHandle ); NTSTATUS SCClockGetTime( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PULONGLONG StreamTime ); NTSTATUS SCClockGetPhysicalTime( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PULONGLONG PhysicalTime ); NTSTATUS SCClockGetSynchronizedTime( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSCORRELATED_TIME SyncTime ); NTSTATUS SCClockGetFunctionTable( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSCLOCK_FUNCTIONTABLE FunctionTable ); NTSTATUS ClockDispatchClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); ULONGLONG FASTCALL SCGetSynchronizedTime( IN PFILE_OBJECT FileObject, IN PULONGLONG SystemTime ); ULONGLONG FASTCALL SCGetPhysicalTime( IN PFILE_OBJECT FileObject ); ULONGLONG SCGetStreamTime( IN PFILE_OBJECT FileObject ); VOID SCMinidriverTimeFunction( IN PHW_TIME_CONTEXT TimeContext ); NTSTATUS ClockDispatchIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID StreamClassQueryMasterClock( IN PHW_STREAM_OBJECT HwStreamObject, IN HANDLE MasterClockHandle, IN TIME_FUNCTION TimeFunction, IN PHW_QUERY_CLOCK_ROUTINE ClockCallbackRoutine ); NTSTATUS SCSendUnknownCommand( IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension, IN PVOID Callback, OUT PBOOLEAN RequestIssued ); NTSTATUS SCPNPQueryCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCUnknownPNPCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCUnknownPowerCallback( IN PSTREAM_REQUEST_BLOCK SRB ); BOOLEAN SCMapMemoryAddress(PACCESS_RANGE AccessRanges, PHYSICAL_ADDRESS TranslatedAddress, PPORT_CONFIGURATION_INFORMATION ConfigInfo, PDEVICE_EXTENSION DeviceExtension, PCM_RESOURCE_LIST ResourceList, PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor ); VOID SCUpdatePersistedProperties(IN PSTREAM_OBJECT StreamObject, IN PDEVICE_EXTENSION DeviceExtension, IN PFILE_OBJECT FileObject ); VOID SCCreateSymbolicLinks( IN PDEVICE_EXTENSION DeviceExtension ); VOID SCDestroySymbolicLinks( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCSynchCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PKEVENT Event ); VOID SCSignalSRBEvent( IN PSTREAM_REQUEST_BLOCK Srb ); NTSTATUS SCFilterTopologyHandler( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data); NTSTATUS SCStreamProposeNewFormat ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSDATAFORMAT Format ); NTSTATUS SCGetMasterClock( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PHANDLE ClockHandle ); NTSTATUS SCCloseClockCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCStreamDeviceRate ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSRATE DeviceRate ); NTSTATUS SCStreamDeviceRateCapability ( IN PIRP Irp, IN PKSRATE_CAPABILITY RateCap, IN OUT PKSRATE DeviceRate ); NTSTATUS SCFilterPinIntersectionHandler( IN PIRP Irp, IN PKSP_PIN Pin, OUT PVOID Data ); NTSTATUS SCIntersectHandler( IN PIRP Irp, IN PKSP_PIN Pin, IN PKSDATARANGE DataRange, OUT PVOID Data ); NTSTATUS SCDataIntersectionCallback( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS SCQueryCapabilities( IN PDEVICE_OBJECT PdoDeviceObject, IN PDEVICE_CAPABILITIES DeviceCapabilities ); NTSTATUS SCSynchPowerCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE DeviceState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); NTSTATUS SCGetStreamDeviceState ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSSTATE DeviceState ); NTSTATUS SCCreateChildPdo( IN PVOID PnpId, IN PDEVICE_OBJECT DeviceObject, IN ULONG InstanceNumber ); NTSTATUS SCEnumerateChildren( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassEnumPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassEnumPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCEnumGetCaps( IN PCHILD_DEVICE_EXTENSION DeviceExtension, OUT PDEVICE_CAPABILITIES Capabilities ); NTSTATUS SCQueryEnumId( IN PDEVICE_OBJECT DeviceObject, IN BUS_QUERY_ID_TYPE BusQueryIdType, IN OUT PWSTR * BusQueryId ); NTSTATUS AllocatorDispatchCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS StreamClassEnableEventHandler( IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry ); VOID StreamClassDisableEventHandler( IN PFILE_OBJECT FileObject, IN PKSEVENT_ENTRY EventEntry ); VOID SCUpdateMinidriverEvents( IN ULONG NumEvents, IN PKSEVENT_SET MinidriverEvents, IN BOOLEAN Stream ); NTSTATUS SCEnableEventSynchronized( IN PVOID ServiceContext ); VOID SCGetDeadListSynchronized( IN PLIST_ENTRY NewListEntry ); VOID SCFreeDeadEvents( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS StreamClassForwardUnsupported( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SCStreamSetFormat ( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSDATAFORMAT Format ); VOID SCInsertStreamInfo( IN PDEVICE_EXTENSION DeviceExtension, IN PKSPIN_DESCRIPTOR PinDescs, IN PHW_STREAM_DESCRIPTOR StreamDescriptor, IN ULONG NumberOfPins ); VOID SCRescanStreams( IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCGetStreamHeaderSize( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PULONG StreamHeaderSize ); VOID SCInterlockedRemoveEntryList( PDEVICE_EXTENSION DeviceExtension, PLIST_ENTRY List ); VOID SCInsertFiltersInDevice( IN PFILTER_INSTANCE FilterInstance, IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS SCBustedSynchPowerCompletionRoutine( IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE DeviceState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus ); BOOLEAN SCCheckIfStreamsRunning( IN PFILTER_INSTANCE FilterInstance ); #if DBG BOOLEAN SCDebugKeSynchronizeExecution( IN PKINTERRUPT Interrupt, IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext ); #endif // DEBUG NTSTATUS SCEnableDeviceEventSynchronized( IN PVOID ServiceContext ); NTSTATUS StreamClassEnableDeviceEventHandler( IN PIRP Irp, IN PKSEVENTDATA EventData, IN PKSEVENT_ENTRY EventEntry ); VOID StreamClassDisableDeviceEventHandler( IN PFILE_OBJECT FileObject, IN PKSEVENT_ENTRY EventEntry ); VOID SCCallBackSrb( IN PSTREAM_REQUEST_BLOCK Srb, IN PDEVICE_EXTENSION DeviceExtension ); NTSTATUS DllUnload( VOID ); VOID SCPowerCompletionWorker( IN PIRP SystemIrp ); VOID SCSendSurpriseNotification( IN PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp ); #if DBG VOID SCDebugPriorityWorkItem( IN PDEBUG_WORK_ITEM WorkItemStruct ); #endif PKSPROPERTY_SET SCCopyMinidriverProperties( IN ULONG NumProps, IN PKSPROPERTY_SET MinidriverProps ); PKSEVENT_SET SCCopyMinidriverEvents( IN ULONG NumEvents, IN PKSEVENT_SET MinidriverEvents ); #ifdef ENABLE_STREAM_CLASS_AS_ALLOCATOR NTSTATUS SCStreamAllocatorFraming( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PKSALLOCATOR_FRAMING Framing ); NTSTATUS SCStreamAllocator( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PHANDLE AllocatorHandle ); NTSTATUS IoCompletionRoutine( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ); NTSTATUS CleanupTransfer( IN PFILTER_INSTANCE FilterInstance, IN PSTREAM_OBJECT StreamObject ); NTSTATUS EndTransfer( IN PFILTER_INSTANCE FilterInstance, IN PSTREAM_OBJECT StreamObject ); NTSTATUS BeginTransfer( IN PFILTER_INSTANCE FilterInstance, IN PSTREAM_OBJECT StreamObject ); NTSTATUS PrepareTransfer( IN PFILTER_INSTANCE FilterInstance, IN PSTREAM_OBJECT StreamObject ); NTSTATUS PinCreateHandler( IN PIRP Irp, IN PSTREAM_OBJECT StreamObject ); NTSTATUS AllocateFrame( PFILE_OBJECT Allocator, PVOID *Frame ); NTSTATUS FreeFrame( PFILE_OBJECT Allocator, PVOID Frame ); #endif //ENABLE_STREAM_CLASS_AS_ALLOCATOR #ifdef ENABLE_KS_METHODS NTSTATUS SCProcessCompletedMethodRequest( IN PSTREAM_REQUEST_BLOCK SRB ); NTSTATUS StreamClassMinidriverStreamMethod ( IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); NTSTATUS StreamClassMinidriverDeviceMethod ( IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); NTSTATUS SCMinidriverStreamMethodHandler( IN SRB_COMMAND Command, IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); NTSTATUS SCMinidriverDeviceMethodHandler( IN SRB_COMMAND Command, IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); VOID SCUpdateMinidriverMethods( IN ULONG NumMethods, IN PKSMETHOD_SET MinidriverMethods, IN BOOLEAN Stream ); PKSMETHOD_SET SCCopyMinidriverMethods( IN ULONG NumMethods, IN PKSMETHOD_SET MinidriverMethods ); NTSTATUS SCStreamMethodHandler( IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); NTSTATUS SCStreamAllocatorMethodHandler( IN PIRP Irp, IN PKSMETHOD Method, IN OUT PVOID MethodInfo ); #endif #if ENABLE_MULTIPLE_FILTER_TYPES NTSTATUS SciOnFilterStreamDescriptor( PFILTER_INSTANCE FilterInstance, PHW_STREAM_DESCRIPTOR StreamDescriptor); VOID SciInsertFilterStreamInfo( IN PFILTER_INSTANCE FilterInstance, IN PKSPIN_DESCRIPTOR PinDescs, IN ULONG NumberOfPins); NTSTATUS SciFreeFilterInstance( PFILTER_INSTANCE pFilterInstance ); NTSTATUS SciQuerySystemPowerHiberCallback( IN PSTREAM_REQUEST_BLOCK SRB ); #endif // ENABLE_MULTIPLE_FILTER_TYPES #define SCLOG_FLAGS_CLOCK 0x00000001 #define SCLOG_FLAGS_PNP 0x00000002 #define SCLOG_FLAGS_PRINT 0x80000000 #if (DBG) && !defined(_WIN64) NTSTATUS SCLog( ULONG ulTag, ULONG ulArg1, ULONG ulArg2, ULONG ulArg3 ); NTSTATUS SCLogWithTime( ULONG ulTag, ULONG ulArg1, ULONG ulArg2 ); #define SCLOG( ulTag, Arg1, Arg2, Arg3 ) SCLog( ulTag, (ULONG)Arg1, (ULONG)Arg2, (ULONG)Arg3 ) #define SCLOGWITHTIME( ulTag, Arg1, Arg2 ) SCLogWithTime( ulTag, Arg1, Arg2 ) #else #define SCLOG( ulTag, Arg1, Arg2, Arg3 ) #define SCLOGWITHTIME( ulTag, Arg1, Arg2 ) #endif #endif // #ifndef _STREAMCLASS_H