Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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
|