228 lines
5.3 KiB
C++
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
|
||
|
|
||
|
|