/*************************************************************************** * * Copyright (C) 2000-2001 Microsoft Corporation. All Rights Reserved. * * File: kshlp.cpp * Content: WDM/CSA helper functions. * History: * Date By Reason * ==== == ====== * 05/16/2000 jstokes Created. * 03/09/2001 duganp Fixed return code mistranslation. * ***************************************************************************/ #include #include #include #include "ksdbgprop.h" #include "kshlp.h" #include #include "runtime.h" /*************************************************************************** * * SyncIoctl * ***************************************************************************/ static BOOL SyncIoctl ( IN HANDLE handle, IN ULONG ulIoctl, IN PVOID pvInBuffer OPTIONAL, IN ULONG ulInSize, OUT PVOID pvOutBuffer OPTIONAL, IN ULONG ulOutSize, OUT PULONG pulBytesReturned ) { OVERLAPPED overlapped; memset(&overlapped, 0, sizeof overlapped); overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!overlapped.hEvent) { return FALSE; } BOOL fResult = DeviceIoControl(handle, ulIoctl, pvInBuffer, ulInSize, pvOutBuffer, ulOutSize, pulBytesReturned, &overlapped); DWORD dwError = GetLastError(); if (!fResult && dwError == ERROR_IO_PENDING) { if (WaitForSingleObject(overlapped.hEvent, INFINITE) != WAIT_FAILED) { fResult = TRUE; } } else if (!fResult) { if ( (ulIoctl == IOCTL_KS_PROPERTY) && (ulOutSize == 0) && (dwError == ERROR_MORE_DATA) ) { fResult = TRUE; } else { *pulBytesReturned = 0; } } CloseHandle(overlapped.hEvent); return fResult; } /*************************************************************************** * * KsGetProperty * * Description: * Retrieves a particular property on a device. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * DWORD [in]: property id. * LPVOID [out]: receives property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsGetProperty" HRESULT KsGetProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, LPVOID pvData, ULONG cbData, PULONG pcbDataReturned ) { KSPROPERTY Property; HRESULT hr; Property.Set = guidPropertySet; Property.Id = ulPropertyId; Property.Flags = KSPROPERTY_TYPE_GET; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Property, sizeof Property, pvData, cbData, pcbDataReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsSetProperty * * Description: * Sets a particular property on a device. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * DWORD [in]: property id. * LPVOID [in]: property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsSetProperty" HRESULT KsSetProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, LPVOID pvData, ULONG cbData ) { KSPROPERTY Property; HRESULT hr; ULONG ulBytesReturned; Property.Set = guidPropertySet; Property.Id = ulPropertyId; Property.Flags = KSPROPERTY_TYPE_SET; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Property, sizeof Property, pvData, cbData, &ulBytesReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsGetPinProperty * * Description: * Retrieves a particular property on a pin. * * Arguments: * HANDLE [in]: device handle. * DWORD [in]: property id. * DWORD [in]: pin id. * LPVOID [out]: receives property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsGetPinProperty" HRESULT KsGetPinProperty ( HANDLE hDevice, ULONG ulPropertyId, ULONG ulPinId, LPVOID pvData, ULONG cbData, PULONG pcbDataReturned ) { KSP_PIN Pin; HRESULT hr; Pin.Property.Set = KSPROPSETID_Pin; Pin.Property.Id = ulPropertyId; Pin.Property.Flags = KSPROPERTY_TYPE_GET; Pin.PinId = ulPinId; Pin.Reserved = 0; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Pin, sizeof Pin, pvData, cbData, pcbDataReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsSetPinProperty * * Description: * Sets a particular property on a pin. * * Arguments: * HANDLE [in]: device handle. * DWORD [in]: property id. * DWORD [in]: pin id. * LPVOID [out]: property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsSetPinProperty" HRESULT KsSetPinProperty ( HANDLE hDevice, ULONG ulPropertyId, ULONG ulPinId, LPVOID pvData, ULONG cbData ) { KSP_PIN Pin; HRESULT hr; ULONG ulBytesReturned; Pin.Property.Set = KSPROPSETID_Pin; Pin.Property.Id = ulPropertyId; Pin.Property.Flags = KSPROPERTY_TYPE_SET; Pin.PinId = ulPinId; Pin.Reserved = 0; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &Pin, sizeof Pin, pvData, cbData, &ulBytesReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsGetNodeProperty * * Description: * Retrieves a particular property on a topology node. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * ULONG [in]: property id. * ULONG [in]: node id. * ULONG [in]: flags. * LPVOID [out]: receives property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsGetNodeProperty" HRESULT KsGetNodeProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, ULONG ulNodeId, LPVOID pvData, ULONG cbData, PULONG pcbDataReturned ) { KSNODEPROPERTY NodeProperty; HRESULT hr; NodeProperty.Property.Set = guidPropertySet; NodeProperty.Property.Id = ulPropertyId; NodeProperty.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; NodeProperty.NodeId = ulNodeId; NodeProperty.Reserved = 0; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &NodeProperty, sizeof(NodeProperty), pvData, cbData, pcbDataReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsSetNodeProperty * * Description: * Sets a particular property on a topology node. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * ULONG [in]: property id. * ULONG [in]: node id. * ULONG [in]: flags. * LPVOID [in]: property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsSetNodeProperty" HRESULT KsSetNodeProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, ULONG ulNodeId, LPVOID pvData, ULONG cbData ) { KSNODEPROPERTY NodeProperty; HRESULT hr; ULONG ulBytesReturned; NodeProperty.Property.Set = guidPropertySet; NodeProperty.Property.Id = ulPropertyId; NodeProperty.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; NodeProperty.NodeId = ulNodeId; NodeProperty.Reserved = 0; if (SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &NodeProperty, sizeof NodeProperty, pvData, cbData, &ulBytesReturned)) { hr = cbData ? S_OK : S_FALSE; } else { DWORD dwError = GetLastError(); hr = HRESULT_FROM_WIN32(dwError); } return hr; } /*************************************************************************** * * KsGetDebugNodeProperty * * Description: * Retrieves a particular property on a topology node. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * ULONG [in]: property id. * ULONG [in]: node id. * ULONG [in]: flags. * LPVOID [out]: receives property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ /* #undef DPF_FNAME #define DPF_FNAME "KsGetDebugNodeProperty" HRESULT KsGetDebugNodeProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, ULONG ulNodeId, ULONG ulDebugId, LPVOID pvData, ULONG cbData, PULONG pcbDataReturned ) { KSDEBUGNODEPROPERTY DebugNodeProperty; HRESULT hr; DebugNodeProperty.NodeProperty.Property.Set = guidPropertySet; DebugNodeProperty.NodeProperty.Property.Id = ulPropertyId; DebugNodeProperty.NodeProperty.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; DebugNodeProperty.NodeProperty.NodeId = ulNodeId; DebugNodeProperty.NodeProperty.Reserved = 0; DebugNodeProperty.DebugId = ulDebugId; DebugNodeProperty.Reserved = 0; hr = SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &DebugNodeProperty, sizeof DebugNodeProperty, pvData, cbData, pcbDataReturned); return hr; } */ /*************************************************************************** * * KsSetDebugNodeProperty * * Description: * Sets a particular property on a topology node. * * Arguments: * HANDLE [in]: device handle. * REFGUID [in]: property set id. * ULONG [in]: property id. * ULONG [in]: node id. * ULONG [in]: flags. * LPVOID [in]: property data. * DWORD [in]: size of above buffer. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ /* #undef DPF_FNAME #define DPF_FNAME "KsSetDebugNodeProperty" HRESULT KsSetDebugNodeProperty ( HANDLE hDevice, REFGUID guidPropertySet, ULONG ulPropertyId, ULONG ulNodeId, ULONG ulDebugId, LPVOID pvData, ULONG cbData ) { KSDEBUGNODEPROPERTY DebugNodeProperty; HRESULT hr; ULONG ulBytesReturned; DebugNodeProperty.NodeProperty.Property.Set = guidPropertySet; DebugNodeProperty.NodeProperty.Property.Id = ulPropertyId; DebugNodeProperty.NodeProperty.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; DebugNodeProperty.NodeProperty.NodeId = ulNodeId; DebugNodeProperty.NodeProperty.Reserved = 0; DebugNodeProperty.DebugId = ulDebugId; DebugNodeProperty.Reserved = 0; hr = SyncIoctl(hDevice, IOCTL_KS_PROPERTY, &DebugNodeProperty, sizeof DebugNodeProperty, pvData, cbData, &ulBytesReturned); return hr; } */ /*************************************************************************** * * KsSetTopologyNodeEnable * * Description: * Enables or disables a topology node. * * Arguments: * HANDLE [in]: device handle. * ULONG [in]: node id. * BOOL [in]: enable value. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsSetTopologyNodeEnable" HRESULT KsSetTopologyNodeEnable ( HANDLE hDevice, ULONG ulNodeId, BOOL fEnable ) { return KsSetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_ENABLE, ulNodeId, &fEnable, sizeof fEnable); } /*************************************************************************** * * KsGetTopologyNodeEnable * * Description: * Gets the value for the topology node's enable flag. * * Arguments: * HANDLE [in]: pin id. * ULONG [in]: node id. * PBOOL [out]: receives enable flag. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsGetTopologyNodeEnable" HRESULT KsGetTopologyNodeEnable ( HANDLE hDevice, ULONG ulNodeId, PBOOL pEnable ) { return KsGetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_ENABLE, ulNodeId, pEnable, sizeof BOOL); } /*************************************************************************** * * KsTopologyNodeReset * * Description: * Resets a topology node. * * Arguments: * HANDLE [in]: device handle. * ULONG [in]: node id. * BOOL [in]: enable value. * * Returns: * HRESULT: DirectSound/COM result code. * ***************************************************************************/ #undef DPF_FNAME #define DPF_FNAME "KsTopologyNodeReset" HRESULT KsTopologyNodeReset ( HANDLE hDevice, ULONG ulNodeId, BOOL fReset ) { return KsSetNodeProperty(hDevice, KSPROPSETID_TopologyNode, KSPROPERTY_TOPOLOGYNODE_RESET, ulNodeId, &fReset, sizeof fReset); }