duncanthraxInitial commite15ccc211 years agoHistory
160 lines · 4.8 KB · C++
RawDownload
/*++Copyright (c) 1997-2000  Microsoft Corporation All Rights Reserved Module Name:    kshelper.cpp Abstract:    Helper functions for msvad--*/ #include "kshelper.h" #pragma code_seg("PAGE") //-----------------------------------------------------------------------------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.--*/{    PAGED_CODE();     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)) {        // 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  */)/*++Routine Description:  Validates property parameters. Arguments:  PropertyRequest -   cbSize -  cbInstanceSize - Return Value:  NT status code.--*/{    PAGED_CODE();     NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;     if (PropertyRequest && cbSize) {        if (0 == PropertyRequest->ValueSize)  {            // If the caller is asking for ValueSize.            PropertyRequest->ValueSize = cbSize;            ntStatus = STATUS_BUFFER_OVERFLOW;        } else if (PropertyRequest->ValueSize < cbSize) {            // If the caller passed an invalid ValueSize.            ntStatus = STATUS_BUFFER_TOO_SMALL;        } else if (PropertyRequest->InstanceSize < cbInstanceSize) {            ntStatus = STATUS_BUFFER_TOO_SMALL;        } else if (PropertyRequest->ValueSize == cbSize) {            // If all parameters are OK.            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  

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t