windows-nt/Source/XPSP1/NT/drivers/ddk/wdmaudio/msvad/kshelper.cpp
2020-09-26 16:20:57 +08:00

228 lines
5.3 KiB
C++

/*++
Copyright (c) 1997-2000 Microsoft Corporation All Rights Reserved
Module Name:
kshelper.cpp
Abstract:
Helper functions for msvad
--*/
#include "kshelper.h"
//-----------------------------------------------------------------------------
PWAVEFORMATEX
GetWaveFormatEx
(
IN PKSDATAFORMAT pDataFormat
)
/*++
Routine Description:
Returns the waveformatex for known formats.
Arguments:
pDataFormat - data format.
Return Value:
waveformatex in DataFormat.
NULL for unknown data formats.
--*/
{
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;
} // GetWaveFormatEx
//-----------------------------------------------------------------------------
NTSTATUS
PropertyHandler_BasicSupport
(
IN PPCPROPERTY_REQUEST PropertyRequest,
IN ULONG Flags,
IN DWORD PropTypeSetId
)
/*++
Routine Description:
Default basic support handler. Basic processing depends on the size of data.
For ULONG it only returns Flags. For KSPROPERTY_DESCRIPTION, the structure
is filled.
Arguments:
PropertyRequest -
Flags - Support flags.
PropTypeSetId - PropTypeSetId
Return Value:
NT status code.
--*/
{
PAGED_CODE();
ASSERT(Flags & KSPROPERTY_TYPE_BASICSUPPORT);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
if (PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION)) &&
VT_ILLEGAL != PropTypeSetId)
{
// 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);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = PropTypeSetId;
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 if (0 == PropertyRequest->ValueSize)
{
// Send the caller required value size.
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_BUFFER_OVERFLOW;
}
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 */
)
/*++
Routine Description:
Validates property parameters.
Arguments:
PropertyRequest -
cbSize -
cbInstanceSize -
Return Value:
NT status code.
--*/
{
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