//By Fanxiushu 2011-10-24
#include "common.h"
#include "top_wav.h"
///common function
PWAVEFORMATEX GetWaveFormatEx( IN PKSDATAFORMAT pDataFormat )
{
PWAVEFORMATEX pWfx = NULL;
// If this is a known dataformat extract the waveformat info.
//
if
(
pDataFormat &&
( IsEqualGUIDAligned(pDataFormat->MajorFormat,
KSDATAFORMAT_TYPE_AUDIO) &&
( IsEqualGUIDAligned(pDataFormat->Specifier,
KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) ||
IsEqualGUIDAligned(pDataFormat->Specifier,
KSDATAFORMAT_SPECIFIER_DSOUND) ) )
)
{
pWfx = PWAVEFORMATEX(pDataFormat + 1);
if (IsEqualGUIDAligned(pDataFormat->Specifier,
KSDATAFORMAT_SPECIFIER_DSOUND))
{
PKSDSOUND_BUFFERDESC pwfxds;
pwfxds = PKSDSOUND_BUFFERDESC(pDataFormat + 1);
pWfx = &pwfxds->WaveFormatEx;
}
}
return pWfx;
}
NTSTATUS ValidateFormat(IN PKSDATAFORMAT pDataFormat)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
PWAVEFORMATEX pwfx;
pwfx = GetWaveFormatEx(pDataFormat);
if (pwfx)
{
if (IS_VALID_WAVEFORMATEX_GUID(&pDataFormat->SubFormat))
{
USHORT wfxID = EXTRACT_WAVEFORMATEX_ID(&pDataFormat->SubFormat);
switch (wfxID)
{
case WAVE_FORMAT_PCM:
{
switch (pwfx->wFormatTag)
{
case WAVE_FORMAT_PCM:
{
if( pwfx->nChannels>=MIN_CHANNELS&&pwfx->nChannels<=MAX_CHANNELS_PCM &&
pwfx->wBitsPerSample>=MIN_BITS_PER_SAMPLE_PCM && pwfx->wBitsPerSample<=MAX_BITS_PER_SAMPLE_PCM &&
pwfx->nSamplesPerSec>=MIN_SAMPLE_RATE && pwfx->nSamplesPerSec<=MAX_SAMPLE_RATE )
{
status = STATUS_SUCCESS;
}
break;
}
}
break;
}
default:
DPT("Invalid format EXTRACT_WAVEFORMATEX_ID!");
break;
}
}
else
{
DPT("Invalid pDataFormat->SubFormat!" );
}
}
return status;
}
///copy from MSVAD
NTSTATUS
PropertyHandler_BasicSupport
(
IN PPCPROPERTY_REQUEST PropertyRequest,
IN ULONG Flags,
IN DWORD PropTypeSetId
)
{
ASSERT(Flags & KSPROPERTY_TYPE_BASICSUPPORT);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
if (PropertyRequest->ValueSize >= sizeof(KSPROPERTY_DESCRIPTION))
{
// if return buffer can hold a KSPROPERTY_DESCRIPTION, return it
//
PKSPROPERTY_DESCRIPTION PropDesc =
PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
PropDesc->AccessFlags = Flags;
PropDesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
if (VT_ILLEGAL != PropTypeSetId)
{
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = PropTypeSetId;
}
else
{
PropDesc->PropTypeSet.Set = GUID_NULL;
PropDesc->PropTypeSet.Id = 0;
}
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 0;
PropDesc->Reserved = 0;
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_SUCCESS;
}
else if (PropertyRequest->ValueSize >= sizeof(ULONG))
{
// if return buffer can hold a ULONG, return the access flags
//
*(PULONG(PropertyRequest->Value)) = Flags;
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
else
{
PropertyRequest->ValueSize = 0;
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
return ntStatus;
} // PropertyHandler_BasicSupport
//-----------------------------------------------------------------------------
NTSTATUS
ValidatePropertyParams
(
IN PPCPROPERTY_REQUEST PropertyRequest,
IN ULONG cbSize,
IN ULONG cbInstanceSize /* = 0 */
)
{
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
if (PropertyRequest && cbSize)
{
// If the caller is asking for ValueSize.
//
if (0 == PropertyRequest->ValueSize)
{
PropertyRequest->ValueSize = cbSize;
ntStatus = STATUS_BUFFER_OVERFLOW;
}
// If the caller passed an invalid ValueSize.
//
else if (PropertyRequest->ValueSize < cbSize)
{
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
else if (PropertyRequest->InstanceSize < cbInstanceSize)
{
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
// If all parameters are OK.
//
else if (PropertyRequest->ValueSize == cbSize)
{
if (PropertyRequest->Value)
{
ntStatus = STATUS_SUCCESS;
//
// Caller should set ValueSize, if the property
// call is successful.
//
}
}
}
else
{
ntStatus = STATUS_INVALID_PARAMETER;
}
// Clear the ValueSize if unsuccessful.
//
if (PropertyRequest &&
STATUS_SUCCESS != ntStatus &&
STATUS_BUFFER_OVERFLOW != ntStatus)
{
PropertyRequest->ValueSize = 0;
}
return ntStatus;
} // ValidatePropertyParams
////
class AdapterPowerMgr:
public IAdapterPowerManagement,
public CUnknown
{
protected:
DEVICE_POWER_STATE m_PowerState;
public:
/////
// Default CUnknown
DECLARE_STD_UNKNOWN();
AdapterPowerMgr( PUNKNOWN pUnknownOuter);
~AdapterPowerMgr();
//=====================================================================
// Default IAdapterPowerManagement
IMP_IAdapterPowerManagement;
//////////////////////////////////////////
NTSTATUS Init(PDEVICE_OBJECT fdo);
};
AdapterPowerMgr::AdapterPowerMgr
(PUNKNOWN pUnknownOuter):CUnknown( pUnknownOuter )
{
////
m_PowerState = PowerDeviceD0;
}
AdapterPowerMgr::~AdapterPowerMgr()
{
}
STDMETHODIMP
AdapterPowerMgr::NonDelegatingQueryInterface( REFIID Interface, PVOID * Object )
{
if (IsEqualGUIDAligned(Interface, IID_IUnknown))
{
*Object = PVOID(PUNKNOWN((AdapterPowerMgr*)(this)));
}
else if (IsEqualGUIDAligned(Interface, IID_IAdapterPowerManagement))
{
*Object = PVOID(PADAPTERPOWERMANAGEMENT(this));
}
else
{
*Object = NULL;
}
if (*Object)
{
PUNKNOWN(*Object)->AddRef();
return STATUS_SUCCESS;
}
return STATUS_INVALID_PARAMETER;
}
NTSTATUS AdapterPowerMgr::Init(PDEVICE_OBJECT fdo)
{
return STATUS_SUCCESS;
}
/////
STDMETHODIMP_(void)
AdapterPowerMgr::PowerChangeState( IN POWER_STATE NewState )
{
////
if (NewState.DeviceState != m_PowerState)
{
// switch on new state
switch (NewState.DeviceState)
{
case PowerDeviceD0:
case PowerDeviceD1:
case PowerDeviceD2:
case PowerDeviceD3:
m_PowerState = NewState.DeviceState;
DPT("Entering D%d", (ULONG(m_PowerState) - ULONG(PowerDeviceD0)) );
break;
default:
DPT("Unknown Device Power State");
break;
}
}
}
STDMETHODIMP_(NTSTATUS)
AdapterPowerMgr::QueryDeviceCapabilities( IN PDEVICE_CAPABILITIES PowerD
- 1
- 2
- 3
- 4
- 5
- 6
前往页