/*++ 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