392 lines
8.6 KiB
C++
392 lines
8.6 KiB
C++
#include "common.h"
|
|
|
|
#include "bdadebug.h"
|
|
|
|
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
|
|
|
|
/**************************************************************/
|
|
/* Driver Name - Change this to reflect your executable name! */
|
|
/**************************************************************/
|
|
|
|
#define MODULENAME "CASamp"
|
|
#define MODULENAMEUNICODE L"CASamp"
|
|
|
|
#define STR_MODULENAME MODULENAME
|
|
|
|
// This defines the name of the WMI device that manages service IOCTLS
|
|
#define DEVICENAME (L"\\\\.\\" MODULENAMEUNICODE)
|
|
#define SYMBOLICNAME (L"\\DosDevices\\" MODULENAMEUNICODE)
|
|
|
|
|
|
// This structure represents what the underlying device can do.
|
|
//
|
|
// Note - It is possible to set conflicting settings. In this case
|
|
// it is the responsibilty of the CheckChanges code to return an
|
|
// error. Only a self-consistent tuner resource should be submitted to
|
|
// the underlying device.
|
|
//
|
|
typedef struct _OUR_TUNER_RESOURCE
|
|
{
|
|
ULONG ulhzCarrierFrequency;// The channel frequency
|
|
} OUR_TUNER_RESOURCE, * POUR_TUNER_RESOURCE;
|
|
|
|
|
|
extern const KSDEVICE_DESCRIPTOR DeviceDescriptor;
|
|
|
|
|
|
class CFilter {
|
|
public:
|
|
|
|
//
|
|
// AVStream Filter Dispatch Functions
|
|
//
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
Create(
|
|
IN OUT PKSFILTER Filter,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
FilterClose(
|
|
IN OUT PKSFILTER Filter,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP
|
|
Process(
|
|
IN PKSFILTER Filter,
|
|
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
|
|
);
|
|
|
|
//
|
|
// KSMETHODSETID_BdaChangeSync - Filter change sync methods
|
|
//
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
StartChanges(
|
|
IN PIRP pIrp,
|
|
IN PKSMETHOD pKSMethod,
|
|
OPTIONAL PVOID pvIgnored
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
CheckChanges(
|
|
IN PIRP pIrp,
|
|
IN PKSMETHOD pKSMethod,
|
|
OPTIONAL PVOID pvIgnored
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
CommitChanges(
|
|
IN PIRP pIrp,
|
|
IN PKSMETHOD pKSMethod,
|
|
OPTIONAL PVOID pvIgnored
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetChangeState(
|
|
IN PIRP pIrp,
|
|
IN PKSMETHOD pKSMethod,
|
|
OUT PULONG pulChangeState
|
|
);
|
|
|
|
//
|
|
// KSMETHODSETID_BdaDeviceConfiguration - Methods to modify filter topology.
|
|
//
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
CreateTopology(
|
|
IN PIRP pIrp,
|
|
IN PKSMETHOD pKSMethod,
|
|
OPTIONAL PVOID pvIgnored
|
|
);
|
|
|
|
STDMETHODIMP_(BDA_CHANGE_STATE)
|
|
ChangeState();
|
|
|
|
STDMETHODIMP_(class CDevice *)
|
|
GetDevice() { return m_pDevice;};
|
|
|
|
STDMETHODIMP_(NTSTATUS)
|
|
ChangeFrequency(
|
|
IN ULONG ulhzCarrierFrequency
|
|
)
|
|
{
|
|
//$Review - Should we validate the frequency here?
|
|
//
|
|
m_NewTunerResource.ulhzCarrierFrequency = ulhzCarrierFrequency;
|
|
m_BdaChangeState = BDA_CHANGES_PENDING;
|
|
|
|
return STATUS_SUCCESS;
|
|
};
|
|
|
|
STDMETHODIMP_(NTSTATUS)
|
|
SetDeviceState(
|
|
KSSTATE newKsState
|
|
)
|
|
{
|
|
m_KsState = newKsState;
|
|
return STATUS_SUCCESS;
|
|
};
|
|
|
|
STDMETHODIMP_(NTSTATUS)
|
|
AcquireResources();
|
|
|
|
STDMETHODIMP_(NTSTATUS)
|
|
ReleaseResources();
|
|
|
|
private:
|
|
class CDevice * m_pDevice;
|
|
|
|
// Filter Properties
|
|
//
|
|
|
|
// Filter Resources
|
|
//
|
|
KSSTATE m_KsState;
|
|
BDA_CHANGE_STATE m_BdaChangeState;
|
|
OUR_TUNER_RESOURCE m_CurTunerResource;
|
|
ULONG m_ulCurResourceID;
|
|
OUR_TUNER_RESOURCE m_NewTunerResource;
|
|
ULONG m_ulNewResourceID;
|
|
};
|
|
|
|
|
|
class CDevice {
|
|
public:
|
|
|
|
//
|
|
// AVStream Device Dispatch Functions
|
|
//
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
Create(
|
|
IN PKSDEVICE pKSDevice
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
Start(
|
|
IN PKSDEVICE pKSDevice,
|
|
IN PIRP pIrp,
|
|
IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL,
|
|
IN PCM_RESOURCE_LIST pUntranslatedResourceList OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Utility functions
|
|
//
|
|
NTSTATUS
|
|
AcquireResources(
|
|
POUR_TUNER_RESOURCE pNewTunerResource,
|
|
PULONG pulAquiredResourceID
|
|
);
|
|
|
|
NTSTATUS
|
|
ReleaseResources(
|
|
ULONG ulResourceID
|
|
);
|
|
|
|
|
|
private:
|
|
|
|
PKSDEVICE m_pKSDevice;
|
|
|
|
OUR_TUNER_RESOURCE m_CurTunerResource;
|
|
};
|
|
|
|
class CTransportOutputPin
|
|
{
|
|
public:
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PinCreate(
|
|
IN OUT PKSPIN Pin,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PinClose(
|
|
IN OUT PKSPIN Pin,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
IntersectDataFormat(
|
|
IN PVOID pContext,
|
|
IN PIRP pIrp,
|
|
IN PKSP_PIN Pin,
|
|
IN PKSDATARANGE DataRange,
|
|
IN PKSDATARANGE MatchingDataRange,
|
|
IN ULONG DataBufferSize,
|
|
OUT PVOID Data OPTIONAL,
|
|
OUT PULONG DataSize
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetECMMapStatus(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PULONG pulProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetCAModuleStatus(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PULONG pulProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetCASmartCardStatus(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PULONG pulProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetCAModuleUI(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_CA_MODULE_UI pCAModuleUIProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PutECMMapEMMPID(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PULONG pulProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
GetECMMapList(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_ECM_MAP pECMMapProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PutECMMapUpdateMap(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_ECM_MAP pECMMapProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PutECMMapRemoveMap(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_ECM_MAP pECMMapProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PutECMMapUpdateESDescriptor(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_ES_DESCRIPTOR pESDescProperty
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PutECMMapUpdateProgramDescriptor(
|
|
IN PIRP Irp,
|
|
IN PKSPROPERTY pKSProperty,
|
|
IN PBDA_PROGRAM_DESCRIPTOR pProgramDescProperty
|
|
);
|
|
|
|
STDMETHODIMP_(class CFilter *)
|
|
GetFilter() { return m_pFilter;};
|
|
|
|
STDMETHODIMP_(void)
|
|
SetFilter(class CFilter * pFilter) { m_pFilter = pFilter;};
|
|
|
|
private:
|
|
CFilter * m_pFilter;
|
|
};
|
|
|
|
class CTransportInputPin
|
|
{
|
|
public:
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PinCreate(
|
|
IN OUT PKSPIN Pin,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
PinClose(
|
|
IN OUT PKSPIN Pin,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
static
|
|
STDMETHODIMP_(NTSTATUS)
|
|
IntersectDataFormat(
|
|
IN PVOID pContext,
|
|
IN PIRP pIrp,
|
|
IN PKSP_PIN Pin,
|
|
IN PKSDATARANGE DataRange,
|
|
IN PKSDATARANGE MatchingDataRange,
|
|
IN ULONG DataBufferSize,
|
|
OUT PVOID Data OPTIONAL,
|
|
OUT PULONG DataSize
|
|
);
|
|
|
|
STDMETHODIMP_(class CFilter *)
|
|
GetFilter() { return m_pFilter;};
|
|
|
|
STDMETHODIMP_(void)
|
|
SetFilter(class CFilter * pFilter) { m_pFilter = pFilter;};
|
|
|
|
private:
|
|
CFilter * m_pFilter;
|
|
};
|
|
|
|
|
|
//
|
|
// Helper routines
|
|
//
|
|
|
|
NTSTATUS
|
|
PinSetDeviceState(
|
|
IN PKSPIN Pin,
|
|
IN KSSTATE ToState,
|
|
IN KSSTATE FromState
|
|
);
|
|
|
|
//
|
|
// Data declarations
|
|
//
|
|
|
|
extern const BDA_FILTER_TEMPLATE TunerBdaFilterTemplate;
|
|
extern const KSFILTER_DESCRIPTOR InitialTunerFilterDescriptor;
|
|
extern const KSFILTER_DESCRIPTOR TemplateTunerFilterDescriptor;
|
|
|
|
//
|
|
// Some GUIDs for our use
|
|
//
|
|
|
|
#define STATIC_KSNODE_BDA_OUR_ECMMAPER \
|
|
0xe1571834, 0xfff0, 0x45d5, 0x9e, 0x5b, 0x68, 0x75, 0x59, 0x17, 0xa6, 0xdc
|
|
DEFINE_GUIDSTRUCT("E1571834-FFF0-45d5-9E5B-68755917A6DC", KSNODE_BDA_OUR_ECMMAPER);
|
|
#define KSNODE_BDA_OUR_ECMMAPER DEFINE_GUIDNAMED(KSNODE_BDA_OUR_ECMMAPER)
|